RocketMQ源码学习笔记:消费者启动流程

这是本人学习的总结,主要学习资料如下

  • 马士兵教育
  • rocketMq官方文档

目录

  • 1、前置知识
    • 1.1、pull和push型消费者
    • 1.2、消息CommitLog到ConsumeQueue
    • 1.3、自动创建的重试主题
    • 1.4、广播型消费和集群型消费中offset的存储位置
  • 2、消费中的启动流程
    • 2.1、Preview
    • 2.2、校验,配置,启动

1、前置知识

1.1、pull和push型消费者

消费者可分为两种,一种是pull另一种是push

pull是消费者主动到broker上拿消息,push则是设置监听等broker发信息过来。

当然,底层实现其实都是pullpush模式下broker只是发送一个通知,然后消费者到broker上拉取消息。


1.2、消息CommitLog到ConsumeQueue

消费者读取数据时不会去读取CommitLog,而是CunsumeQueue

生成者发送信息只会到CommitLog中发送消息,不管ConsumeQueue

Broker专门启动了一个后台线程从CommitLog中将消息同步到ConsumeQueue,就是ReputMessageService

这种与消息相关的服务基本上都在在DefaultMessageStore中进行构建和启动。
在这里插入图片描述


ReputMessageService这个类源码没什么特点或者技术亮点,代码一层套一层比较繁琐,没有必要太过深究,只需要知道它的功能即可。


1.3、自动创建的重试主题

消费消息失败时我们可以返回重试枚举return ConsumeConcurrentlyStatus.RECONSUME_LATER;

这样隔一段时间后消费者会再次尝试消费消息。

重试机制会为原来的topic创建一个信息重试topic

dashborad界面NORMAL就是我们平时创建的一般的topic,RETRY就是系统自动创建的重试topic,一般是在原topic前加上%RETRY%
在这里插入图片描述

1.4、广播型消费和集群型消费中offset的存储位置

offsetStore表示消息消费的偏移量的存储位置。

在这里插入图片描述
从上图可以看到,广播型和集群型的消费模式有不同的offsetStore的值。

查看源码会发现,集群型消费的偏移量需要从远程的broker中获取;而广播型的offsetStore只在本地叫offsets.json的文件中维护偏移量,下图是广播型消费创建offsetStore的源码。

在这里插入图片描述
这是因为广播型的消息是给每个messageQueue都塞了消息,不像集群型一条消息只塞给其中一个messageQueue,所以广播型消费的特点是不保证每个consumer都能消费到消息,而集群型需要严格保证这一点。

所以偏移量放在本地可以降低通讯成本,正好广播型不需要保证消息一定被消费,那即使消费者宕机offset丢失也是可以接受的。

而集群型要保证消息一定被消费,就需要将offset保存在远程的broker,这样即使消费者宕机消息在broker中也是未消费的状态。


2、消费中的启动流程

2.1、Preview

在这里插入图片描述

这是一个简单的Consumer的代码。

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group1");
consumer.setNamesrvAddr("localhost:9876");
consumer.subscribe("topic1", "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {@Overridepublic ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {// todo}
});
consumer.start();

前面的设置结束后就会通过start()启动服务拉取消息,接下来会进入start()查看源码了解消费者的启动过程。

2.2、校验,配置,启动

刚启动时,状态是CREATE_JUST,我们进入这个分支查看源码。

在这里插入图片描述
服务启动前都要做一些校验,然后配置初始化必要的bean,其中就包括为以后可能的消费失败创建一个重试topic

这些配置和检验不细说。不过有一个配置offsetStore比较有意思。

广播型消费的offset存储在本地的offsets.json中,集群型消费的offset存储在远程。下面是相关代码。
在这里插入图片描述

各种配置之后开始启动消费者服务。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

《AIGC:智能创作时代》—开启智能创作的全新时代

