rocketmq如何保证顺序消费

相当通俗易懂的RocketMQ顺序消息 其实顺序消息是业务中常用的功能之一,只要是使用MQ的,就不太可能绕的过去这个问题。就算是业务上不需要保证顺序消息,但是作为开发,作为码农,怎么着都要跟你的PM确认一下需求的啦,那肯定就会聊到MQ的顺序消息的啦!举一个简单的例子,咱们就不说老生常谈的购物交易系统,订单系统之类的,就比如数据库的BinLog消息,数据库执行新增,修改,删除语句,那BinLog记录的也必须是新增,修改,删除语句,这个很好理解吧。那话不多说,咱们直接开整~ 阅读详情

1、方案一
很简单,问题产生的关键在于多个队列都有消息,我消费的时候又不知道哪个队列的消息是最新的。那么思路就有了,发消息的时候你要想保证有序性的话,就都给我发到一个queue上,然后消费的时候因为只有那一个queue上有消息且queue是FIFO,先进先出,所以正常消费就完了。

很完美。而且RocketMQ也给我们提供了这种发消息的时候选择queue的api(MessageQueueSelector)。直接上

代码
import java.util.List;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;

/**
 * 消息发送者
 */
public class Producer5 {
    public static void main(String[] args)throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("my-order-producer");
        producer.setNamesrvAddr("124.57.180.156:9876");     
        producer.start();
        for (int i = 0; i < 5; i++) {
            Message message = new Message("orderTopic", ("hello!" + i).getBytes());
            producer.send(
                    // 要发的那条消息
                    message,
                    // queue 选择器 ,向 topic中的哪个queue去写消息
                    new MessageQueueSelector() {
                        // 手动 选择一个queue
                        @Override
                        public MessageQueue select(
                                // 当前topic 里面包含的所有queue
                                List<MessageQueue> mqs, 
                                // 具体要发的那条消息
                                Message msg,
                                // 对应到 send() 里的 args,也就是2000前面的那个0
                                // 实际业务中可以把0换成实际业务系统的主键,比如订单号啥的,然后这里做hash进行选择queue等。能做的事情很多,我这里做演示就用第一个queue,所以不用arg。
                                Object arg) {
                            // 向固定的一个queue里写消息,比如这里就是向第一个queue里写消息
                            MessageQueue queue = mqs.get(0);
                            // 选好的queue
                            return queue;
                        }
                    },
                    // 自定义参数:0
                    // 2000代表2000毫秒超时时间
                    0, 2000);
        }
    }
}

2.2、消费者

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.*;
import org.apache.rocketmq.common.message.MessageExt;

import java.util.List;

/**
 * Description:
 *
 * @author TongWei.Chen 2020-06-22 11:17:47
 */
public class ConsumerOrder {
    public static void main(String[] args) throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("my-consumer");
        consumer.setNamesrvAddr("124.57.180.156:9876");
        consumer.subscribe("orderTopic", "*");
        consumer.registerMessageListener(new MessageListenerOrderly() {
            @Override
            public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
                for (MessageExt msg : msgs) {
                    System.out.println(new String(msg.getBody()) + " Thread:" + Thread.currentThread().getName() + " queueid:" + msg.getQueueId());
                }
                return ConsumeOrderlyStatus.SUCCESS;
            }
        });

        consumer.start();
        System.out.println("Consumer start...");
    }
}

2.3、输出结果
C

onsumer start...
hello!0 Thread:ConsumeMessageThread_1 queueid:0
hello!1 Thread:ConsumeMessageThread_1 queueid:0
hello!2 Thread:ConsumeMessageThread_1 queueid:0
hello!3 Thread:ConsumeMessageThread_1 queueid:0
hello!4 Thread:ConsumeMessageThread_1 queueid:0

3、情况二
比如你新需求:把未支付的订单都放到queue1里,已支付的订单都放到queue2里,支付异常的订单都放到queue3里,然后你消费的时候要保证每个queue是有序的,不能消费queue1一条直接跑到queue2去了,要逐个queue去消费。

这时候思路是发消息的时候利用自定义参数arg,消息体里肯定包含支付状态,判断是未支付的则选择queue1,以此类推。这样就保证了每个queue里只包含同等状态的消息。那么消费者目前是多线程消费的,肯定乱序。三个queue随机消费。解决方案更简单,直接将消费端的线程数改为1个,这样队列是FIFO,他就逐个消费了。RocketMQ也为我们提供了这样的api,如下两句:

