rocketmq新扩容的broker没有tps_深入研究RocketMQ消费者是如何获取消息的

前言

小伙伴们,国庆都过的开心吗?国庆后的第一个工作日是不是很多小伙伴还沉浸在假期的心情中,没有工作状态呢?

那王子今天和大家聊一聊RocketMQ的消费者是如何获取消息的,通过学习知识来找回状态吧。

废话不多说,我们开始吧。

消费者组

首先我们了解一个概念,什么是消费者组

消费者组你就可以把它理解为,给一组消费者起一个名字。

假设我们有一个订单Topic名字是OrderTopic,然后库存系统和积分系统都要消费这个Topic中的数据,我们分别给库存系统和积分系统起一个消费组名字:stock_consumer_group、score_consumer_group。

设置消费者组名字是在代码中实现的,如下:

 DefaultMQPushConsumer consumer = 
         new DefaultMQPushConsumer("stock_consumer_group");

比如我们的库存系统提供了2台机器,每台机器上的消费者组名字都是stock_consumer_group,那么这2台机器就是一个消费者组。

fa99e0427e91f50b02270073e6377b77.png

大体结构如上图所示,那么当订单系统发送消息到OrderTopic中后,库存系统和积分系统是如何进行消费的呢?

默认情况下,这条消息发送到Broker后,库存系统和积分系统都会拉取这条消息,而且库存系统的两台机器中只有一台会消费到这条消息,积分系统也一样。

这就是消费组的概念,不同的系统设置不同的消费组,如果不同的消费组订阅了同一个Topic,那么对于Topic中的一条消息,每个消费组都会获取到这条消息。

集群模式和广播模式

接下来我们思考一个问题,对于消费者组而言,当它获取到一条消息后,假设消费者组内有多台机器,那么到底是只有一台机器获取到消息,还是所有机器都获取到消息呢?

这其实是消费的两种模式,集群模式和广播模式

默认情况下我们都是使用的集群模式,也就是说消费者组收到消息后,只有其中的一台机器会接收到消息。

我们可以手动指定为广播模式。

consumer.setMessageModel(MessageModel.BROADCASTING)

指定为广播模式后,消费者组内的每台机器都会收到这条消息。

具体要根据业务场景选择消费模式。

MessageQueue与消费者的关系

接着我们想一下,对于一个Topic下的多个MessageQueue,消费者组中的多台机器是如何消费的呢?

这部分内容底层实现是很复杂的,我们可以简单的理解为它会均匀的将多个MessageQueue分配给消费者组中的多台机器消费。

举个例子,假如我们的OrderTopic有四个MessageQueue,这4个MessageQueue分布在两台MasterBroker上,每个MasterBroker上有两个MessageQueue。

然后库存系统作为一个消费者组有两台机器,那么最好的分配方式就是每台消费者机器负责两个MessageQueue,这样就实现了机器的负载消费,示意图如下:

fd6558e1b76ae0293933b5fcbc407b6d.png

所以我们可以大致的认为,一个Topic中的多个MessageQueue会被均匀的分布给一个消费者组中的多台机器进行消费,这里要注意一点,一个MessageQueue只能被一台消费者机器消费,但是一台消费者机器可以同时负责处理多个MessageQueue。

那么当消费者组中的机器数量发生变化时,是怎么处理的。

机器数量发生变化一般就两种情况,一种是有机器宕机了,另一种是增加机器进行集群扩容了。

其实这种情况下是会进行rebalance环节的,也就是会重新分配每个消费者机器要处理的MessageQueue。

Push模式和Pull模式

不知道小伙伴们还记不记得,在之前的文章RocketMQ的发送模式和消费模式中,我们已经用代码说明了消费者的两种消费模式:Push和Pull,当时只提供了Push消费的代码,而没有提供Pull消费的代码。

其实这两种模式本质上是一样的,都是消费者主动发出请求到Broker上拉取消息。

Push模式的底层也是通过消费者主动拉取的方式来实现的,只不过它的名字叫Push而已,意思是Broker尽可能实时的推送消息给消费者。

我们一般在使用RocketMQ的时候,消费模式基本都是使用的Push模式,因为Pull模式真的使用起来代码特别复杂,而且Push模式的底层还是Pull模式,只是对时效性有了更好的支持。

Push模式大体实现思路是这样的:当消费者发送请求到Broker拉取消息的时候,如果有新的消息可以消费,会立马返回消息到消费者进行消费,消费后会接着发送请求到Broker拉取消息。

