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

什么是独立域名网站山东一级造价师

什么是独立域名网站,山东一级造价师,wordpress跳转站点,谷歌网站的主要内容在消息队列(MQ)中保证消息的顺序性是一个常见的需求,尤其是在需要严格按顺序处理业务逻辑的场景(例如:订单创建 → 支付 → 发货)。 一、消息顺序性被破坏的原因 生产者异步/并行发送:消息可能…

在消息队列(MQ)中保证消息的顺序性是一个常见的需求,尤其是在需要严格按顺序处理业务逻辑的场景(例如:订单创建 → 支付 → 发货)。在这里插入图片描述

一、消息顺序性被破坏的原因

  1. 生产者异步/并行发送:消息可能以不同顺序到达MQ。
  2. MQ的分区/队列机制:消息被分散到不同分区或队列,不同队列的消费速度不一致。
  3. 消费者并行消费:多个消费者实例或线程同时处理消息,导致乱序。

二、保证消息顺序性的核心方案

核心原则将需要顺序处理的消息路由到同一个队列(或分区),并由单线程顺序消费

1. 生产者保证消息路由到同一队列
  • 业务标识路由:将同一业务标识(如订单ID、用户ID)的消息通过相同的路由键(如哈希取模)发送到同一个队列。

  • Kafka:为消息指定相同的 Key,相同 Key 的消息会进入同一个分区或者发送消息时将同一业务的消息指定到同一个分区partition

//指定分区 0
kafkaTemplate.send("kafka=topic", 0, "key-001", "value-0001");//相同业务key  key-001
kafkaTemplate.send("kafka=topic", "key-001", "value-0001");
  • RocketMQ:使用 MessageQueueSelector 自定义队列选择逻辑,确保同一业务的消息进入同一队列。
SendResult sendResult = producer.send(msg, new MessageQueueSelector() {@Overridepublic MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {Integer id = (Integer) arg;int index = id % mqs.size();return mqs.get(index);}
}, orderId);
2. MQ服务端维护队列顺序
  • 分区/队列内有序:MQ需保证单个分区或队列内消息的存储和投递顺序与发送顺序一致。
  • 限制:Kafka分区、RocketMQ队列默认保证分区/队列内消息顺序。
3. 消费者单线程顺序消费
  • 单线程消费:消费者对同一队列的消息使用单线程处理,避免并发导致的乱序。
  • 示例
    • Kafka:每个分区仅由一个消费者线程处理,天生就是单线程的。
    • RocketMQ:使用 MessageListenerOrderly 监听器顺序消费。
  • 代码示例(RocketMQ消费者)
    consumer.registerMessageListener(new MessageListenerOrderly() {@Overridepublic ConsumeOrderlyStatus consumeMessage(List<MessageExt> messages, ConsumeOrderlyContext context) {// 单线程处理消息return ConsumeOrderlyStatus.SUCCESS;}
    });
    
4. 失败重试不破坏顺序
  • 顺序消费的重试机制:若某条消息消费失败,需阻塞后续消息处理,直到当前消息成功。
  • 示例:RocketMQ在顺序消费模式下,失败时会重试当前消息,后续消息需等待。

三、不同MQ的实现差异

消息队列顺序性支持关键配置
Kafka分区内顺序保证相同Key的消息发送到同一分区
RocketMQ队列内顺序保证(需使用顺序消息API)MessageListenerOrderly + 队列选择器
RabbitMQ无原生支持,需通过单队列+单消费者模拟顺序性单一队列 + 单消费者线程(synchronized

四、注意事项

  1. 性能与扩展性:顺序性会牺牲并行度,可通过增加队列/分区数量横向扩展(不同业务标识分散到不同队列)。
  2. 全局顺序性:需所有消息进入同一队列(如Kafka单分区),但会严重限制吞吐量,通常不建议。
  3. 业务设计:仅在必要场景(如订单链路)启用顺序性,其他场景尽量允许乱序。

五、总结

1. 保证消息顺序性的核心步骤:

  • . 生产者:按业务标识将消息路由到同一队列。
  • . MQ服务端:确保队列内消息存储有序。
  • . 消费者:单线程消费队列,失败时阻塞重试。
    通过合理设计业务标识和MQ配置,可以在分布式系统中高效实现局部顺序性,平衡一致性与性能。

2. 不同MQ如何选择

三种MQ相比较而言,RocketMQ更适合顺序消费的业务场景,总结如下:

  • . RabbitMQ需要设定交换机Exchange与队列Queue的绑定关系,并且一个队列只对应一个消费者Consumer才可以保证顺序消费,但是队列中的消息被消费者拉去后会从队列删除,如果消息消费失败,重试时会重新入队,消息的顺序就打乱了。
  • . Kafka虽然可以实现分区顺序消费但是在消息失败时,并不会锁住整个partition分区,该消息之后的消息还是会被消费,顺序也就打乱了,顺序消费的设计并没有RocketMQ那么完善。
  • . RocketMQ使用顺序发送,并结合队列选择器可以将同一业务消息发送到同一个队列,再结合MessageListenerOrderly监听器,保证生产者发送顺序和队列存储顺序以及消费者消费消息一致,并且消费失败时,会返回SUSPEND_CURRENT_QUEUE_A_MOMENT状态,阻塞队列一段时间(因为有队列锁),之后会从失败处开始再次消费。

RocketMQ顺序消费实现机制参考链接:https://blog.csdn.net/m0_71845127/article/details/145990210

http://www.shuangfujiaoyu.com/news/23533.html

相关文章:

  • 素材网站建设制作网站的软件有哪些
  • 青岛移动网站建设seo免费教程
  • 济南网站开发销售系统
  • 门户网站开发维护合同范本在线培训系统app
  • centos6.6做网站北京网站优化实战
  • 帮别人做app网站门户的兼职seo关键词搜索优化
  • 做网站开发的有哪些公司好重庆百度快照优化
  • 一个公司可以有两个网站吗公司建立网站的步骤
  • 网站优化内容有哪些网络优化器免费
  • 做网站前期构架图如何自己编写网站
  • 做论坛网站的应用账户竞价托管公司
  • 滨海网站建设找哪家好帮别人发广告赚钱平台
  • 个人微信公众号怎么做微网站吗海外aso优化
  • 小米网站制作百度统计数据
  • 网上如何做广告如何优化网站
  • asp.net获取网站虚拟目录品牌营销策划方案怎么做才好
  • 阆中做网站pc端百度
  • 做电影网站用什么格式好谷歌浏览器 安卓下载2023版
  • 做电影网站靠谱吗seo诊断书
  • 自己做购物网站好吗电商网站开发
  • 自己ip做网站重庆网站搜索引擎seo
  • 网站建设费能算作广告费用吗今天的新闻 联播最新消息
  • 新网站推广方法优化服务内容
  • ps做网站logo尺寸关键词优化难度分析
  • 天津 企业网站建设自助建站的优势
  • 做境外旅游的网站网络营销网站有哪些
  • 做网站简约学校网站电脑软件推广平台
  • 网站建费用软文素材库
  • 做微信商城网站哪家好一站式网站建设公司
  • 临安做网站的公司有哪些灰色词快速上排名