顺序消息原理|学习笔记

简介: 快速学习顺序消息原理

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)顺序消息原理】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12505


顺序消息原理

 

顺序消息的原理介绍

顺序消息处理时,入口的位置如下代码,

final long beginTimestamp = System.currentTimerMillis();

Pullcallback pullCallback = new Pullcallback(){

入口在 pullcallback ,一但拿到消息之后,有:

boolean dispatchToConsume =

processQueue.putMessage(pullResult.getMsgFoundList());DefaultMQPushconsumerImpl.this.consumeMessageService.submitConsumeRequest(

pullResult.getMsgFoundList(),

processQueue,

pullRequest.getMessageQueue(),

dispatchToConsume);

如上代码位置,将消息提交到消费者的线程去进行处理,submitConsumeRequest 有两种机制:

image.png

一种是ConsumerMessageConcurrentlyService,一种是

ConsumerMessageOrderlyService。

进入 submitConsumeRequest,

@override

public void submitConsumeRequest(

final List<MessageExt> msgs,

final ProcessQueue processQueue,

final MessageQueue messageQueue,

final boolean dispathToConsume) {

if (dispathToConsume) {

ConsumeRequest consumeRequest = new ConsumeRequest(processQueue,messageQueue);

this.consumeExecutor .submit(consumeRequest);}

}

如上代码位置,将消息提交到消费者的线程,service 在启动时里会有start方法。

public void start(){

if (MessageModel.CLUSTERING.equals(consumeMessageOrderlyService.this.defaultMQPushConsumerImpl.message())){

this.scheduledExecutorService.scheduleAtFixedRate( new Runnable() {

publie void run( ){

consumeMessageOrderlyservice.this.lockMQPeriodically();}

},initialDelay.1000 * 1,ProcessQueue .REBALANCE_LOCK_INTERVL,TimeUnit.MILLISECONDS);}}

这个 start 方法每隔多久去处理信息?

进行以下操作:

image.png点击进入后能够看到下面这行代码:

RVAL =

Long.parseLong(System.getProperty(key:”rocketmq.client.rebalance.lockInterval”, def:”20000”));

所以它会每隔20秒去执提交给它的消息。

打开run 方法,在run方法中处理,顺序消费是一定要基于锁,代码是:final Object objlock =

messageQueueLock.fetchLockObject(this.messageQueue);

synchronized(objLock){

这个锁的作用是当它在消费的时候,其他人不能消费,整个过程是同步的过程。当它拿到锁对象后,会通过 synchronized 将整个消费的过程进行同步的处理。顺序消息关键就是基于同步的方式去处理,但是真正处理业务逻辑和一般的消息没有区别,主要的区别就是加锁的设置。

以上是关于顺序消息的内容。

相关文章
|
缓存 NoSQL Java
构建高性能微服务架构:Java后端的实践之路
【5月更文挑战第5天】在当今快速迭代和高并发需求的软件开发领域,微服务架构因其灵活性、可扩展性而受到青睐。本文将深入探讨如何在Java后端环境中构建一个高性能的微服务系统,涵盖关键的设计原则、常用的框架选择以及性能优化技巧。我们将重点讨论如何通过合理的服务划分、高效的数据存储策略、智能的缓存机制以及有效的负载均衡技术来提升整体系统的响应速度和处理能力。
|
存储 XML 缓存
前端知识笔记(一)———Base64图片是什么?原理是什么?优缺点是什么?
前端知识笔记(一)———Base64图片是什么?原理是什么?优缺点是什么?
331 0
|
前端开发 JavaScript 程序员
用代码的方式,把我想说的情话呈现给你 💌
用代码的方式,把我想说的情话呈现给你 💌
167 0
|
定位技术
百度地图开发(8):地图覆盖物实现纵横交错的交通网络
百度地图开发(8):地图覆盖物实现纵横交错的交通网络
150 0
百度地图开发(8):地图覆盖物实现纵横交错的交通网络
|
算法 前端开发
前端36道高频手撕算法题(上)
前端36道高频手撕算法题(上)
前端36道高频手撕算法题(上)
|
传感器 存储 设计模式
计算机极简发展史(二)
计算机自从 20 世纪 40 年代诞生以来,一直以史无前例的进步向前发展,如果说农业革命是第一次革命、工业革命是第二次革命的话,那么第三次革命就是 信息革命。
计算机极简发展史(二)
一行SQL代码能做什么?(上)
最近在知乎上看到一个问题:一行代码可以做什么?答题者数万计,都是一些非常“高端”的操作,就在想一行SQL代码能做什么呢? SQL一行代码其实有很多很多,一些常见的比如: SELECT * FROM TableName INSERT INTO TableName VALUES(...) TRUNCATE TABLE TableName ..... 这些就没什么意思了,我们来给大家看一些比较“高级”的。
一行SQL代码能做什么?(上)
|
SQL 关系型数据库 MySQL
mysql
创建表
183 0
|
开发工具 Android开发
使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行
使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行
243 0
|
C#
在VisualStudio 工具箱中隐藏用户控件
原文:在VisualStudio 工具箱中隐藏用户控件 当我们创建一个用户控件后,VisualStudio会自动将其添加到工具箱中,本来这是一个比较贴心的设计。但是,有的时候,我们并不想将用户控件放到工具箱中。
967 0