// 最大线程数1
consumer.setConsumeThreadMax(1);
// 最小线程数
consumer.setConsumeThreadMin(1);
RocketMq顺序消息 rocketmq 运维1.RocketMq 架构图2.RocketMq顺序消息2.1部分消息有序2.1.1 生产者构建2.1.2 生产者保证有序2.1.3 消费者保证有序性问题1.MessagingException: sendDefaultImpl call timeout 1.RocketMq 架构图 2.RocketMq顺序消息 顺序消息分为全局有序消息和部分有序消息,全局有序消息是指一个topic下所有的消息都是有序的,而部分有序消息是指同一类型的消息有序,举个例子,如订单创建、订单支付、订单完成 阅读详情

相关推荐

RocketMQ 保证消息顺序消费

保证RocketMQ消息顺序消费的关键主要有以下几点: 保证生产者消费者用同一topic 保证生产者消费者用同一topic下的同一个queue(默认一个topic下有4个queue) 发消息的时候用一个线程去发送消息 消费的时候 只用一个线程去消费一个queue里的消息(默认MessageListenerConcurrently使用20个线程去消费处理消息 )或者使用MessageListenerOrderly 如果多个queue都有消息,只能保证每个单个queue里的消费是顺序的

phs999的博客 2238

RocketMQ(九)RocketMQ顺序消息

目录 一、什么是顺序消息? 二、顺序消息的原理 三、全局顺序消息 四、局部顺序消息 五、顺序消息缺陷 一、什么是顺序消息? 消息有序指的是,消费者端消费消息时,需按照消息的发送顺序来消费,即先发送的消息,需要先消费(FIFO)。 举个容易理解的例子:通常创建订单后,会经历一系列的操作:【订单创建 -> 订单支付 -> 订单发货 -> 订单配送 -> 订单完成】。在创建完订单后,会发送五条消息到MQ Broker中,消费的时候要按照【订单创建 -> 订单支付 -&

weixiaohuai的博客 8030

.ipynb文件深度解析:从JSON结构到Jupyter Notebook高效使用指南

在Python开发与数据处理领域,交互式编程正成为探索数据与验证思路的高效方式。Jupyter Notebook作为最流行的交互式环境之一,其默认文件格式.ipynb本质是一个基于JSON的文本文件,内部通过单元格组织代码、说明文字与运行结果。理解其JSON结构,不仅有助于掌握Notebook的存储原理,更能为文件损坏修复、版本控制与自动化转换提供基础。依托对单元格类型、魔法命令及输出可视化的熟练运用,数据分析和数据可视化流程可以变得更为流畅。同时,借助VS Code、nbconvert等工具,开发者能将.

weixin_28839629的博客 354

精讲RocketMQ顺序消息原理以及代码

编程界的小学生一、顺序消息解释1、概述2、图解3、再次分析二、解决方案1、方案一2、代码一2.1、生产者2.2、消费者2.3、输出结果3、情况二 一、顺序消息解释 1、概述 RocketMQ的消息是存储到Topic的queue里面的,queue本身是FIFO(First Int First Out)先进先出队列。所以单个queue是可以保证有序性的。但是问题是1个topic有N个queue,作者这么设计的好处也很明显,天然支持集群和负载均衡的特性,将海量数据均匀分配到各个queue上,你发了10条消息到同一

【原】编程界的小学生 1054

利用 Docker Distribution 搭建私有的 Docker Registry

1、拓扑

weixin_44983653的博客 1068

AI Agent实战:WorkBuddy安装部署、任务执行与模型接入全教程

AI Agent是当前自动化办公与智能工作流的核心技术,它区别于传统问答式AI,能够理解目标、拆解任务并调用工具交付完整成果。其底层原理基于任务规划、工具调用与结果验证的循环机制,让机器从“提供建议”进化为“完成任务”。在工程实践中,合理配置模型服务(如接入DeepSeek)、设计标准化Skill(技能包)与自定义指令,可以显著提升Agent在报告生成、数据分析、竞品调研等场景中的稳定性与效率。WorkBuddy作为典型的任务式AI工作台,为运营、产品、开发等多角色提供了统一入口,覆盖安装部署、任务描述公式

weixin_26712075的博客 291

RocketMQ的顺序消息(顺序消费)

简单介绍了消息有序性的概念,以及RocketMQ如何实现消息的顺序消费。

终生学习践行者 4万+

26、电子测量与旋转编码器控制技术解析

