大众点评Cat--Server模块架构分析

之前写过一篇dubbo cluster–架构。因为dubbo逻辑集群的功能主要是在client端,主要侧重在client的分析。后来因为工作忙和懒癌,也就没再继续server的叙述了。最近正好在看大众点评的cat源码,其中也有rpc的模块,就借此专门来分析下rpc server的实现。

网络模型

Cat server基于netty,是典型的reactor模型。

上图是网上找的reactor模型示例图。Netty的boss和workder分别映射图中的mainReactor和subReactor。由boss accept nio channel,之后交由worker read, decode以及handle等。Netty的实现和图中略微有点不一致,在netty中decode和handle是同步的。

需要说明的是netty handler也可以异步处理,netty支持线程池分发handler thread。

还有另一种方案,由应用程序自身实现延迟队列做异步处理,handler只需将消息(事件)放入队列即可,cat采用的就是这种方案。Cat是通过decoder解码消息后调用handler将消息插入延迟队列,并没有向netty注册handler再由netty在decode完毕后调用相应handler。

Cat的传输数据对象为MessageTree,MessageCodec对传输消息编码和解码,MessageHanlder将消息放入队列。下图是cat server的静态结构。

cat server静态结构


CatHomeModule就是cat server,它包含两个逻辑模块,一个是reactor,另一个是延时队列(period),分别对应上图的左右半边。

MessageConsumer和TcpSocketReceiver均被CatHomeModule依赖,其实是在receiver初始化工程中也相应初始化了这两个重要组件。同时MessageConsumer也是MessageHandler聚合属性,而handler则是receiver的一个内部属性。结构上看起来有点混乱,但其实module是启动了receiver的初始化,然后receiver在初始化过程中依赖了handler,而handler又依赖了consumer。而Module和consumer之间的依赖关系是一种很弱的关系,只是为了注册虚拟机的shutdownhook(消息提交章节会做详细说明)。

MessageTree是经由网络传递的消息报文对象,由MessageCodec进行解码和编码。在服务端被解码生成后作为方法参数被MessageConsumer消费,最终放入MessageQueue等待MessageAnalyzer处理。

MessageQueue被聚合在PeriodTask内,后者是个daemon线程,不断轮询MessageQueue,当有队列里有消息时就调用MessageAnalyzer处理,每个task只对应一个analyzer,analyzer就是队列的消费者。

一个Period代表一个周期,每个周期对应一个持续时间(duration),默认是一小时,且周期是整点时间段,例如1:00-2:00,2:00-3:00,而不是1:01-2:01。每个周期对应多个task,每条消息相应的也会被拷贝成多分分发给每个task。

周期由PeriodManager参考周期策略(PeriodStrategy)的结果生成或结束。

介绍完cat server的实体概念后,再从动态层面看下它的初始化过程以及消息的就绪,消费和提交过程。

Server初始化

在静态结构视图里提到了CatHomeModule依赖两个实体,分别为MessageCosumer和TcpSocketReceiver,它们分别承担了reaactor以及延迟队列的功能,由CatHomeModule的initialize和setup阶段被初始化。

首先看下延迟队列的初始化过程。

上节提到策略结果会开始一个新的周期或者结束一个老的周期。上图的步骤5,策略会基于持续时间,提前开始时间(假设为a)以及延迟结束时间(假设为b)生成一个结果(a和b在cat中均默认为3分钟)。策略结果如果为正则start新周期,为负则end老周期,为0则不做任何动作。Cat默认超过duration*2+b的周期会被清理,相应的新周期也会提前a开始。

