来源丨经授权转自 捡田螺的小男孩(ID:gh_3d11c9893ca0)作者丨捡田螺的小男孩
前言
大家好,我是
捡田螺的小男孩
。
有位朋友去京东面试。问了消息队列RocketMQ相关的面试题。
什么是消息轨迹,朋友被问懵了。。。面试官又补了一句:broker节点配的。
本文田螺哥跟大家一起来看一下:
1. 什么是消息轨迹
RocketMQ的消息轨迹是一种用于追踪消息
生产、存储、消费全链路状态
的功能。它记录了消息从生产者发送到 Broker,再到消费者消费的完整生命周期信息,帮助开发者在分布式系统中快速定位消息问题(如消息丢失、重复消费、延迟等),并监控消息流转状态。
消息轨迹数据关键属性
Producer端
|
Consumer端
|
Broker端
|
生产实例信息
|
消费实例信息
|
消息的Topic
|
发送消息时间
|
投递时间,投递轮次
|
消息存储位置
|
消息是否发送成功
|
消息是否消费成功
|
消息的Key值
|
发送耗时
|
消费耗时
|
消息的Tag值
|
消息轨迹的核心作用
-
问题排查:快速定位消息是否成功发送、存储、消费,以及失败原因。
-
链路追踪:查看消息在生产者、Broker、消费者之间的流转路径和时间。
-
状态监控:统计消息的发送/消费延迟、成功率等关键指标。
-
数据审计:记录消息的完整生命周期,满足合规性要求。
2. 消息轨迹配置
如果RocketMQ
开启消息轨迹
,增加这个配置:
traceTopicEnable=true
给大家贴出Broker端开启消息轨迹特性的properties配置文件内容(
来源官网
):
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
storePathRootDir=/data/rocketmq/rootdir-a-m
storePathCommitLog=/data/rocketmq/commitlog-a-m
autoCreateSubscriptionGroup=true
## if msg tracing is open,the flag will be true
traceTopicEnable=true
listenPort=10911
brokerIP1=XX.XX.XX.XX1
namesrvAddr=XX.XX.XX.XX:9876
RocketMQ的消息轨迹功能支持
普通模式和物理IO隔离模式
。
普通模式
-
消息轨迹数据与普通业务消息共享Broker节点,集群中的
每个Broker节点均可存储消息轨迹数据
。
-
部署简单,无需额外配置。可能存在IO竞争问题,可能影响高吞吐量场景的性能。
-
在Broker的配置文件中开启消息轨迹功能(traceTopicEnable=true),即可。
物理IO隔离模式
-
消息轨迹数据与业务消息的存储完全隔离,需指定
专用Broker节点单独存储轨迹数据
。
-
避免IO资源竞争,提升整体吞吐量和稳定性,适合消息轨迹数据量大或对性能要求高的场景
-
RocketMQ集群中
至少有两个Broker节点
,其中一个Broker节点定义为存储消息轨迹数据的服务端
3. 消息轨迹的实现原理
RocketMQ 的消息轨迹功能通过以下方式实现:
-
内置轨迹Topic:RocketMQ 会创建一个内部 Topic(默认名为
RMQ_SYS_TRACE_TOPIC
),专门用于存储消息轨迹数据。
-
钩子机制:生产者和消费者在发送/消费消息时,通过 Hook(钩子)拦截消息事件,生成轨迹数据并发送到轨迹 Topic。