初识消息队列
什么是消息队列(Message queue)?
“Message queue”是在消息的传输过程中保存消息的容器,是分布式系统中重要的组件。
简单的使用描述:当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。
当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。
使用消息队列有什么好处?
1.提高系统响应速度
使用消息队列,生产者一放,把消息往队列里一扔,就可以立马返回,响应了用户,无需等待处理结果。
例如:医院体检取化验单,可以让生产者订阅,结果下来了,直接知道结果一出来,无需通知。
2.提高系统稳定性
两个系统间紧密结合,如果有一个系统由于某些原因停止,会造成以一个系统也暂时无法使用。
例如:电商平台,电商系统发送数据给生产系统的情况,生产系统如果由于某些原因停止服务,不使用消息队列,电商系统发送不出去,用户无法进行下单操作,但是如果使用消息队列,消息队列收到消息后,会在生产系统重新服务后,停止服务这段时间的用户下的订单,还是可以通过消息队列传输给生产系统。
消息队列使用场景
一、异步处理
多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;
场景说明:新用户注册后,需要发注册邮件和验证短信。
传统的做法:
1.串行的方式
用户注册完成后,先发送注册邮件,在发送验证短信,等验证短信发送完成后才会将信息返回给客户端。
2.并行方式
用户注册完成后,注册右键及短信并行处理,等邮件和短信都处理完成后,才会将信息返回给客户端。
上面的两个方式,假设每个处理时间均为50ms,
串行需要时间:50+50+50=150ms
并行需要时间:50+50=100ms
可以看出的并行所需时间要比串行的速度提高了50ms
使用消息队列的做法:
使用消息队列后,我们将对发送消息及发送验证短信异步处理。
用户注册完成后,将消息传到消息队列后,会立即将信息返回给客户端。
二、应用解耦
多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
场景说明:电商平台,电商系统发送数据给生产系统的情况。用户下单后订单系统去通知生产系统。
传统的做法:
订单系统直接调用生产系统
如果生产系统服务停掉了,会导致用户无法进行下单操作。
使用消息队列的做法:
用户下单后,订单消息写入了消息队列,生产系统会通过订阅的模式获取订单信息。即使生产系统服务停止了,期间的用户下的订单还是存在消息队列中,等生产系统服务恢复后,生产系统从消息队列中获取停止服务期间的订单信息,这样也实现了订单系统与生产系统之间的应用解耦。
三、流量销锋
应用场景:秒杀活动,一般会因为瞬间访问量过大,导致流量暴增,相关系统无法处理请求或服务崩溃。加入消息队列后,系统可以在消息队列中获取数据,秒杀时,后入队列的用户无法秒杀到商品,这些请求直接抛弃,返回用户秒杀商品已秒杀完毕等信息,这样做了一次缓冲,极大地减少了相关系统的压力。

消息队列的两种模式
一、点对点模式(queue)
一个先进先出的消息存储区域。消息按照顺序发送接收,一旦消息被消费处理,该消息将从队列中删除。
参与的角色:
1.消息发送者(生产者):发送消息到消息队列。
2.消息接收者(消费者):从消息队列接收消息。
3.消息队列
流程:
一个生产者向一个特定的队列(queue)发送消息,一个消费者从该队列中接收消息并消费消息。消息被消费后,这个消息队列不再存储,所以消费者不能消费到已经消费的消息。其中,消息的生产者和消费者可以不同时处于运行状态。
二、发布/订阅模式(Topic)
一种支持消息多个订阅者的机制。
参与的角色:
1.发布者(Publisher):发布主题
2.订阅者(Subscriber):订阅主题
3.主题(Topic)
流程:
发布者发布一个特定的主题,并且向这个特定的主题发布消息,订阅者订阅该主题后接收该主题发送过来的消息。这种模式下发布者和订阅者彼此不知道对方,这种模式被概括为:0个/多个消费者可以获得消息在发布者和订阅者之间存在时间依赖性,即必须先订阅,再发送消息,而后接收订阅的消息,这个操作顺序必须保证。