上一篇:CAT跨语言服务链监控(三)CAT客户端原理 下一篇:CAT跨语言服务链监控(五)配置与数据库操作
这边首先介绍下大众点评CAT消息分发大概的架构如下:
图4 消息分发架构图
分析管理器的初始化
我们在第一章讲到服务器将接收到的消息交给解码器(MessageDecoder)去做解码最后交给具体的消费者(RealtimeConsumer)去消费消息。
RealtimeConsumer 是在什么时候被创建初始化? 在第一章我们讲到,CatHomeModule通过调用setup安装完成之后,会调用 execute 进行初始化的工作, 在execute方法中调用ctx.lookup(MessageConsumer.class) 方法来通过容器实例化RealtimeConsumer。
在消费者中,最重要的一个概念就是消息分析器(MessageAnalyzer),所有的消息分析统计,报表创建都是由消息分析器来完成,所有的分析器(MessageAnalyzer)都由消息分析器管理对象(MessageAnalyzerManager)管理,RealtimeConsumer就拥有消息分析器管理对象的指针,在消费者初始化之前,我们会先实例化 MessageAnalyzerManager,然后调用initialize() 方法初始化分析管理器。
public class DefaultMessageAnalyzerManager extends ContainerHolder implements MessageAnalyzerManager, Initializable, LogEnabled {
private List<String> m_analyzerNames;
private Map<Long, Map<String, List<MessageAnalyzer>>> m_analyzers = new HashMap<Long, Map<String, List<MessageAnalyzer>>>();
@Override
public void initialize() throws InitializationException {
Map<String, MessageAnalyzer> map = lookupMap(MessageAnalyzer.class);
for (MessageAnalyzer analyzer : map.values()) {
analyzer.destroy();
}
m_analyzerNames = new ArrayList<String>(map.keySet());
...
}
}
initialize() 方法通过IOC容器的lookupMap方法,找到所有的消息分析器。一共12个,如下图,然后取出分析器的名字,放到m_analyzerNames 列表里,可以认为每个名字对应一种分析器,不同的分析器都将从不同角度去分析、统计上报的消息,汇总之后生成不同的报表,我们如果有自己的扩展需求,需要对消息做其它处理,也可以添加自己的分析器,只需要符合CAT准则即可。
消费者与周期管理器的初始化
消息分析器管理对象初始化之后,RealtimeConsumer 会执行 initialize() 来实现自身的初始化,
public class RealtimeConsumer extends ContainerHolder implements MessageConsumer, Initializable, LogEnabled {
@Inject
private MessageAnalyzerManager m_analyzerManager;
private PeriodManager m_periodManager;
@Override
public void initialize() throws InitializationException {
m_periodManager = new PeriodManager(HOUR, m_analyzerManager, m_serverStateManager, m_logger);
m_periodManager.init();
Threads.forGroup("cat").start(m_periodManager);
}
}
RealtimeConsumer的初始化很简单,仅包含3行代码,它的任务就是实例化并初始化周期管理器(PeriodManager),并将分析器管理