当前位置: 首页 > news >正文

事业单位门户网站建设评价北京邮电大学电子工程学院研招网

事业单位门户网站建设评价,北京邮电大学电子工程学院研招网,做网站要不要学ps,晋州专业网站建设在 RabbitMQ 中,默认情况下,不能保证消息不被重复消费,但可以通过 队列绑定方式 消费者竞争机制 来确保 同一消息只被一个消费者处理。以下是几种可行的方案:方案 1:单队列 竞争消费者模式(默认行为&…

在 RabbitMQ 中,默认情况下,不能保证消息不被重复消费,但可以通过 队列绑定方式 + 消费者竞争机制 来确保 同一消息只被一个消费者处理。以下是几种可行的方案:


方案 1:单队列 + 竞争消费者模式(默认行为)

原理

  • 多个消费者订阅同一个队列,RabbitMQ 会以 轮询(Round-Robin) 方式分发消息。

  • 天然保证同一消息只被一个消费者消费(因为队列里的消息被取出后就不再存在)。

代码示例

python

# 生产者发送消息到队列
channel.basic_publish(exchange="",routing_key="single_queue",  # 直连队列(不经过 Exchange)body="message1"
)# 消费者1和消费者2竞争消费同一个队列
channel.basic_consume(queue="single_queue", on_message_callback=consumer1)
channel.basic_consume(queue="single_queue", on_message_callback=consumer2)

✅ 结果

  • message1 只会被 consumer1  consumer2 中的一个消费,不会重复。

适用场景

  • 需要 多个消费者并行处理不同消息,但 同一消息只需处理一次

  • 注意:如果消费者处理失败并 requeue,消息可能被重新投递(需额外处理,见方案3)。


方案 2:单活跃消费者(Single Active Consumer)

原理

  • RabbitMQ 3.8+ 支持 单活跃消费者模式,同一队列同一时间只有一个消费者能接收消息。

  • 其他消费者处于备份状态,主消费者断开后自动切换。

配置方式

python

channel.queue_declare(queue="sac_queue",arguments={"x-single-active-consumer": True}  # 启用单活跃消费者
)

✅ 结果

  • 即使多个消费者订阅 sac_queue,也 只有1个消费者能获取消息

适用场景

  • 需要 严格串行处理消息(如订单状态机变更)。

  • 缺点:无法利用多消费者并行提升吞吐量。


方案 3:业务幂等性(最佳实践)

原理

  • 允许消息被多次投递,但业务逻辑保证 重复消费不影响结果

  • 实现方式:

    • 数据库唯一约束(如 order_id 防重复)。

    • 乐观锁(更新前检查 version 字段)。

    • Redis 记录已处理消息ID(如 SET message_id 1 EX 3600)。

代码示例

python

def process_order(message):order_id = message.body.order_idif redis.get(f"processed:{order_id}"):  # 检查是否已处理return# 处理业务逻辑...redis.set(f"processed:{order_id}", "1", ex=3600)  # 标记已处理

✅ 优点

  • 高可用,可扩展多个消费者。

  • 兼容 RabbitMQ 默认的轮询分发机制。

适用场景

  • 高并发场景(如支付回调、库存扣减)。


方案 4:分布式锁(严格一致性)

原理

  • 消费者处理消息前,先获取 分布式锁(Redis / ZooKeeper)。

  • 确保同一时间只有一个消费者能处理消息。

代码示例

python

def callback(message):lock_key = f"lock:{message.body.order_id}"if redis.set(lock_key, "1", nx=True, ex=10):  # 尝试加锁try:process_message(message)finally:redis.delete(lock_key)  # 释放锁else:channel.reject(message.delivery_tag, requeue=True)  # 重新入队

✅ 结果

  • 同一 order_id 的消息 只会被一个消费者处理

适用场景

  • 严格避免重复消费(如金融交易)。


对比总结

方案是否严格唯一消费扩展性实现复杂度适用场景
单队列+竞争消费者✅ 是★★★默认场景,需防止 requeue
单活跃消费者✅ 是★★严格串行处理
业务幂等性❌ 否(业务防重)★★★★★★高并发系统(推荐)
分布式锁✅ 是★★★★★★金融级严格一致性

最终建议

  1. 优先使用业务幂等性(方案3),兼容高并发和故障恢复。

  2. 如果需要严格单消费者:

    • 低吞吐场景 → 单活跃消费者(方案2)。

    • 高吞吐场景 → 分布式锁(方案4)。

  3. 不要依赖 Direct Exchange 的 routing_key 来防重复,它只影响消息进入哪个队列,不影响队列内消息的分发方式。


🚀 关键结论
RabbitMQ 的 队列(Queue) 是保证消息只被一个消费者消费的关键,而不是 Exchange 类型。正确绑定队列和消费者,配合业务幂等或锁机制,即可避免重复消费。

http://www.dtcms.com/a/498181.html

相关文章:

  • 扁平式的网站wordpress 旅游足迹插件
  • 创办网站域名青海高端网站建设多少钱
  • 做公司网站的目的是什么合肥高端网站开发
  • 大气公司网站源码 企业网页模板建站 制作asp程序后台 中英文代码wordpress 媒体图片
  • 网站建设费用入账淘宝代理平台
  • 编辑网站的软件手机水土保持与生态建设网站
  • 一个网站需要多少空间内网专线和外网专线区别
  • 上海网站制作的h5技术的网站
  • 北京企业网站建设哪家好做个商城小程序需要多少钱
  • 郑州高端定制网站vs2010网站开发 SQL
  • 橙色网站后台模板jquery网站开发实例
  • 怎么做非法彩票网站吗成都网站建设哪便宜
  • 网站制作报价被哪些因素影响郑州网站开发培训价格
  • 没有主机怎么做自己的网站湖南网站备案
  • 一个网站建设初期的成本关键词筛选
  • 圣辉友联网站建设做网站是用什么语言
  • 济宁网站建设第一品牌网站app开发费用
  • 建设银行宁波分行 招聘网站google收录查询
  • 徐州教育学会网站建设手机编写html网页的软件
  • 做网站大概要多久一分钟企业宣传片怎么拍
  • 网站建设的结尾新余市建设局网站
  • 做医疗设备的网站网站制作 成都
  • 网站建设 成都如何进行网站建设
  • 网站建设费属于服务类么自己做网站需要哪些软件
  • 建设一家网站多少钱和一起做网店差不多的网站
  • 网站建设需要材料h5网站开发公司
  • 做网站游燕种子库
  • 广西高端网站建设怎么给一个网站做搜索功能
  • 网站怎样设计网址甘肃省城乡住房建设厅网站首页
  • 屏南网站建设兼职无锡互联网公司排名