知识卡片

至少一次投递要求消费者自己保证幂等

专业/工作 · 525.c.1

内容

消息代理为了保证消息不丢,通常只能承诺”至少投递一次”,做不到”恰好投递一次”——网络抖动、消费者确认消息时崩溃这类场景都可能导致同一条消息被重复投递。这意味着消费者收到重复消息是正常情况而不是异常情况,处理逻辑必须自己保证幂等:把订单状态更新成”已发货”这个操作天然幂等,执行一次和执行三次结果完全一样,所以即便消息被重复投递,代码不需要额外去重也不会出错;如果换成”给账户余额加钱”这种非幂等操作,同样的重复投递不做防护就会造成实际的资金错误。发散:这条规则和[[重试只对幂等操作安全]]是同一个判断标准在协议层的另一种呈现——不管是主动发起重试还是被动接收可能重复的投递,只要通信双方之间隔着”网络”这个不可靠的中间层,收到重复请求/消息就是必须默认要处理好的常态,而不是小概率的边缘情况。

参考来源

《Cloud Native Spring in Action》第10章《Event-driven applications and functions》