三种:
-
at-least-once 至少一次
没收到确认消息就重试,需要consumer自己保证幂等 -
at-most-once 最多一次
不重试 - exactly-once
上半场幂等
Client -> MQ-Server -> DB ->(插入确认ACK) Client
- 问题:若Client没收到确认,会认为没有插入成功,会重发给MQ-Server
- 分析:MQ-Server收到msg需要确认是否已经插入
- 解决:为MQ-Server生成id
(1) 全局唯一
(2) MQ生成,对发送接收方屏蔽
下半场幂等
MQ-Server -> Client -> (确认消费成功) -> MQ-Server -> DB
- 问题:若MQ-Server没有收到确认消费成功,会认为没有消费,会重发给Client,导致重复消费
- 分析:Client收到msg需要确认是否已经消费
- 解决:业务id
(1) 对同一业务场景,全局唯一
(2) 消息发送方生成,对MQ透明
例子:支付ID,订单ID,帖子ID等。
网友评论