今年疫情严峻,希望早日控制住,有不少的朋友都打算年后找份新的工作,正好趁着这个时候好好学习,提升下自己。今天我们来聊一聊消息队列的作用。消息队列,相信大家都不陌生,Kafka、RMQ都是大家常用的队列,也是程序员面试中的一个常见的题目。
进行削峰,减少并发
数据在后台各个系统中流转就跟流水线上的工人一样,如果前面的工人干得非常快,那么工作就会不停地堆积,很多零件就堆积着等着下面的工人解决。如果请求一直堆积着得不到处理,用户就只能够一直等待,会有不好的体验,同时,因为任务堆积,总是需要占用内存、连接数等资源,就容易引发服务雪崩。所以,对一些实时性要求不高的请求,我们通常可以采用异步进行削峰。一个常见的例子,在电商系统中,当用户下单并完成支付的时候,我们通常会去通知商家的后台,告诉他们可以发货了。但是不同的商家的技术良莠不齐,有些速度真是跟蜗牛一样,这个时候我们这可以采用异步的方式,使用消息队列,慢慢地进行通知。
系统解耦
当我们开始开发一个系统的时候,逻辑总是比较清晰跟简单,随着需求的迭代,我们会发现系统越来越复杂,如果开发的程序员能力不足的话,我们会发现系统会越来越混乱,最后甚至出现一个方法几千行代码的情况,那么对于一个越来越复杂地系统,我们怎么进行系统的解耦呢?
在一个电商系统中,当我们完成一次交易的时候,远远没有想象中那么地简单,我们通常需要通知仓库或者通知商家,让他们接受订单,尽快发货。同时,我们可能要通知积分系统,给用户下发一定的交易积分。可能这个用户是通过分销过来购买的,需要通知分销系统,创建分销订单,以便后面的结算。一次简单的交易过后,我们可能要同时数十个系统,像阿里巴巴的天猫淘宝,可能完成一次交易,甚至要通知100个系统。如果我们在我们的交易流程里面,逐个系统逐渐通知,那么必然会带来系统缓慢的问题,所以我们可以使用消息队列,每次交易成功后发布一条消息,让其他系统去订阅这条消息。就可以做到系统的解耦了。
延迟处理
在程序设计中,延迟任务也是常有的事情。例如用户创建一次订单之后,可能没有支付。我们可以在创建订单25分钟之后去提醒用户,告诉他有笔订单未支付,万一用户支付了。岂不是美滋滋。一些消息队列提供了延迟队列功能,例如RabbitMQ,我们可以利用其延迟的特性,非常简单地实现这个功能。当然,我们也可以使用其他方法,例如每一分钟扫描一次数据库等等。欢迎大家关注我,共同学习,共同进步。大家的支持是我继续唠嗑的动力。