源码分析RocketMQ顺序消息消费实现原理

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

pullRequest, offset, brokerBusy);

if (brokerBusy) {

log.info("[NOTIFYME]the first time to pull message, but pull request offset larger than broker consume offset. pullRequest: {} NewOffset:

{}", pullRequest, offset);

}

pullRequest.setLockedFirst(true);

pullRequest.setNextOffset(offset);

}

} else {

this.executePullRequestLater(pullRequest, PULL_TIME_DELAY_MILLS_WHEN_EXCEPTION);

log.info(“pull message later because not locked in broker, {}”, pullRequest);

return;

}

}

根据 PullRequest 拉取消息。如果处理队列未被锁定,则延迟拉取消息,也就说消息消费需要在ProceeQueue 队列被自己锁定的情况下才会拉取消息,否则将 PullRequest 延迟3s再拉取。并且PullRequest 的初始拉取点在拉取时只在第一次拉取时设置。

3、消息顺序消息消费


实现类:org.apache.rocketmq.client.impl.consumer.ConsumeMessageOrderlyService

3.1核心属性与构造函数

这里写图片描述

  • private final static long MAX_TIME_CONSUME_CONTINUOUSLY =

Long.parseLong(System.getProperty(“rocketmq.client.maxTimeConsumeContinuously”, “60000”));

MAX_TIME_CONSUME_CONTINUOUSLY :消费任务一次运行的最大时间。可以通过-Drocketmq.client.maxTimeConsumeContinuously来设置,默认为60s。

  • DefaultMQPushConsumerImpl defaultMQPushConsumerImpl:消息消费者实现类。

  • DefaultMQPushConsumer defaultMQPushConsumer:消息消费者。

  • MessageListenerOrderly messageListener:顺序消息消费监听器。

  • BlockingQueue< Runnable> consumeRequestQueue:消息消费任务。

  • ThreadPoolExecutor consumeExecutor:消息消费线程池。

  • String consumerGroup:消息消费组。

  • MessageQueueLock messageQueueLock:消息消费队列锁,其内如实现为:

这里写图片描述

构造方法如下:

public ConsumeMessageOrderlyService(DefaultMQPushConsumerImpl defaultMQPushConsumerImpl,

MessageListenerOrderly messageListener) {

this.defaultMQPushConsumerImpl = defaultMQPushConsumerImpl;

this.messageListener = messageListener;

this.defaultMQPushConsumer = this.defaultMQPushConsumerImpl.getDefaultMQPushConsumer();

this.consumerGroup = this.defaultMQPushConsumer.getConsumerGroup();

this.consumeRequestQueue = new LinkedBlockingQueue(); // @1

this.consumeExecutor = new ThreadPoolExecutor(

this.defaultMQPushConsumer.get(),

this.defaultMQPushConsumer.getConsumeThreadMax(),

1000 * 60,

TimeUnit.MILLISECONDS,

this.consumeRequestQueue,ConsumeThreadMin

new ThreadFactoryImpl(“ConsumeMessageThread_”)); // @2

this.scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl(“ConsumeMessageScheduledThread_”));

//@3

}

代码@1:创建任务拉取队列,注意,这里使用的是无界队列。

代码@2:创建消费者消费线程池,注意由于消息任务队列 consumeRequestQueue 使用的是无界队列,故线程池中最大线程数量取自 consumeThreadMin。

代码@3:创建调度线程,该线程主要调度定时任务,延迟

RocketMQ消费原理源码解析 PullRequestHoldService类维护了一个消息拉取请求的队列,它通过定时任务不断地从Broker拉取待消费消息队列,并将拉取到的消息队列放入到消费者的消息拉取任务中进行处理。在RocketMQ中,消息消费是一个重要的环节,本文将详细介绍RocketMQ消费原理,并通过源码解析来揭示其内部实现细节。提交消费进度:消费者在消费消息后,需要将消费进度提交给Broker,以便记录已消费消息位置。拉取消息:当消费者成功获取到待消费消息队列后,会向Broker发送拉取消息的请求,获取消息数据。 阅读详情

