MQ的简单梳理
MQ
- 作用
- 场景
- 消息可靠性
- 消息顺序性
- 消息堆积
作用
集成MQ后,同步调用变成了向MQ发消息,对目标服务的调用,由同步变成了异步,实现了服务间的解耦。得益于这种异步,方法调用被封装成消息存放在MQ中,下游目标服务自行决定消费消息的速度。简言之,MQ的加入,实现了服务间的异步调用,达到解耦、削峰填谷的目的。
场景
消息可靠性
保证消息的可靠性,就要确保以下三个环节的可靠:
- 保证生产者发送消息到MQ这个过程的可靠
- 保证消息在MQ中暂存的可靠
- 保证消费消息的可靠。这里消费消息如果是push,即有MQ推消息到消费者,重试由MQ保证;如果消费消息是pull,则需要消费者自行实现重试逻辑以保证消息的可靠消费
生产者投递消息的可靠性:本地消息表+重试,RocketMq的事务消息(半消息)
MQ可靠性:中间件的高可用(持久化、多节点)
消费消息的可靠性:重试机制,超过重试阈值进入死信队列,通常存储非网络原因导致的问题消息,需要人工兜底
消息顺序性
同样,要保证生产者投递时有序,MQ保存时有序,消费者消费时有序。
单线程生产消息和单线程消费消息,MQ保存则需要一个抽象的有序容器,比如指定分区或指定消息组,保证消息不被打乱。
消息堆积
MQ的集成解耦了系统,使得我们可以定向的对指定服务进行横向扩容。如果消息存在堆积,说明消费者消费能力太低,通过在特定时期增加节点来快速消费消息。如果频繁出现消息堆积情况,一方面可以考虑长久性的增加消费节点,另一方面可以考虑调整消费的模式,比如将push模式改为消费者从MQ主动pull,由消费系统自己控制pull的频率。