在人工智能发展的漫长历程中&#xff0c;如何让机器学会创作一直被视为难以逾越的天堑。然而&#xff0c;人类的创造力终将赋予机器创造力&#xff0c;把世界送入智能创作的新时代。 书名&#xff1a;《AIGC&#xff1a;智能创作时代》&#xff0c;作者&#xff1a;杜雨、张孜铭…

150个pb网站模板(都是成品网站,上传php空间即可使用),建站必备

一网友提供的150个pb网站模板&#xff0c;其实就是成品网站&#xff0c;上传php空间即可使用&#xff0c;属于建站公司或者建站开发人员必备的资源。 一共150个基于pb的成品网站&#xff0c;基本上都可以找到适应你手头客户需要的一款&#xff0c;简单修改一下即可交活收钱了。…

【爬虫基础入门课件:第二课:爬虫入门】

爬虫入门 什么是爬虫? 不知道各位是否遇到过这样的需求. 就是我们总是希望能够保存互联网上的一些重要的数据信息为己所用. 比如, 在浏览到一些优秀的让人血脉喷张的图片时. 总想保存起来留为日后做桌面上的壁纸在浏览到一些重要的数据时(各行各业), 希望保留下来日后为自…

美式键盘 QWERTY 布局的起源

注&#xff1a;机翻&#xff0c;未校对。 The QWERTY Keyboard Is Tech’s Biggest Unsolved Mystery QWERTY 键盘是科技界最大的未解之谜 It’s on your computer keyboard and your smartphone screen: QWERTY, the first six letters of the top row of the standard keybo…

C语言 | Leetcode C语言题解之第238题除自身以外的数组的乘积

题目&#xff1a; 题解&#xff1a; // 数组中除自身以外元素的乘积 int* productExceptSelf(int* nums, int numsSize, int* returnSize) {static int ra[100000]; // 结果数组for (int i 0; i < numsSize; i) {ra[i] 1; // 初始化结果数组为1}int pre 1, suf 1; /…

MongoDB教程(八):mongoDB数据备份与恢复

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言MongoDB 备…

【学习】美国虚拟信用卡申请流程

WildCard 官方网址&#xff1a;https://bewildcard.com/i/PEACEFUL &#xff08;使用邀请码“PEACEFUL”可以享受开卡88 折优惠&#xff0c;注册时提示填写邀请码就可以填写&#xff09;

如何通过成熟的外发平台,实现文档安全外发管理?

文档安全外发管理是企业信息安全管理的重要组成部分&#xff0c;它涉及到企业向外发送的文件&#xff0c;需要进行严格的控制和管理&#xff0c;防止敏感或机密信息的泄露。以下是一些关键考虑因素&#xff1a; 文件外发的挑战&#xff1a;企业在文件外发时面临的主要挑战包括…

QT纯代码实现滑动开关控件

开关按钮大家应该很熟悉&#xff0c;在设置里面经常遇到&#xff0c;切换时候的滑动效果比较帅气。通常说的开关按钮&#xff0c;有两个状态&#xff1a;on、off。大部分的开关按钮控件&#xff0c;基本上有两大类&#xff0c;第一类是纯代码绘制&#xff0c;这种对代码的掌控度…

vue2迁移到vue3注意点

vue2迁移到vue3注意点 1、插槽的修改 使用 #default &#xff0c; 以及加上template 模板 2、 类型的定义&#xff0c;以及路由&#xff0c;vue相关资源&#xff08;ref, reactive,watch&#xff09;的引入等 3、类装饰器 1&#xff09;vue-class-component是vue官方库,作…

WordPress 6.6 “Dorsey多尔西”发布

WordPress 6.6 “Dorsey多尔西”已经发布&#xff0c;它以传奇的美国大乐队领袖 Tommy Dorsey 名字命名。Dorsey 以其音调流畅的长号和作品而闻名&#xff0c;他的音乐以其情感深度和充满活力的能量吸引了观众。 当您探索 WordPress 6.6 的新功能和增强功能时&#xff0c;让您的…

