msgId与offsetMsgId区别与rocketmqConsole支持的坑

2023-05-16

背景

在测试环境的一台机子上启动了多个mq实例,某一天同事说投递到test环境的数据,可以在test4环境上查到,这让人有点担心,担心投递的数据会被别的消费。经过了解,同事提供相关的信息,投递到MQ时会返回msgid和offsetMsgId,返回如下:

[sendStatus=SEND_OK, msgId=AC13043800067DAF6ECC4AA409590002, offsetMsgId=AC1232CB0000232B000000004BB9D206, messageQueue=MessageQueue [topic=buc_supplier_order_sync, brokerName=broker-v, queueId=3]

根据msgId去查test 和test4环境,只有在test环境下可以查到,但是根据offsetMsgId查的时候,却可以在test 和test4环境上查到

 

问题

按照了解,msgID 和offsetMsgId应该是集群内唯一,为什么别的集群通过offsetMsgID可以查到另外一个集群的数据呢?

了解

首先针对msgId和offsetMsgID了解是什么样的存在?才能够分析原因

可以通过查看【这里转载】RocketMQ msgId与offsetMsgId释疑(实战篇)_中间件兴趣圈-CSDN博客_offsetmsgid与messageid了解。

msgId:该ID 是消息发送者在消息发送时会首先在客户端生成,全局唯一,在 RocketMQ 中该 ID 还有另外的一个叫法:uniqId,无不体现其全局唯一性。

offsetMsgId:消息偏移ID,该 ID 记录了消息所在集群的物理地址,主要包含所存储 Broker 服务器的地址( IP 与端口号)以及所在commitlog 文件的物理偏移量。

消息 Broker 服务端将消息追加到内存后会返回其物理偏移量,即在 commitlog 文件中的文件,然后会再次生成一个id,代码中虽然也叫 msgId,其实这里就是我们常说的 offsetMsgId,即记录了消息的物理偏移量,故我们重点来看一下其具体生成规则:

MessageDecoder#createMessageId

public static String createMessageId(final ByteBuffer input ,

final ByteBuffer addr, final long offset) {

input.flip();

int msgIDLength = addr.limit() == 8 ? 16 : 28;

input.limit(msgIDLength);

input.put(addr);

input.putLong(offset);

return UtilAll.bytes2string(input.array());

}

首先结合该方法的调用上下文,先解释一下该方法三个入参的含义:

ByteBuffer input

用来存放 offsetMsgId 的字节缓存区( NIO 相关的基础知识)

ByteBuffer addr

当前 Broker 服务器的 IP 地址与端口号,即通过解析 offsetMsgId 从而得到消息服务器的地址信息。

long offset

消息的物理偏移量。

即构成 offsetMsgId 的组成部分:Broker 服务器的 IP 与端口号、消息的物理偏移量。

温馨提示:即在 RocketMQ中,只需要提供 offsetMsgId,可用不必知道该消息所属的topic信息即可查询该条消息的内容。

分析

了解了msgID和offsetMsgId的区别,那接下来分析为什么rocketmqConsole 利用msgID在本集群才可以查到数据,而利用offsetMsgId却可以跨集群查到数据?

通过debug rocketmqConsole的源代码排查,通过在rocketmq console 传入offsetMsgID进行查询,debug到最后到了rocketmq客户端代码,可以看到,它的实现是利用解析offsetMsgID来得到broker的地址,以及相应的偏移量,通过传给对应的broker获取数据。也就是说即使不在同一个集群,只要网络可通,就可以跨集群查询得到数据返回。

 

 那通过msgID查询会怎么样呢?

首先,通过跨集群查询是查不到数据的。具体的源码如下:

 

到这里,就解释说明了为什么msgID 只能在本集群rocketmqconsole查到数据 ,offsetMsgID 却能跨集群查到。因为offsetMsgID不依赖于topic,通过自己offsetMsgID自带的信息进行查询,所以即使rocketmqconsole随便选个topic 通过offsetMsgID也可以查到对应的数据。

 

所以在进行rocketmq console的查询时,建议用msgID来查询,会比较准确。之前担心数据会跨集群消费,也不存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

msgId与offsetMsgId区别与rocketmqConsole支持的坑 的相关文章

  • C语言字符查找

    include lt string h gt include lt stdio h gt int main void char string 101 gets string char ptr c scanf 34 c 34 amp c pt
  • 使用vs2022遇到的一些问题

    小白的C语言之路 目录 前言 一 vs2022是什么 xff1f 二 我遇到的几个问题 1 字体调整在哪呢 xff1f 2 同一个项目中练习 xff0c 建立了多个源文件怎么办 xff1f 3 不小心关掉了错误列表 xff0c 解决方案资源
  • strtok函数的模拟实现

    本篇文章属于C语言初阶内容 xff0c 请各位读者选择阅读 目录 1 strtok函数 1 1 strtok函数的说明 1 2 strtok函数的模拟实现 1 strtok函数 1 1strtok函数的说明 首先我们来看strtok函数的定
  • Linux权限 - 概念与管理 | 文件权限的修改与转让 【详解】

    目录 Linux权限 Linux权限的概念 Linux权限的基础操作 1 实现用户账号的切换 2 仅提升当前指令的权限 Linux权限管理 1 文件访问者的分类 xff08 人 xff09 2 文件类型和访问权限 xff08 事物属性 xf
  • acwing蓝桥杯 - 数学知识【上】

    目录 质数 试除法判定质数 分解质因数 筛质数 约数 试除法求约数 约数个数 约数之和 最大公约数 质数 试除法判定质数 这个算法广为人知 xff0c 这里就不证明了 xff0c 解释一下 i lt 61 n 的写法 1 不推荐写成i lt
  • 蓝桥杯AcWing 题目题解 - 递归与递推

    目录 AcWing 92 递归实现指数型枚举 AcWing 93 递归实现组合型枚举 AcWing 94 递归实现排列型枚举 AcWing 1209 带分数 AcWing 1208 翻硬币 AcWing 92 递归实现指数型枚举 从1 xf
  • 蓝桥杯AcWing 题目题解 - 二分与前缀和、差分

    目录 AcWing 789 数的范围 整数二分 AcWing 790 数的三次方根 实数二分 AcWing 730 机器人跳跃问题 二分应用 AcWing 1227 分巧克力 AcWing 795 前缀和 AcWing 796 子矩阵的和
  • acwing蓝桥杯 - 数学知识【下】

    目录 欧拉函数 快速幂 求组合数 I 博弈论 Nim游戏 欧拉函数 在数论 xff0c 对正整数n xff0c 欧拉函数是小于n的正整数中与n互质的数的数目 xff0c 记作 n 1 61 1 1 分解质因子 xff0c 求出质因子p 2
  • 搜索与图论 - 搜索与图在算法中的应用【上】

    目录 DFS 排列数字 n 皇后问题 BFS 走迷宫 八数码 树与图的深度优先遍历 数的重心 树与图的广度优先遍历 图中点的层次 拓扑排序 有向图的拓扑序列 DFS 排列数字 include lt iostream gt using nam
  • cmake 设置vs工程的MT、MTd

    1 追加CMAKE CXX FLAGS Build Type span class hljs keyword set span CMAKE CXX FLAGS RELEASE span class hljs string 34 span c
  • 搜索与图论 - 搜索与图在算法中的应用【中】

    目录 迪杰斯特拉算法Dijkstra Dijkstra求最短路 I Dijkstra求最短路 II 贝尔曼 福特算法 bellman ford 有边数限制的最短路 SPFA算法 spfa求最短路 spfa判断负环 Floyd Floyd求最
  • 【创作赢红包】项目信息分析表

    项目的背景和问题 项目背景 xff1a 很多父母 都希望他们的孩子成为优秀的人 xff0c 但是在实践中 xff0c 他们的教育方式往往会出现一些与期望不符的情况 这可能是因为这些父母很大程度上是按照自己的父母的教育方式来教育孩子的 xff
  • 数据结构__<八大排序> __插入排序 |希尔排序 |选择排序 |堆排序 |快速排序 |归并排序(C语言实现)

    目录 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 hoare法 挖坑法 前后指针法 快排特性总结 三数取中优化 小区间优化 快排非递归 归并排序 归并排序非递归 计数排序 总结 OJ测试 前言目录 插入排序 直接插入排序 vo
  • 算法训练营 - 广度优先BFS

    目录 从层序遍历开始 N 叉树的层序遍历 经典BFS最短路模板 经典C 43 43 queue 数组模拟队列 打印路径 示例1 bfs查找所有连接方块 C 43 43 queue版 数组模拟队列 示例2 从多个位置同时开始BFS 示例3 抽
  • 在外web浏览器远程访问jupyter notebook服务器【内网穿透】

    文章目录 前言视频教程1 Python环境安装2 Jupyter 安装3 启动Jupyter Notebook4 远程访问4 1 安装配置cpolar内网穿透4 2 创建隧道映射本地端口 5 固定公网地址 转载自远控源码文章 xff1a 公

随机推荐