相关推荐

RocketMQ 源码分析 11 消息顺序消费

1、消息队列负载 RocketMQ 在同一个 JVM 进程拥有一个 clientConfigId(客户端ID),该JVM进程中不同的消息消费组的消息客户端ID相同,因为在JVM进程中对于每一个 ClientConfig 只会实例化一个 MQClientInstance。消息消费的第一个步骤是首先要为消费组内的所有消息者分配消息消费队列。RocetMQ 中通过RebalanceService线程实现...

郭传志的博客 339

RocketMQ 消费源码解读:消费过程、负载原理顺序消费原理

看完上面的源码你最少可以回答下面几个问题RocketMQ消费的流程是怎么样的为什么消费者大于queue的时候,消费者就没用了顺序消费如何保证顺序的添加消费者的时候,如何重新分配的。

小道仙的后宫 1381

RocketMQ消费顺序消费源码解析

RocketMQ对于消费者端顺序消费来说只能保证局部顺序,并不能保证全局顺序消费,局部顺序的意思就是只能对于一个mq的消息达到顺序消费,所以若是想要达到全局顺序消费的效果,对于一个topic来说可以值设置一个mq。 RocketMQ实现顺序消费原理:因为要保证一个mq的消息能够被顺序消费,第一首先这个mq的消息必须要保证不能被一个以上的消费者所消费(并发消费时如果发生mq的负载均衡就可能会产生一个mq的消息被重复消费了,并且还是乱序消费的),那么其实问题就在于消费者之间是不同的系统而产生的,按照正常的.

我神级欧文的博客 2283

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

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

55555的博客 5914

Redis高级项目实战!java串口api

纯手打“RocketMQ笔记” 第一节:RocketMQ介绍 1.1 核心概念(主题、生产者、消费者、消息) 1.2 RocketMQ的设计理念和目标(设计理念、设计目标) 第二节:RocketMQ消息的发送 2.1 单向[OneWay]发送(代码演示、Producer Group、Producer实例、Message Key、Tag) 2.2 可靠同步发送(代码演示、Message ID、SendStatus、Queue) 2.3 可靠异步发送(代码演示) 2.4 Rock

m0_57066056的博客 101

Java自学资料!Java开发者出路在哪

纯手打“RocketMQ笔记” 第一节:RocketMQ介绍 1.1 核心概念(主题、生产者、消费者、消息) 1.2 RocketMQ的设计理念和目标(设计理念、设计目标) 第二节:RocketMQ消息的发送 2.1 单向[OneWay]发送(代码演示、Producer Group、Producer实例、Message Key、Tag) 2.2 可靠同步发送(代码演示、Message ID、SendStatus、Queue) 2.3 可靠异步发送(代码演示) 2.4 Rock

m0_57286518的博客 135

RocketMQ-顺序消息Demo及实现原理分析

文章目录场景分析全局顺序消费局部顺序消费DemoProducer DemoNormal Consumer DemoOrder Consumer Demo源码分析锁定MessageQueue客户端实现broker端实现锁定ProcessQueue 场景分析 顺序消费是指消息的产生顺序消费顺序相同 假设有个下单场景,每个阶段需要发邮件通知用户订单状态变化。用户付款完成时系统给用户发送订单已付款邮件,...

hosaos的博客 1万+

