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

RabbitMQ 之顺序性保障

1. 为什么要保障顺序性

现有下面一个场景:

用户需要改用户名,但是他连续改了两次,第一次将用户名修改为 aaa,第二次将用户名修改为 bbb,那么最终的用户名应该是 bbb。

生产者按顺序发送两条修改用户名请求时,若当消费者在接收消息时,没有按照发送的顺序进行消费,即先消费的是 bbb,再消费的是 aaa,那么最终的用户名就是 aaa,这与用户的预期不符。这就体现了消息顺序性的重要性。

2. 会打破顺序性的情况

在没有网络故障、消息丢失的情况下,只有一个生产者与一个消费者时,RabbitMQ 可以保证消息的顺序性,当出现下列情况时,RabbitMQ 就无法保证消息的顺序性:

  • 有多个生产者时,RabbitMQ 就无法保证消息到达服务器的顺序,也就无法保证消息被消费的顺序
  • 有多个消费者时,不同的消费者处理消息的效率可能不同,那么当消息1发送给消费者1,消息2发送给消费者2,消息1需要在消息2之前被消费,若消费者2消费消息的效率大于消费者1,那么消息2就会先被处理完,也就打破了消息的顺序性
  • 若服务器给消费者发送的 ack 丢失或消费者给服务器发送的 ack 丢失,就会导致消息的重新发送,也就不能保证消息的顺序性
  • 当一组需要保证顺序性的消息被路由到不同的交换机上时,由于不同的队列消费速度不同,那么就无法保证消息被消费的顺序性
  • 当消息进入死信队列后,也就无法保证消息被消费的顺序与生产者发送的顺序相同

3. 如何保证消息的顺序性

  • 使用一个队列与一个消费者:一个队列就可以保证消息的先进先出,进而保证消费者消费消息的顺序
  • 分区消费:将一组需要保证顺序性的消息全部放入一个队列中,并使用一个消费者进行消费,这就与第一种方法相同
  • 手动确认:当消息消费结束后,向服务器发送 ack,服务器接收到消息后才会继续发送下一条消息,也就能保证消费者消费消息的顺序性
  • 业务逻辑控制:可以在消息中加入 id 属性,即使消费者接收到的消息不是按照发送顺序的,也可以根据 id 进行排序,也就能保证消费者按照顺序进行消费
http://www.xdnf.cn/news/15263.html

相关文章:

  • 从零实现一个GPT 【React + Express】--- 【4】实现文生图的功能
  • uniapp-在windows上IOS真机运行(含开发证书申请流程)
  • 重振索尼复古微型电脑——计划以OrangePi CM5 作为主板升级
  • uniapp小程序tabbar跳转拦截与弹窗控制
  • 学习笔记(34):matplotlib绘制图表-房价数据分析与可视化
  • 【数据结构与算法】203.移除链表元素(LeetCode)图文详解
  • 05 唤醒词检测:让语音助手随时待命
  • 平板柔光屏与镜面屏的区别有哪些?技术原理与适用场景全解析
  • Kotlin 常用语法糖完整整理
  • 如何准确查看服务器网络的利用率?
  • 云防火墙有什么用?
  • SoC程序如何使用单例模式运行
  • 企业网络安全的“金字塔”策略:构建全方位防护体系的核心思路
  • OSCP官方靶场-Solstice WP
  • AI驱动的业务系统智能化转型:从静态配置到动态认知的范式革命
  • 【办公类-107-01】20250710视频慢速与视频截图
  • mysql join语句、全表扫描 执行优化与访问冷数据对内存命中率的影响
  • MySQL索引:数据库的超级目录
  • 第35周—————糖尿病预测模型优化探索
  • Android 插件化实现原理详解
  • Apache Dubbo实战:JavaSDK使用
  • 动态物体滤除算法
  • MyBatis-Plus 中使用 Wrapper 自定义 SQL
  • Linux C 文件基本操作
  • 【oscp】超长攻击链vulhub靶机,TommyBoy1dot0
  • 登录为图片验证时,selenium通过token直接进入页面操作
  • ResolvableType 解密Java泛型反射
  • 【会员专享数据】2013-2024年我国省市县三级逐月SO₂数值数据(Shp/Excel格式)
  • 深入拆解Spring核心思想之一:IoC
  • 北京-4年功能测试2年空窗-报培训班学测开-第四十七天