热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RocketMQ消息读写

前言之前写过一篇关于RockerMQ的消息存储,本文接上文,这里是详细介绍RocketMQ是怎么完成消息读写的!消息写一条消息进入到B

前言

之前写过一篇关于RockerMQ的消息存储,本文接上文,这里是详细介绍RocketMQ是怎么完成消息读写的!

消息写

在这里插入图片描述
一条消息进入到Broker后经历一下几个过程才最终被持久化

  1. Broker更具QueueId,获取到该消息对应索引条目在consumerqueue目录中的写入偏移量,即QueueOffset
  2. 将queueId、queueOffset等数据,与消息一起封装为消息单元
  3. 将消息写入到commitLog
  4. 形成消息索引条目
  5. 将消息索引条目拆分到相应的consumerqueue

消息读

当Consumer来拉取消息时会经历以下几个步骤

  1. Consumer获取到其要消费消息所在的Queue的消息偏移量offset,计算出其要消费的消息offset

消费offset即消息消费进度,Consumer对某个queue消费的offset,即消费到了该queue的第几条消息,消息offset=消费offset+1,这里实际上就是去读config目录下consumerOffset.json文件
在这里插入图片描述
举例topic为first-topic-str,消费者为my-consumer-group,订阅队列有queue0-3.对应消费为0号消费到2,1号消费到2,2号消费到1,3号消费到1


  1. Consumer向Broker发送拉取请求,其中会包含拉取消息的Queue,消息offset及消息Tag
  2. Broker计算改ConsumerQueue中的queueOffset

queueOffset=消息offset*20字节


  1. 该queueOffset处开始向后查找第一个指定Tag的索引条目
  2. 解析该索引条目前8个字节,即可定位到该消息在commitLong中的commit Offset
  3. 从对应的commitLog offset中读取消息单元,并发送给Consumer

补充消息点位重置

这里关于consumerOffset.json文件,这个文件就是记录每个Topic下消费者消息的点位信息的
在这里插入图片描述
我们在rocket-console控制台中关于Topic中有一个重置消费位点的概念,操作如下
在这里插入图片描述
用过rocketmq的管理控制平台的同学应该都会看到重置消费位点这个功能,由于消费消息也只是对应的消费者的指针的偏移,消息也并没有消失,所以这个重置消费位点也就是指针的来回移动偏移而已。这里也很好理解,首先选择消费组,就是你订阅了这个topic的组,下边的时间点就是你要讲指针移动到什么时候,这个好像不能精确到其中的一条消息,只能通过时间来定位。然后就是重置后你选的消费组就开始从你选择的时间点开始消费消息,不过呢这个好像有点小bug还是怎么的 我测试的时候它的时间点好像并没有多么精确 大家可以自行测试。
还有一点 最重要的一点,这个重置消费位点你点过重置后它不会立马重置,你的消费者也不会立马接收到消息,点过重置后,好像会导致消息短暂的失效(这个时间好像是0-3分钟的样子,所以得等一下),那么这里实际上重置的数据就是上面提到的consumerOffset.json文件


推荐阅读
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 前言:由于Android系统本身决定了其自身的单线程模型结构。在日常的开发过程中,我们又不能把所有的工作都交给主线程去处理(会造成UI卡顿现象)。因此,适当的创建子线程去处理一些耗 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • Spring Boot + RabbitMQ 消息确认机制详解
    本文详细介绍如何在 Spring Boot 项目中使用 RabbitMQ 的消息确认机制,包括消息发送确认和消息接收确认,帮助开发者解决在实际操作中可能遇到的问题。 ... [详细]
  • 我自己做了一个网站图片的抓取,感觉速度有点慢抓取4000张图片可能得用15分钟左右的时间,我百度看用线程可以加快抓取,然后创建了5个线程抓取,但是5个线程是同步执行同样的操作一个图片就 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 深入体验Python的高级交互式Shell - IPython
    IPython 是一个增强型的 Python 交互式 Shell,提供了比标准 Python 控制台更为强大的功能,适用于开发和调试过程。它不仅支持直接执行 Linux 命令,还提供了丰富的特性来提高编程效率。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 协程作为一种并发设计模式,能有效简化Android平台上的异步代码处理。自Kotlin 1.3版本引入协程以来,这一特性基于其他语言的成熟理念,为开发者提供了新的工具,以增强应用的响应性和效率。 ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • 驱动程序的基本结构1、Windows驱动程序中重要的数据结构1.1、驱动对象(DRIVER_OBJECT)每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱 ... [详细]
author-avatar
漫漫瞹fyS-1908
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有