MQ核心功能:解耦/削峰
解耦
- 在有了 mq 后,producer 不需要过分关心 consumer 的身份信息,只需要把消息按照指定的协议投递到对应的 topic 即可
- producer 在处理请求时,只需要把消息投递到 mq 即可认为流程处理结束,相比于同步请求下游,整个流程会更加轻便灵活,拥有更高的吞吐量
- 因为有 mq 作为缓冲层. 下游 consumer 可以设定好合适的消费限流参数,按照指定的速率进行消费,能够在很大程度上对 consumer 起到保护作用
削峰
上游请求量很大,而下游都需要第一时间进行同步响应的话,这对于下游系统可能产生很大的负荷. 此时如果能把同步流程转为异步,把消息放到 mq 组件中进行一轮缓冲,让下游可以根据自身的处理能力,按照自己的节奏消化这部分积攒的流量,这对于下游系统来说能起到很好的保护作用.
MQ需要具备的基础能力
消息不丢失
mq 最基本的一项能力是,要确保整个交互流程不出现消息丢失的问题. 这里我们可以从三个环节去看待这个问题:
- producer 将 msg 投递到 mq 时不出现丢失
- msg 存放在 mq 时不出现丢失
- consumer 从 mq 消费 msg 时不出现丢失
针对于上述第二点,各 mq 组件在实现上大抵上是基于数据落盘+数据备份的方式保证的.
而针对于上述的一、三点,则是通过两个交互环节中的 ack 机制保证的. 以 producer 投递 msg 到 mq 的环节为例,只要 mq 没有给到投递成功的 ack 反馈,那么 producer 就应该把本次投递流程视为失败,执行重新投递的操作. consumer 的消费流程同样如此.
因此,mq 交互流程主要通过 ack 机制保证消息投递以及消费环节做到 at least once(至少一次)的语义,然而无法保证消息不重复的问题. 因此,处于最下游的消费者 consumer 需要能够具备消息幂等去重的能力,避免流程被重复处理.