这些年遇到的RocketMQ消息消费超时/消费异常重试机制导致的重复消费问题(并发消费顺序消费源码分析

图文详述并发消费模式和顺序消费RocketMQ消息消费超时、消息消费出现异常时的重试机制原理源码

健身变秃,coding变强 1万+

RocketMQ顺序消费

RocketMQ 支持两种类型的顺序消息消费:分区顺序消息(Partition Ordered Messages)和全局顺序消息(Global Ordered Messages)。这两种方式都能确保消息顺序消费,但它们的工作机制有所不同。

Lin_Miao_09的博客 3390

RocketMQ顺序消费:Demo及实现原理分析

场景分析 顺序消费:是指消息的产生顺序消费顺序相同,按照FIFO先进先出的原则严格保持一致。 假设有个下单场景,每个阶段需要发邮件通知用户订单状态变化。用户付款完成时系统给用户发送订单已付款邮件,订单已发货时给用户发送订单已发货邮件,订单完成时给用户发送订单已完成邮件。 发送邮件的操作为了不阻塞订单主流程,可以通过mq消息来解耦,下游邮件服务器收到mq消息后发送具体邮件,已付款邮件、已发...

alan_liuyue的博客 2901

惊呆:RocketMQ顺序消息,是“4把锁”实现的(顺序消费

一条订单产生的三条消息:订单创建、订单付款、订单完成。上面三消息是有序的,消费时要按照这个顺序依次消费才有意义,但是不同的订单之间这些消息是可以并行消费的。什么是顺序消息顺序消息是指对于一个指定的 Topic ,消息严格按照先进先出(FIFO)的原则进行消息发布和消费,即先发布的消息消费,后发布的消息消费。分区有序消息全局有序消息我们做一个关于顺序消费的总结:通过4把锁的机制,消息队列 messageQueue 的数据都会被消费者实例单线程的执行消费

架构师尼恩 2315

RocketMQ】【源码顺序消息实现原理

假设一个Topic分配了两个消息队列,生产者在发送消息的时候,可以对消息设置一个路由ID,比如想保证一个订单的相关消息有序,那么就使用订单ID当做路由ID,在发送消息的时候,通过订单ID对消息队列的个数取余,根据取余结果选择消息队列,这样同一个订单的数据就可以保证发送到一个消息队列中,消费者端使用`MessageListenerOrderly`处理有序消息,这就是RocketMQ的局部有序,保证消息在某个消息队列中有序。

S-H_A-N 1777

RocketMQ源码分析(三) 消费

rocketmq 推模式消费者/拉模式消费

caicongyang 1558

源码分析RocketMQ消息消费重试机制

本文主要关注业务方在消息消费失败后,返回ConsumeConcurrentlyStatus.RECONSUME_LATER,专业术语:业务方每条消息消费后要告诉MQ消费者一个结果(ack,message back),触发MQ消息消费重试机制,然后MQ消费者需要反馈给MQ(Broker) 本文主要针对的还是非顺序消息机制,顺序消息在后续专题详细分析。 代码入口:ConsumeMessageCon

中间件兴趣圈 1万+

RocketMq源码分析(九)--顺序消息

1、消息顺序消费,需要将消费主题(topic)设置成一个队列2、顺序消息消费需要经历4个步骤:消息队列负载、消息拉取、消息消费消息进度存储。

Shenkh的Java壁橱 1114

RocketMQ 源码分析 —— Message 顺序发送与消费

本文详细介绍了RocketMQ顺序消息实现机制。顺序消息要求消费顺序与生产顺序一致,适用于订单处理、数据同步等场景。RocketMQ通过"局部顺序"设计实现全局扩展性:发送端使用MessageQueueSelector确保同一业务ID消息进入同一队列;Broker端通过CommitLog和ConsumeQueue保证存储顺序消费端采用队列锁和顺序消费服务确保顺序处理。系统还包含完善的异常处理、重试机制和性能优化方案,如队列数量调优、批处理设置等,在保证顺序性的同时兼顾系统性能。典型问

油墨香^-^的博客 920
上一篇: 深入浅出 Babel 上篇:架构和原理 + 实战(1)
下一篇: 物联网云平台实战(一)-什么是物联网?(2)
2401_84048554
博客等级 码龄2年 4921粉丝 455原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值