再看周期启动周期任务的过程(8-12),周期先回从应用上下文中获取所有的MessageAnalyzer(类似spring的getBeansOfType),再循环每个analyzer为每个analyzer生成一个或多个周期任务(视analyzer#getAnalyzerCount值而定)。

再看下reactor模块的初始化过程。

TcpSocketReciver在Server启动过程中被从上下文中lookup出来,并且执行初始化过程,在初始化的过程中通过依赖注入将MessageConsumer注入了MessageHandler中。相应的也将MessageHandler和MessageCodec注入给自己作为聚合属性。

消息就绪


TcpSocketReciver是个netty server,它监听socket请求,由关联的MessageDecoder解析生成MessageTree,再交由MessageHandler处理。MessageHandler将MessageTree交由MessageConsumer(延迟队列)消费,consumer基于MessageTree的时间戳找到相应的Period(步骤8),将其放入相应的PeriodTask中。Cat延时队列不支持主题,所以每条消息会默认被所有task消费。

详细描述下步骤8和步骤10:
1. PeriodManager维护了一个m_periods的list,find的过程就是轮询该列表找出duration包含MessageTree#timeStamp的唯一周期。
2. Period里会保存m_tasks映射,结构是(Analyzer类型全限定名,List)。在上节提过analyzer会对应一到多个task,对这种重复task select过程会通过MessageTree#domain进行hash取模只选出1个的。之所以要支持analyzer和task一对多的关系模型应该是考虑到有些analyzer处理会比较耗时,对这种就需要设定多个task,保证处理效率。

消息消费


消费过程相对简单,周期任务通过守护线程不断使用MessageAnalyzer对MessageQueue进行分析,如果MessageQueue#poll数据不为空则对poll出的MessageTree进行业务处理。每种MessageAnalyzer针对具体应用场景做相应处理,用户也可以自定义analyzer,只需要被容器感知就行。

消息提交

消息被消费后并不会立即持久化,而是放在内存里(analyzer的map属性),结构是(duration, (domain, T)),T是个业务维度的报表对象,例如EventReport,HeartbeatReport等。在周期结束或者jvm shutdown时会触发消息持久化。

1. 上图是正常周期结束的处理过程。之前介绍过PeriodManager会默认停掉duration*2+extraTime时间前的周期,被停的周期会循环周期内的所有task做finish,相应的task调用其聚合属性MessageAnalyzer的doCheckpoint做消息持久化。
2. 静态结构章节里介绍过MessageConsumer和CatHomeModule是很弱的依赖关系,用来注册虚拟机的shutdownhook。下面是注册shutdownhook的代码片段:

Runtime.getRuntime().addShutdownHook(new Thread() {

            @Override
            public void run() {
                consumer.doCheckpoint();
            }
        });

consumer#doCheckpoint会通过PeriodManager#findPeriod查找当前时间点对应的周期,并对该周期进行finish,对应上图步骤9及以后。
3. 需要强调的一点是,MessageAnalyzer对MessageTree并不是单纯的做保存,而是基于业务做指标度量。可以把MessageTree想象成度量指标,而MessageAnalyzer则是对指标作分析出报表,doCheckpoint持久化的一般都是报表数据,报表里包含了部分甚至全部MessageTree信息。

时间: 2024-12-28 22:40:52

大众点评Cat--Server模块架构分析的相关文章

大众点评cat系统的搭建笔记

项目地址:https://github.com/dianping/cat 编译步骤: 这个项目比较另类,把编译需要的jar包,单独放在git分支mvn-repo里了,而且官方文档里给了一个错误的命令提示: git git@github.com:dianping/cat.git mvn-repo 当你直接把这条命令贴到terminal里执行时,会提示命令无效,正确的姿势如下: 1.先安装jdk 1.7  这点很重要,cat项目的开发时间比较早,当时估计jdk8还没有,在1.8下编译虽然能成功,但是

大众点评Cat--架构分析

Cat功能强大且多,光日志的报表和图表分析就有十几种,但文档却很少,寥寥无几找到一些粒度却还很粗而且都是偏功能性的介绍.此外cat的配置也特别丰富,但几乎所有的cat文档里却鲜少提及.这些都导致很多方面都是缺失的,尤其是对于使用者来说,缺失了这些可能就意味着后面会步入大坑. 大纲 大众点评Cat–整体架构 大众点评Cat–server架构分析 整体架构 Cat的定位是实时监控平台,但是与其说是监控平台,更像是个数据仓库,在数据仓库的基础上提供丰富的报表分析功能. Cat分c端和s端,c使用cat

大众点评发布首个移动广告产品“吃喝玩乐”大数据实现商业变现

今日,中国领先的城市生活消费平台大众点评宣布,首个基于移动互联网的广告产品--推广通正式对外发布.据了解,推广通基于PC端的广告产品已于今年8月上线,并因为其精准高效的推广效果在商户之间迅速风靡,仅仅推出几十天时间内,产品已经覆盖全国四十几个城市.上千个商户品牌.据大众点评推广业务事业部总经理管宏介绍,推广通是城市生活消费行业首款打通PC和移动端的智能推广产品,能基于大众点评的"吃喝玩乐"大数据的分析,精准地把商户推荐给目标消费者.作为大众点评的重要收入来源之一,大众点评推广业务营收相

大众点评开源分布式监控平台 CAT 深度剖析

一.CAT介绍 CAT系统原型和理念来源于eBay的CAL的系统,CAT系统第一代设计者吴其敏在eBay工作长达十几年,对CAL系统有深刻的理解.CAT不仅增强了CAL系统核心模型,还添加了更丰富的报表.自2014年开源以来,CAT在携程.陆金所.猎聘网.找钢网等多家互联网公司生产环境应用. CAT是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,基本接入了美团点评上海侧所有核心应用.目前在中间件(MVC.RPC.数据库.缓存等)框架中得到广泛应用,为美团点评各业务线提供系统的性能指

MSSQL - 架构分析 - 从SQL Server 2017发布看SQL Server架构的演变

title: MSSQL - 架构分析 - 从SQL Server 2017发布看SQL Server架构的演变 author: 风移 摘要 美国时间2017年10月2日,微软正式发布了最新一代可以运行在Linux平台的数据库SQL Server 2017.SQL Server 2017给用户带来了一系列的新功能特性的同时,也体现了微软关于自家关系型数据库平台建设方面的最新设计与思考.这篇文章旨在介绍SQL Server 2017新特性,以及微软是如何从架构层面的演进来快速实现Linux平台的S

关于美团和大众点评营销战略同于不同的两点分析

中介交易 SEO诊断 淘宝客 云主机 技术大厅 原标题:关于美团和大众点评营销战略同于不同的两点分析:为什么都选择楼宇广告?主攻城市为何不同? [IT时代周刊编者按]作为团购网站所剩不多的佼佼者,美团和大众点评最近在营销战略中火拼的架势异常明显.美团和大众点评虽然一个被阿里入股,一个被腾讯战略投资,这两家团购网站都在积极谋划自主上市.为了争夺用户而掀起营销大战也就成了家常便饭,观察近期这两者的营销战略,既有相同之处也有迥异的地方.本文作者就对两者营销战略相同以及迥异的原因进行了深刻分析. 记得原

移动OA的魅力--大众点评的“企业号”运用法则

行业观察 对于大多数企业,OA是绕不开的办公方式.可是重要的事情说三遍:企业级OA对于大多数员工实在是很难用.很难用.很难用!!! 市面上各种OA软件标准不一,培训枯燥,使用复杂.理想很丰满,现实很骨感.本来是为了提高企业办公效率的OA系统,结果却无形中增加了企业员工的负担. 案例分析 总的说来,企业OA办公有以下几个问题: 1.命令式信息传递,简单粗暴又缺乏双向沟通 传统的企业的内部OA,信息传递多以命令为主,从上往下散播,简单粗暴又缺乏双向沟通,容易引起员工的反感.口头信息的逐层传递难免经过

部署点评Cat监控项目

在项目中监控代码运行的状况,可以采用点评的Cat项目来监控整个项目,但是按照官方的文档来部署cat,总会遇到各种问题,讲解的也不够简明清楚,现在用一个单机来部署运行cat监控项目. 首先,到项目的Git网页下载整个项目: https://github.com/dianping/cat 接着就是进入这个项目的目录,运行打包安装命令: mvn clean install -DskipTests  (需要maven) 执行完成后,运行 CAT 安装插件命令: mvn cat:install 会提示输入

有企鹅背景的大众点评对O2O有什么新玩法?

摘要: 一个月前,大众点评被腾讯入股了.很多人觉得点评立即豪起来了,过去发布会都是在公司的会议室开,上次包了个会场.黑豆觉得,大众点评的变化还有很多,比如他们更主动的告诉 一个月前,大众点评被腾讯入股了.很多人觉得点评立即"豪"起来了,过去发布会都是在公司的会议室开,上次包了个会场.黑豆觉得,大众点评的变化还有很多,比如他们更主动的告诉外界在做什么事情.以往张涛以及几位创始人都很低调,事情做了也不说,所以也着了不少"太慢"的批评.比如 3 月 25 日,他们又开了个