也就说Push模式下,处理完一批消息后会理解再发送请求给Broker拉取下一批消息,所以时效性更好,看起来就像是Broker在实时推送消息。

当请求发送到Broker发现没有需要消费的消息时,就会让请求线程挂起,默认挂起15秒,然后会有另一个后台线程每隔一段时间判断一下是否有新消息需要消费,一旦发现了新的消息,就会去唤醒挂起的线程,将消息返回给消费者进行消费,然后消费完毕再次发送请求拉取消息。

这一部分的源码实现是很复杂的,我们只要了解它的核心思路就可以了。就算是Push模式,本质上也是对Pull模式的一种封装

Broker如何读取消息返回给消费者

接下来我们来聊聊Broker是如何读取消息返回给消费者的。之前的文章深入研究Broker是如何持久化的中我们已经知道了Broker是如何持久化消息的,小伙伴们可以复习一下。

那么当消费者发送请求到Broker中拉取消息时,假设是第一次拉取,就会从MessageQueue中的第一条消息开始拉取。

如何定位到第一条消息的位置呢,首先Broker会找到MessageQueue对应的ConsumerQueue,从里面找到这条消息的offset,然后通过offset去CommitLog中读取消息数据,把消息返回给消费者。

当消费者消费完这条消息后,会提交一个消费的进度给Broker,Broker会记录下一个ConsumerOffset来标记我们的消费进度。

下次消费者再去这个MessageQueue中拉取消息时,就会从记录的消费位置继续拉取消息,而不用从头获取了。

总结

好了,到这里本篇文章就结束了。

今天主要和大家一起讨论了一下RocketMQ消费者的拉取和消费过程,也是国庆假期后的第一篇文章。

