RabbitMQ 幂等性

1. 什么是幂等性

幂等性,即某个操作,多次执行,对系统的影响是相同的。

如 i++,每一次调用,i 都会加 1,i 的值是不断变化的,就不是幂等的。

如数据库的 select 操作,无论执行多少次,系统中的数据都不会发生变化,就是幂等的。

在我们进行网购时,有可能一个订单会被多次发送给支付系统,那么就需要保证只扣一次费,也就需要保证系统的幂等性。

2. 幂等性的划分

一般消息中间件的消息传输保障分为:

  • At most once:最多一次,消息可能会丢失,但不会重复传输
  • At least once:最少一次,消息不会丢失,但可能会重复传输
  • Exactil once:恰好一次,每条消息仅会被传输一次

RabbitMQ 支持 At most once 和 At least once。恰好一次的实现难度较大,难以做到。

最多一次,可能会由于网络原因,导致消息丢失,在开发场景中一般不使用;

最少一次,可能会造成消息的重复接收,于是就需要针对重复收到的消息进行处理。

3. 可能会引发消息重复传输的场景

  • 当生产者给 MQ 发送消息时,MQ 已经收到消息并且返回了 ack,但由于网络等原因,生产者没有收到 ack,那么此时生产者就会再次向 MQ 发送该条消息,就造成了 MQ 收到了两条重复的消息。
  • 当 MQ 给消费者发送消息时,消费者已经成功处理了消息并返回了 ack,但由于网络等原因,MQ 没有收到 ack,于是 MQ 就会再次给消费者发送该条消息,就造成了消费者收到两条重复的消息。

4. 如何解决消息重复接收

4.1 全局唯一 ID(主要)

为每一条消息都分配一个唯一的 ID,这样消费者接收到消息时,会先判断该消息是否已经消费过了,若已经被消费,就会直接丢弃;若没有被消费,就会进行消费,并将 ID 存入 Redis(包括但不限于 Redis) 中。

这样消费者就可以根据 Redis 中是否存有接收到的消息的 ID 来判断该消息是否存储过。

4.2 业务逻辑判断

通过检查数据库中是否存在相关数据记录等操作,确保收到的消息没有执行过,然后才会进行处理。

相关推荐
万联WANFLOW5 小时前
SD-WAN 控制平面高可用怎么做?SDWAN 控制器挂了,全网会发生什么
运维·网络·分布式·架构
月落归舟14 小时前
从单机到分布式:互联网系统架构演进全流程
分布式·系统架构
搬砖柯15 小时前
系列12-接口压测怎么做成平台能力?自研 httpx 引擎、分布式 Worker 与 Locust 选型对照
分布式·测试工具·性能优化·开源·自动化·httpx
折哥的程序人生 · 物流技术专研15 小时前
Java面试通关⑭:分布式理论与架构全集
分布式·微服务·校招·分布式事务·cap·java面试·最终一致性
格子软件1 天前
2026年GEO贴牌代理:分布式多级分账状态机源码深度解构
java·vue.js·分布式·vue·geo
Evand J1 天前
【论文复现】MATLAB例程,存在测距误差的WSN无锚点分布式自定位,《WSN中存在测距误差的无锚点分布式自定位方法》
开发语言·分布式·matlab·定位·导航·wsn
格子软件1 天前
2026年分布式GEO代理流量调度:源码级状态机防重挂实战
java·vue.js·人工智能·spring boot·分布式·vue
2301_801184751 天前
kafka-zookeeper
分布式·zookeeper·kafka
大明者省2 天前
四大模态大模型训练体系全解析(架构+范式+分布式+算力成本·)
笔记·分布式·架构
格子软件2 天前
2026年分布式GEO代理架构:多租户动态数据源隔离与流控源码解构
java·vue.js·人工智能·分布式·架构·vue·geo