热门标签 | 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文件


推荐阅读
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
    深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 在iOS开发中,基于HTTPS协议的安全网络请求实现至关重要。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)是一种旨在提供安全通信的HTTP扩展,通过SSL/TLS加密技术确保数据传输的安全性和隐私性。本文将详细介绍如何在iOS应用中实现安全的HTTPS网络请求,包括证书验证、SSL握手过程以及常见安全问题的解决方法。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 本文详细介绍了如何在Linux系统(以CentOS为例)上彻底卸载Zimbra邮件系统,包括停止服务、删除文件和用户等步骤。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 重要知识点有:函数参数默许值、盈余参数、扩大运算符、new.target属性、块级函数、箭头函数以及尾挪用优化《深切明白ES6》笔记目次函数的默许参数在ES5中,我们给函数传参数, ... [详细]
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社区 版权所有