一种用队列( FIFO )来存储消息的通信方式。
- 异步
- 解耦
- 削峰/限流
当一个操作的总耗时比较高,而其中的流程可以分割成互不相干(即对执行顺序的先后没有要求),且执行成功的结果对主流程没有影响(或有补救方案)的部分时,就可以使用异步来缩短响应时间。
比如用户的一个下单操作,可能会有以下步骤(正常应该会有更多的操作)
- 付款( 100 ms )
- 短信通知用户( 100 ms )
- 通知商户( 100 ms )
其实步骤 2、3并不属于主流程,只是订单结果的一个通知,并且业务对这两个步骤的时序性要求并不是那么高,即使延迟个几秒也是完全可以接受的。
这时候可以将步骤 2,3放入消息队列,对于用户来说,就可以将原先的 300 ms延迟降低到 200 ms,对于具有更多步骤的操作来说,可以降低更可观的延迟。
(异步还可以使用线程池实现)
如果模块之间不直接进行调用,模块之间耦合度就会很低,那么修改一个模块或者新增一个模块对其它模块的影响会很小,从而实现可扩展性。
通过使用消息队列,一个模块只需要向消息队列中发送消息,其它模块可以选择性地从消息队列中订阅消息从而完成调用。
使用消息队列其实还是在原有的基础上分出消息队列层,分层已成为计算机领域必不可少的解耦手段。
服务器能接受的并发请求是有限的,大量的并发请求会让服务器直接瘫痪。(然而现在越来越多的流量都是这种类型,电商的秒杀,社交平台的某个热点的产生都会引发高并发量)
一种优化手段就是把请求放入消息队列中,服务器按需消费。(可能请求响应会慢一点)
引入消息队列后,消息队列成了系统中服务与服务间通信的重要依靠,如果消息队列不可用,会对整个系统造成巨大影响。
这时候就需要对消息队列的可用性有更高要求,必须是集群/分布式的。
分布式事务
- 消息接受方式
- 重复消费
- 消息丢失
- 消费的顺序消费