加载中...
幂等消费者是消息驱动系统中的一种设计模式。由于消息队列大多提供至少一次投递,同一条消息可能被重复投递,消费者需要保证多次处理同一消息与处理一次的结果相同,通常通过记录已处理的消息标识来去重,防止重复扣款、重复下单等副作用。

| 类型 | 消息处理模式 |
| 针对语义 | 至少一次投递 |
| 核心手段 | 消息去重 |
| 实现工具 | 唯一约束、去重表、分布式锁 |
| 常配合 | 事务性发件箱 |
幂等消费者(Idempotent Consumer)是消息驱动架构中的一种设计模式,指消息消费方在收到重复消息时,能够识别并跳过已经处理过的消息,确保业务结果不会因重复投递而被重复执行。它是保障消息系统数据正确性的关键手段。
绝大多数消息中间件为了保证不丢消息,采用至少一次(At-Least-Once)投递语义,这意味着在网络抖动、消费者崩溃重启、确认丢失等情况下,同一条消息可能被投递多次。若消费逻辑包含扣减库存、转账、发送通知等有副作用的操作,重复处理就会造成严重后果。幂等消费者正是为解决这一问题而生。
幂等消费者广泛用于订单处理、支付回调、账务变更、库存扣减等对一致性要求高的消息处理链路。它常与事务性发件箱、发布-订阅等模式配合,共同构建可靠的事件驱动系统。数据库唯一约束、Redis 的 SETNX、分布式锁都是常用的实现工具。
问:去重记录要保存多久?答:理论上要覆盖消息可能重复投递的时间窗口。实践中常结合业务时效设置过期时间或定期清理,以免去重表无限膨胀。
问:判重和业务处理不在一个事务里会怎样?答:可能出现处理成功但未记录标识,重启后重复处理;或记录了标识但业务失败,导致漏处理。因此二者最好在同一本地事务中原子提交。

| 类型 | 消息处理模式 |
| 针对语义 | 至少一次投递 |
| 核心手段 | 消息去重 |
| 实现工具 | 唯一约束、去重表、分布式锁 |
| 常配合 | 事务性发件箱 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