此文章属于笔记,原属58沈剑
一、MQ消息必达,架构上的两个核心设计点:
- 消息落地
- 消息超时、重传、确认
- 四大部件:发送端 接收端 服务端 固化存储组成
二、上半场消息必达以及消息重复问题
- 上半场的流程
- 发送端MQ-client 将消息发送给服务端MQ-server
- 服务端MQ-server将消息落地
- 服务端MQ-server 回ACK(表示确认) 2.如果3丢失 发送端在超时后,又会发送一遍,此时重发是MQ-client发起的,消息处理的是MQ-server 为了避免2 重复落地,对每条MQ消息系统内部需要生成一个inner-msg-id,作为去重和幂等的依据,这个内部消息ID 的特点是
- 全局唯一
- MQ生成,具备业务无关性,对消息发送方和消息接收
三、下半场的消息必达以及消息重复问题
- 下半场的流程
- 服务端将消息发给MQ-client
- MQ-client将消息消费 并通知MQ-server
- MQ-server 落地消息删除
- 需要强调的是,接收端MQ-client回ACK消息是MQ-client主动发起的,因为MQ-server不知道接收端何时消费完。 3.如果5丢失,那么在超时后MQ-server会重新发送消息,此时可能导致MQ-client收到重复消息,为了保证业务的幂等性,业务消息中,必须有一个biz-id,作为去重的依据,这个业务ID的特性是
- 对于同一个业务场景,全局唯一
- 由业务消息发送方生成,业务相关
- 由业务消费方消费判断重复问题,以保证幂等
四、总结
MQ为了保证消息必达,消息上下半场均可能发送重复消息,如何保证消息的幂等性呢
- 上半场,MQ-server生成inner-msg-id,保证上半场幂等 此ID全局唯一,业务无关,由MQ保证,对上下MQ-client屏蔽
- 下半场,由发送方带入biz-id 业务方接受并判断重复问题,保证幂等,这个ID对单业务唯一,业务相关,对MQ透明 结论 幂等性,不仅对MQ有要求,对业务上下游也有要求
时间: 2024-10-05 02:57:44