本文深入解析了电子测量中的电感测量技术与旋转编码器的控制方法。介绍了LC电路振荡原理、滤波器类型及其应用,并通过代码实现了基于脉冲宽度的电感值计算。对比了陶瓷电容与电解电容在高频测量中的性能差异。在旋转编码器部分,详细阐述了其工作原理,提出了抖动问题和检测遗漏的解决方案,包括中断检测法和基于4位状态映射的高精度控制方法。文章还探讨了相关技术在电力系统、通信设备、工业自动化和智能家居中的应用,并展望了高精度、智能化、小型化和无线化的发展趋势,为电子系统设计提供了实用指导和技术参考。

elastic6hunter的博客 101

RocketMQ结合实际场景顺序消费,它是如何保证顺序消费的?

为了保证消息的顺序性,我们必须保证同一个消息队列在同一时刻只能被消费者组内一个消费者消费,从负载均衡方面,向Broker发起锁定该消息队列的请求,上锁成功则新建一个拉取任务PullRequest,从消息消费方面,批量拉取消息成功后,进行提交消费请求,消息提交到内部的线程池,为了保证消息的顺序性,我们必须为消费队列上锁,来保证同一时刻消费队列只会被线程池中的一个线程消费。

weixin_74412978的博客 1341

2026国内Claude Code保姆级教程:安装、避坑、防串台全优化

安装 Claude Code CLI + 切换 npm 国内镜像优先配置固定关闭:自动联网、自动项目扫描VSCode 内置终端直接用,不装多余插件会话隔离+指令约束,彻底解决 Rust、小程序 跨语言串台。

lpfasd123的博客 2569

零基础教你学RDMA驱动开发:从入门到精通--第6章 内存管理与DMA映射​6.2 DMA地址转换:内核dma_map_single()与硬件IOVA(I/O虚拟地址)​

本文深入探讨RDMA驱动中DMA地址转换机制,重点分析内核dma_map_single()函数与硬件IOVA的作用。主要内容包括:1)DMA地址转换的必要性,解决CPU虚拟地址与HCA设备DMA地址的空间割裂问题;2)内核DMA映射机制实现原理,涵盖无IOMMU(直接物理地址映射)和有IOMMU(IOVA转换)两种场景;3)硬件IOVA的工作流程及其与RDMA内存注册的结合;4)RDMA驱动开发中的关键问题,如缓存一致性、映射方向错误、IOVA泄漏等;5)以mlx5驱动为例的实践分析。文章强调DMA地址转换

xiaoheshang_123的博客 241

Kafka/RocketMQ 多线程消费时如何保证消费顺序?

之前在讨论顺序消息的一些知识,看到有个读者的留言如下: 这个问题问得非常棒,由于在之前的文章中并没有提及到,因此我在这篇文章中单独讲解,本文将从消费顺序性这个问题出发,深度剖析 Kafka/RocketMQ 消费线程模型。 Kafka kafka 的消费类 KafkaConsumer 是非线程安全的,因此用户无法在多线程中共享一个 KafkaConsumer 实例,且 KafkaConsumer 本身并没有实现多线程消费逻辑,如需多线程消费,还需要用户自行实现,在这里我会讲到 Kafka 两种多线程消费模

weixin_47082274的博客 4366

HTML5+CSS3+JS小实例:焦点图波浪切换动画特效

实例:焦点图波浪切换动画特效。字体图标库:Font Awesome。技术栈:HTML+CSS+JS。

艾恩小灰灰的博客 909

rocketmq怎么保证队列完全顺序消费?

消息有序指的是可以按照消息的发送顺序来消费。 RocketMQ可以严格的保证消息有序。但这个顺序,不是全局顺序,只是分区(queue)顺序。要全局顺序只能一个分区。 之所以出现你这个场景看起来不是顺序的,是因为发送消息的时候,消息发送默认是会采用轮询的方式发送到不通的queue(分区)。如图: 而消费端消费的时候,是会分配到多个queue的,多个queue是同时拉取提交消费。如图: ...

longzhongxiaoniao的博客 1万+

YOLOv5_DeepSORT_Pytorch训练自己的多目标跟踪模型

1 准备 环境配置:https://blog.youkuaiyun.com/weixin_50008473/article/details/115250986?spm=1001.2014.3001.5501 YOLOv5_DeepSORT_Pytorch代码地址: https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch DeepSORT论文:https://arxiv.org/pdf/1703.07402.pdf 2 训练目标检测模型 训练自己的目标检测模

weixin_50008473的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

rocketmq保证顺序消费

