Skip to content

Latest commit

 

History

History
58 lines (33 loc) · 2.33 KB

File metadata and controls

58 lines (33 loc) · 2.33 KB

消息队列 Message Queue

一种用队列( FIFO )来存储消息的通信方式。

使用消息队列的目的

  • 异步
  • 解耦
  • 削峰/限流

异步

当一个操作的总耗时比较高,而其中的流程可以分割成互不相干(即对执行顺序的先后没有要求),且执行成功的结果对主流程没有影响(或有补救方案)的部分时,就可以使用异步来缩短响应时间。

比如用户的一个下单操作,可能会有以下步骤(正常应该会有更多的操作)

  1. 付款( 100 ms )
  2. 短信通知用户( 100 ms )
  3. 通知商户( 100 ms )

其实步骤 2、3并不属于主流程,只是订单结果的一个通知,并且业务对这两个步骤的时序性要求并不是那么高,即使延迟个几秒也是完全可以接受的。

这时候可以将步骤 2,3放入消息队列,对于用户来说,就可以将原先的 300 ms延迟降低到 200 ms,对于具有更多步骤的操作来说,可以降低更可观的延迟。

(异步还可以使用线程池实现)

解耦

如果模块之间不直接进行调用,模块之间耦合度就会很低,那么修改一个模块或者新增一个模块对其它模块的影响会很小,从而实现可扩展性。

通过使用消息队列,一个模块只需要向消息队列中发送消息,其它模块可以选择性地从消息队列中订阅消息从而完成调用。

使用消息队列其实还是在原有的基础上分出消息队列层,分层已成为计算机领域必不可少的解耦手段。

削峰/限流

服务器能接受的并发请求是有限的,大量的并发请求会让服务器直接瘫痪。(然而现在越来越多的流量都是这种类型,电商的秒杀,社交平台的某个热点的产生都会引发高并发量)

一种优化手段就是把请求放入消息队列中,服务器按需消费。(可能请求响应会慢一点)

消息队列会带来的问题

可用性

引入消息队列后,消息队列成了系统中服务与服务间通信的重要依靠,如果消息队列不可用,会对整个系统造成巨大影响。

这时候就需要对消息队列的可用性有更高要求,必须是集群/分布式的。

数据一致性

分布式事务

消费问题

  • 消息接受方式
  • 重复消费
  • 消息丢失
  • 消费的顺序消费