MQ 架构与细节

MQ 是什么?

MQ:MessageQueue,消息队列的简称,用于进程间通信或同一进程的不同线程间的通信方式。

什么时候该使用MQ?

  1. 数据驱动的任务依赖
  2. 上游不关心执行结果
  3. 上游关心执行结果,但执行时间很长

MQ 是架构中常见的解耦利器:实时关注结果的用 RPC,任务依赖、上游不关心执行结果,异步执行结果返回时间很长,通常可以使用 MQ

MQ 如何做到,消息必达?

  1. 消息落地
  2. 超时,重传,确认

MQ 核心架构

MQ 消息可靠投递

消息重传可能导致收到重复的消息!

必须要保证消息幂等!

MQ 如何做到,消息幂等?

什么是幂等性?

使用同样的条件,一次请求和重复多次请求对系统资源的影响是一致的。

对技术方案的启示是: 分布式系统设计中,设计必须考虑,底层重试时(并不一定是应用层发起的,有时候是TCP 层,有时候是链接池层,有时候是框架层,这些重试,并不是应用层能够控制的),系统不会异常,数据不会不一致。

MQ 消息可靠投递,会不会有幂等性问题?

上半场幂等的关键:inner-msg-id

核心是消息去重

下半场幂等的关键:unique-biz-id

业务方通过全局唯一的业务 id 去自行保证

业务幂等性,需要 MQ 和消息接收方配合完成!

MQ 如何做到,削峰填谷?

缓冲流量:将 MQ-server 给下游推送消息,升级为由下游主动去拉取 MQ-Server 里面的消息

MQ 如何做到,消息延时?

消息延时的业务场景

场景:在一段时间之后,完成一个工作任务

核心数据结构:

  1. 环形队列 queue
  2. 任务集合 Set