没有从国庆中收回心的小伙伴们(ps:王子也一样没有进入状态(`・ω・´))就与王子一起通过学习找回状态吧。

往期文章推荐:

什么是消息中间件?主要作用是什么?

常见的消息中间件有哪些?你们是怎么进行技术选型的?

你懂RocketMQ 的架构原理吗?

聊一聊RocketMQ的注册中心NameServer

Broker的主从架构是怎么实现的?

RocketMQ生产部署架构如何设计

RabbitMQ和Kafka的高可用集群原理

RocketMQ的发送模式和消费模式

讨论一下秒杀系统的技术难点与解决方案

秒杀系统中的扣减库存和流量削峰

深入研究RocketMQ生产者发送消息的底层原理

深入研究Broker是如何持久化的

Dledger是如何实现主从自动切换的

长按识别二维码,了解更多

d0c29bfacc0e816c88a40c91c183825c.png65adc58d7fbd3f955bdaf377c1acfc16.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苏宁 11.11:仓库内多 AGV 协作的全局路径规划算法研究

本文为『InfoQ x 苏宁 2018双十一』技术特别策划系列文章之一。 1. 背景 随着物联网和人工智能的发展,越来越多的任务渐渐的被机器人取代,机器人逐渐在发展中慢慢进入物流领域,“智能叉车”,AGV(Automated Guided Vehi…

用python绘制玫瑰花的代码_python也能玩出玫瑰花!程序员的表白代码

有些情侣是异地恋,情人节想送朵玫瑰花给女朋友都困难。别担心,用Python就好了,互联网时代的恋爱神器!接下来就让我们一起来看看如何用Python变出玫瑰花的。 1、首先我们导入画图工具turtle,即import turtle 2、导入画图…

Springboot 整合 swagger

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40254498/article/details/83622098 swagger 主要是为后端服务的接口文档,懒人必备,swagger就是一款让你更好的书写API文档的框架。 其他的框架…

Project为项目设置预算

假设项目预算10万元,如果项目完成后,花费没有超过10万元,则成本管理是成功的,如果花费了11万,则超过了预算。 预算是10万,一般目标成本设得比预算成本低,比如9.5万。在项目实施过程中&#xff…

activiti7流程设计器_变频空调器通信电路

通信电路由室内机和室外机主板两个部分单元电路组成,并且在实际维修中该电路的故障率比较高,因此单设--节进行详细说明。第三章变频空调器单元电路对比和通信电路第二节通信电路通信电路由室内机和室外机主板两个部分单元电路组成,并且在实际…

PyCharm 中为 Python 项目添加.gitignore文件

文章目录 1.安装.ignore插件 2.在项目中添加.ignore文件 1.安装.ignore插件 在pycharm编译器中,依次点击File->Setting 在跳出Setting的页面中,执行如下操作: 点击左侧的Plugins, 在搜索框中输入.ignore 点击右侧的install 点…

mysql的分页查询

为什么80%的码农都做不了架构师?>>> order by case when 的用法(实现特殊情况的排序,如leader1的排最前面): select * from m_worker_project order by CASE WHEN leader 1 THEN 100 ELSE 1000 END 项目中…

.describe() python_python的apply应用:一般性的“拆分-应用-合并”,附加详细讲解

跟aggregate一样,transform也是一个有着严格条件的特殊函数:传入的函数只能产生两种结果,要么产生一个可以传播的标量值(如np.mean),要么产生一个相同大小的结果数组。最一般化的GroupBy方法是apply,apply会将待处理的…

DNS服务(4)Slave DNS及高级特性

为了简化运维人员的负担,使用Master/Slave DNS架构的情况比较好,现在我们来简单叙述一下Master/Slaver DNS的特点主DNS服务器:维护所负责解析的域内解析库服务器;解析库由管理员维护;从DNS服务器:从主DNS服务器或其它的…

think python下载 中文版开源!这或许是最经典的编程教材

《Think Python》是很多Python初学者的不二入门教材,受到广泛好评。该书原作者是美国Olin工程学院的教授Allen B. Downey,目前该书的原版和中文版本都已免费开源。 中文版本译者是一名自学Python的编程爱好者。选择翻译《Think Python》,一是…

datatable的数据进行组内排序_排序算法学习分享(四)希尔排序

排序,也称为排序算法,可以说是我们学习算法的过程中遇到的第一个门槛,也是实际应用中使用得较为频繁的算法,我将自己对所学的排序算法进行一个归纳总结与分享,如有错误,欢迎指正!排序算法学习分…

jupyter notebook 安装代码提示功能

效果 安装成功后,输入部分代码,按 tab 键,会提示代码 安装步骤 1.安装nbextensions 从国内的pip镜像下载快 pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com jupyter_contrib_nbextensions jupyter contr…

python需要配置环境变量吗_python为什么会环境变量设置不成功

学习python编程,首先要配置好环境变量。本文主要讲解python的环境变量配置,在不同版本下如何安装 Windows 打开Python官方下载网站 https://www.python.org/downloads/release/python-370/ x86:表示是32位电脑 x86-64:表示是64位电脑 目前Python版本分为…

一维数组、二维数组、三维数组、四维数组、多维数组的理解

以图书馆来举例 一维数组是一条线 二维数组是一页纸 三维数组是一本书 四维数组是书架 五维数组是图书室2201(好几个书架) 六维数组是图书馆某一层,2楼/3楼,好几个图书室 七维数组是整个图书馆 第N维数组是宇宙..................…

在资源使用状况视图中查看资源的负荷情况

只有工时类资源才会出现过度分配,因为工时类资源通常指组织内部的人力资源或者机械设备等,这些资源通常都有数量上的瓶颈,也只有工时类资源才会在【资源工作表】中设置它的最大单位和资源可用性,这就限制了它在不同时间段内的可用…

python常用单词自由且开放_python常用英语单词词汇 unit7

1. Darcula IntelliJ IDEA自带的黑色主题名称,Android Studio是基于IntelliJ IDEA的。 2. Appearance /prns/ n. 外观; 3. Custom /kstm/ n. 习惯; 4. UI abbr. 用户界面(user interface) 5.Terminate /tmnet/ 终止、结…

2018.10.29-2018.11.4

简述osi七层模型和TCP/IP五层模型应用层OSI 参考模型中最靠近用户的一层,是为计算用户提供应用接口,也为用户直接提供网络服务。常见的应用层网络服务协议有:HTTP,HTTPS,FTP,POP3,SMTP等表示层表示提供各种用于应用层数据编码和转换功能&…

CSV文件转Excel后数字自动转换成科学计数法的解决方法

CSV文件用Excel打开后,长度超过11位的数字自动转换成科学计数法显示,末尾数字变成“0000”,如何解决这一问题? 以“老劳模系统数据.CSV”为例,身份证码是科学计数法了 第一步:新建excel,用 off…

python 小说 云_python小说网站

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python爬虫之小说网站--下载小说(正则表达式)思路:1. 找到要下载的小说首页,打开网页源代码进行分析(例:htt…

6.6(java学习笔记)文件分割(IO综合例子)

基本思路: 文件分割:将一个文件分割成若干个独立的文件。 设置分割后小文件文件的字节数,然后读取被分割文件, 将对应的字节数写入分割后的小文件中。 使用seek定位下一次读取位置。 文件合并:将分割后的若干的文件合并…