RocketMQ
提供消息轨迹追踪的功能特性,用来记录消息发送前后和消息消费前后的消息消息状态、消息流向、耗时等等数据,我们可以在console中查询这些数据,进而跟踪消息的轨迹。
对于消息轨迹数据处理:RockerMQ
会将收集到的数据异步将数据提交给Producer,让其发送到特定topic的broker的。这个过程主要通过AsyncTraceDispatcher
来实现。里面涉及多线程,并发处理,批量处理,阻塞等待,流量控制等等编程技巧是非常值得我们去学习。
注意:下面描述生产者和消费者,只是针对阻塞队列traceContextQueue
角度来说的,非RocketMQ
的Producer和Consumer。
- 主要成员变量
public class AsyncTraceDispatcher implements TraceDispatcher {
// 消息发送者,队列消费者
private final DefaultMQProducer traceProducer;
// 线程池
private final ThreadPoolExecutor traceExecutor;
// 阻塞队列,用来接收队列生产者发送的数据
private final ArrayBlockingQueue<TraceContext> traceContextQueue;
// 丢失任务数量
private AtomicLong discardCount;
// 单一线程,用来不断提取阻塞队列中的任务
private Thread worker;
}
- 构造器(完成成员变量的初始化)
public AsyncTraceDispatcher(String group, Type type, String traceTopicName, RPCHook rpcHook) {
this.discardCount = new AtomicLong(0L);
this.traceContextQueue = new ArrayBlockingQueue<TraceContext>(1024);
this.appenderQueue = new ArrayBlockingQueue<Runnable>(queueSize);
this.traceExecutor = new ThreadPoolExecutor(10, 20, 1000 * 60, TimeUnit.MILLISECONDS, this.appenderQueue, new ThreadFactoryImpl(