深入详解美团点评CAT跨语言服务监控(四)服务端消息分发

本文深入解析了大众点评CAT(Cat Home)在服务端的消息分发架构,包括消息分析器初始化、消费者与周期管理器的初始化、周期策略等内容。重点介绍了周期作为消息分发控制器的角色,以及如何根据消息时间戳分配到相应的分析器进行处理。
摘要由CSDN通过智能技术生成

上一篇: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),并将分析器管理

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值