资料参考java技术 最近在公司用到的rocketmq中间件,需要放入操作日志类的消息,供消费者处理并执行,一般来说,操作日志类的消息对于同一个主体来说具有顺序行,例如先增加,后修改,再删除,这个消息到达中间件,还有消费者消费时的顺序都是需要严格保证的,不然就会引起数据错乱,于是这时候就需要保证消息的顺序性,我们先来看看rocketmq在不做顺序性处理时为什么会没有顺序性。 rocketmq生产者发送消息的时候,消息发送默认是会采用轮询的方式发送到不通的queue(分区)。如图: 而消费端消费的时候,是会

隐0士的博客 684

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RocketMQ快速入门:如何保证消息顺序消费,附带源码分析(八)

顺序消息在金融、电商等场景中被广泛应用,只要业务需求对流程顺序性有严格要求,就有顺序消息的应用之地。因此理解顺序消息的原理和实现路径,是我们学习rocketmq的必经之路。

55555的博客 5962

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

如何保证rocketmq消费顺序

如何保证rocketmq消费顺序 问题 : 我们知道消息队列可以在高并发的情况下,实现 削峰填谷,以及可以 异步解偶。但是某些业务场景下,我们需要保证消息是严格按照一定顺序去消费的,这时候我们要怎么办?以rocketmq为例。 我们知道 ,消息从producer发送到broker队列中 ,一般是轮训发送到多个broker中的,而consumer消费拉取的时候一般都是...

taoshengxiashu01的博客 3540

RocketMQ如何保证消息的顺序消费?

顺序消息消费者:RocketMQ 提供了特殊的消费者类型,即顺序消息消费者(Orderly Message Consumer)。顺序消息消费者通过指定消费模式为 Orderly,来保证消息按照发生顺序进行消费。Orderly 模式下,RocketMQ 会将同一个消息队列中的消息按照顺序分发给同一个消费者线程,确保消息的顺序性。单队列顺序消费:在某些场景下,一个 Topic 只有一个消息队列,这时消息的顺序消费就是天然的。消费者按顺序从该队列中拉取消息进行消费,因此可以保证消息的顺序性。

学亮编程手记 1217

kafka的消费顺序_Kafka/RocketMQ 多线程消费时如何保证消费顺序?

上两篇文章都在讨论顺序消息的一些知识,看到有个读者的留言如下:这个问题问得非常棒,由于在之前的文章中并没有提及到,因此我在这篇文章中单独讲解,本文将从消费顺序性这个问题出发,深度剖析 Kafka/RocketMQ 消费线程模型。Kafkakafka 的消费类 KafkaConsumer 是非线程安全的,因此用户无法在多线程中共享一个 KafkaConsumer 实例,且 KafkaConsumer...

weixin_33872754的博客 715

rocketmq怎么保证队列完全顺序消费

原文:https://www.zhihu.com/question/30195969实际上,RocketMQ是支持顺序消费的。但这个顺序,不是全局顺序,只是分区顺序。要全局顺序只能一个分区。之所以出现你这个场景看起来不是顺序的,是因为发送消息的时候,消息发送默认是会采用轮询的方式发送到不通的queue(分区)。如图:而消费端消费的时候,是会分配到多个queue的,多个queue是同时拉取提交消费。...

notOnlyRush的博客 8867

RocketMQ-如何保证消息顺序消费

1.实现顺序消费     RocketMQ支持局部顺序消费,但不支持全局,换句话说针对Topic中的每个queue是可以按照FIFO进行消费。     要保证一个订单有关的消息顺序消费,有两点需要注意,一是将订单有关的消息发送到相关Topic中同一个queue里,二是消费者按照先进先出的原则进行消费。 2.消息发送到指定queue中     在消息发送时,需指定对应的MessageQueueSelector,此时我们只需通过订单号与queue进行关联,代码如下。send中的参数arg即为select中

yanwendonge的博客 8580

Kafka、RocketMQ、RabbitMQ如何保证消息的顺序消费?

全局有序是一个topic下的所有消息都要保证顺序,如果要保证消息全局顺序消费,可以将该主题的队列数设置为1,牺牲高可用性。局部有序是指保证同一个消息队列上的消息顺序消费。RabbitMQ没有属性设置消息的顺序性,所以在没有前提的情况下说 RabbitMQ消息的消费具有顺序性是错误的。二、生产者在发送消息的时候指定要发送到哪个 Partition,这样同一个 Partition 的数据会被同一个消费者消费,从而保证了消息的消费顺序。一、局部顺序消息消费,也就是保证同一个消息队列上的消息顺序消费;

学亮编程手记 2413
上一篇: zxing介绍生成二维码
下一篇: MYBATIS-PLUS性能分析插件—PERFORMANCEINTERCEPTOR
yonhu123java
博客等级 码龄14年 6粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值