【初阶数据结构】3.单链表

文章目录 3.单链表3.1 概念与结构3.1.1 结点3.1.2 链表的性质3.1.3 链表的打印 3.2 实现单链表3.3 链表的分类3.4 单链表算法题3.4.1 移除链表元素3.4.2 反转链表3.4.3 链表的中间结点3.4.4 合并两个有序链表3.4.5 链表分割3.4.6 链表的回文结构3.4.7 相交链表3.4.8 环形链表I3…

几何相关计算

目录 一、 判断两个矩形是否相交 二、判断两条线段是否相交 三、判断点是否在多边形内 四、垂足计算 五、贝塞尔曲线 六、坐标系 一、 判断两个矩形是否相交 当矩形1的最大值比矩形2的最小值都小&#xff0c;那矩形1和矩形2一定不相交&#xff0c;其他同理。 struct Po…

ETL之DataX模板(数据同步)

今天跟大家分享数据同步datax的模板&#xff0c;小伙伴们简单直接借鉴使用。 还记得上一篇关于大数据DS调度工具的分享嘛&#xff1f; 主流大数据调度工具DolphinScheduler之数据ETL流程-CSDN博客 里面的核心就是采用了DATAX的数据同步原理。 1&#xff0c;什么是DataX Da…

逻辑漏洞-垂直越权

【实验介绍】 垂直越权&#xff1a;是不同级别之间或不同角色之间的越权。由于后台应用没有做权限控制&#xff0c;或仅仅在菜单、按钮上做了权限控制&#xff0c;导致恶意用户只要猜测其他管理页面的 URL 或者敏感的参数信息&#xff0c;就可以访问或控制其他角色拥有的数据或…

使用工作日志 - 更快地恢复专注并理清思路

原文&#xff1a;Charles Fval - 2024.07.12 你正在处理计算机科学中最复杂的问题&#xff1a;修复部署管道上的权限。这已经是你开始处理这个简单任务的第 4 天了。你的经理明确告诉你&#xff0c;你在这方面的表现远低于她对一个中期实习生的期望。你的同事们都尽量远离你&a…

WebGoC题解(10) 171.(201706比赛)第8题:数列(series)

题目描述 小P昨天数学留了一道关于数列的作业&#xff1a; 数列的前几项是&#xff1a;50,51,53,56,60,65,...。要求找到规律&#xff0c;计算出前N项。 作为goc高手&#xff0c;小P设计了一个用图形表示这个数列的方案。具体的设计是&#xff1a; 把一周均匀分成N个角度&#…

[C++]——同步异步日志系统(6)

同步异步日志系统 一、日志器模块设计1.1 同步日志器模块设计1.1.1 局部日志器建造者模式设计1.1.2 同步日志器基本功能测试 1.2 异步日志器模块设计1.2.1 单缓冲区设计1.2.2 异步工作线程的设计&#xff08;双缓冲区思想&#xff09;1.2.3 异步日志器设计1.2.4 异步日志器建造…

Python数据分析-植物生长数据分析(机器学习模型和神经网络模型)

一、研究背景 植物生长受多种环境因素的影响&#xff0c;包括土壤类型、日照时间、浇水频率、肥料类型、温度和湿度等。这些因素不仅影响植物的生长速度和健康状况&#xff0c;还对植物在不同生长阶段的表现有显著影响。随着气候变化和环境污染问题的加剧&#xff0c;研究如何…

Spring如何进行动态注册Bean

在Spring框架中&#xff0c;Bean是应用程序的核心组成部分&#xff0c;而BeanDefinition则是这些Bean的元数据表示。随着应用程序的复杂性增加&#xff0c;我们可能需要更灵活地定义和注册Bean。Spring框架提供了几个扩展点&#xff0c;允许我们以编程方式影响Bean的创建和定义…