什么是消息队列

消息队列指的是应用之间一种通讯方式,由mq消息系统确保信息的传递。

消息发布者只需要将消息发给mq,至于消费者如何处理则无需发布者操心。

同理,消息消费者也不需要操心消息是谁给的,只要从mq订阅了指定的消息,坐等消息过来即可。

什么是rabbitmq

使用erlang语言开发的,基于AMQP协议的消息队列服务。

流程逻辑

(MQ服务指:rabbitmq服务)
1、生产者和消费者各自与MQ服务建立连接;
2、生产者将消息、交换机名称和路由规则发给MQ,这时消息会到达指定的交换机上。
3、交换机根据路由规则匹配到对应的binding,然后把消息推送到指定的队列里。
4、最后MQ服务再把消息推送给消费者。
image.png

使用场景

前言技术脱离了场景就是在耍流氓,那么整理说明下为什么使用到了消息队列,以及什么时候使用。

我们现在有一个场景,当客户在外卖平台下单后,我们需要通知商家有一笔新订单,另外扫描附近的骑手推送订单,还要给客户增加商品金额对应的积分。

按照以往最常用的串行方式,我们的业务代码逻辑就应该是这样的:
image.png

这样的话,如果每个节点平均耗时1秒钟,那么生成订单后面四个节点,就需要4秒才能处理完毕。
如果这个时候并发量达到一定程度,或者使用人数很多,这种需要4秒且高耦合的结构,就非常难受。
另外,如果某一个模块发生异常
并且这个结构还有个问题,就是增加积分之后,还需要加其他的模块,那么就需要频繁去修改下单接口。

那么我们可以使用MQ来作为中间层,将下单的数据推送到消息中心,然后各模块自己干自己的活,逻辑如下:
image.png
还按照每个节点1秒钟,这样修改之后,虽然完整的时间相加多了一秒,但是对于客户来说只是两秒就反馈了。
而且后续其他扩展只需要重点盯着MQ即可。

使用MQ的另外一个好处,就是因为它支持持久化,即使消息堆积了也不怕丢失,而且它还支持事务,大大确保了消息能够被正常处理。