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

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

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

网络模型

Cat server基于netty,是典型的reactor模型。
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阶段被初始化。

首先看下延迟队列的初始化过程。
period初始化
上节提到策略结果会开始一个新的周期或者结束一个老的周期。上图的步骤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模块的初始化过程。
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信息。

目录
相关文章
|
4月前
|
安全 数据处理 数据安全/隐私保护
C/S架构与B/S架构的适用场景分析
C/S架构(客户端/服务器架构)与B/S架构(浏览器/服务器架构)在适用场景上各有特点,主要取决于应用的具体需求、用户群体、系统维护成本、跨平台需求等因素。
345 6
|
16天前
|
机器学习/深度学习 存储 人工智能
基于AI的实时监控系统:技术架构与挑战分析
AI视频监控系统利用计算机视觉和深度学习技术,实现实时分析与智能识别,显著提升高风险场所如监狱的安全性。系统架构包括数据采集、预处理、行为分析、实时决策及数据存储层,涵盖高分辨率视频传输、图像增强、目标检测、异常行为识别等关键技术。面对算法优化、实时性和系统集成等挑战,通过数据增强、边缘计算和模块化设计等方法解决。未来,AI技术的进步将进一步提高监控系统的智能化水平和应对复杂安全挑战的能力。
|
2月前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
2月前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
96 4
|
3月前
|
存储 SQL 分布式计算
湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
【10月更文挑战第7天】湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
198 1
|
4月前
|
存储 监控 安全
SaaS业务架构:业务能力分析
【9月更文挑战第20天】在数字化时代,软件即服务(SaaS)模式逐渐成为企业软件解决方案的首选。SaaS 业务架构设计对于提供高效、可靠的服务至关重要。其核心业务能力包括:用户管理(注册登录、角色权限)、数据管理(存储备份、安全共享)、业务流程管理(设计定制、工作流自动化)、应用集成(第三方应用、移动应用)及客户服务(支持培训、反馈改进)。通过优化这些能力,可为企业提供更高效、可靠的 SaaS 服务。
75 11
|
4月前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。
106 0
|
5月前
|
消息中间件 负载均衡 Kafka
Kafka 实现负载均衡与故障转移:深入分析 Kafka 的架构特点与实践
【8月更文挑战第24天】Apache Kafka是一款专为实时数据处理和流传输设计的高性能消息系统。其核心设计注重高吞吐量、低延迟与可扩展性,并具备出色的容错能力。Kafka采用分布式日志概念,通过数据分区及副本机制确保数据可靠性和持久性。系统包含Producer(消息生产者)、Consumer(消息消费者)和Broker(消息服务器)三大组件。Kafka利用独特的分区机制实现负载均衡,每个Topic可以被划分为多个分区,每个分区可以被复制到多个Broker上,确保数据的高可用性和可靠性。
139 2
|
5月前
|
数据采集 存储 Java
Flume Agent 的内部原理分析:深入探讨 Flume 的架构与实现机制
【8月更文挑战第24天】Apache Flume是一款专为大规模日志数据的收集、聚合及传输而设计的分布式、可靠且高可用系统。本文深入解析Flume Agent的核心机制并提供实际配置与使用示例。Flume Agent由三大组件构成:Source(数据源)、Channel(数据缓存)与Sink(数据目的地)。工作流程包括数据采集、暂存及传输。通过示例配置文件和Java代码片段展示了如何设置这些组件以实现日志数据的有效管理。Flume的强大功能与灵活性使其成为大数据处理及实时数据分析领域的优选工具。
175 1
|
4月前
|
缓存 负载均衡 数据管理
深入探索微服务架构的核心要素与实践策略在当今软件开发领域,微服务架构以其独特的优势和灵活性,已成为众多企业和开发者的首选。本文将深入探讨微服务架构的核心要素,包括服务拆分、通信机制、数据管理等,并结合实际案例分析其在不同场景下的应用策略,旨在为读者提供一套全面、深入的微服务架构实践指南。**
**微服务架构作为软件开发领域的热门话题,正引领着一场技术革新。本文从微服务架构的核心要素出发,详细阐述了服务拆分的原则与方法、通信机制的选择与优化、数据管理的策略与挑战等内容。同时,结合具体案例,分析了微服务架构在不同场景下的应用策略,为读者提供了实用的指导和建议。

热门文章

最新文章

下一篇
开通oss服务