avg变量的定义 avg什么意思( 三 )


(3)卡特彼勒客户端的设计
客户端设计是CAT系统设计中最重要的环节 。客户端的要求是API简单可靠 , 客户端在任何场景下都不能影响每个业务服务的性能(监控只是公司核心业务流程的一个旁路环节) 。下面的客户端设计和细节以java客户端为例 。
设计框架
客户端是java,客户端使用ThreadLocal来收集数据,这是一个线程本地变量,也可以称为线程本地存储 。其实ThreadLocal的作用很简单,就是为每个使用该变量的线程提供一份变量值的副本 。它是Java中一种特殊的线程绑定机制 , 每个线程都可以独立地改变自己的副本 , 而不会与其他线程的副本发生冲突 。
在监控场景下 , 提供给用户的服务都是web容器,如Tomcat或Jetty , 后端rpc服务器如dubbo或pigeon,一个自研的点评服务框架,都是基于线程池实现的 。在处理业务逻辑时,业务端基本调用后端服务、数据库、缓存等 。在一个线程中,并将这些数据返回进行业务逻辑封装 , 最后将结果显示给用户 。因此,将所有监控请求作为监控上下文存储在线程变量中是非常合适的 。
当上述业务执行业务逻辑时 , 这个请求对应的监控会存储在线程上下文中,这实际上是一个监控树结构 。在业务线程执行结束时,被监视的对象存储在异步内存队列中,CAT中的一个消费者线程将队列中的数据异步发送到CAT服务器 。
API设计
当设计者对监控和性能分析有了深入的理解,他就可以定义监控API了 。监控和性能分析有以下几种情况 。
一段代码的执行时间,一段代码可以是URL执行耗时,也可以是SQL的执行耗时一段代码的执行次数,比如程序抛出异常记录次数,或者一段逻辑的执行次数定期执行某段代码,比如定期上报一些核心指标,jvm内存、gc等指标关键的业务监控指标,比如监控订单数、交易额、支付成功率等
在上述领域模型的基础上,CAT设计了几个自己的核心、事务、事件、心跳和度量的监控对象 。
分段监控API的代码示例如下
序列化和通信
序列化和通信是包括服务器在内的整个客户端性能的关键环节 。
CAT序列化协议是自定义序列化协议,自定义序列化协议相比通用序列化协议要高效很多,这个在大规模数据实时处理场景下还是非常有必要的 。CAT通信是基于Netty来实现的NIO的数据传输,Netty是一个非常好的NIO开发框架,在这边就不详细介绍 。
客户埋藏点
日志掩埋是监测活动中最重要的环节之一,日志的质量决定了监测的质量和效率 。CAT的埋目标是以问题为中心的,比如程序抛出的异常就是典型的问题 。我个人对问题的定义是,不符合预期的才算是问题 。比如请求没有完成,响应时间有快有慢,TPS请求数量过多过少 , 时间分布不均匀 。
在互联网环境下,典型的突出问题易发场景包括跨模块调用、跨公司调用等 。例如
HTTP/REST、RPC/SOA、MQ、Job、Cache、DAL;搜索/查询引擎、业务应用、外包系统、遗留系统;第三方网关/银行, 合作伙伴/供应商之间;各类业务指标,如用户登录、订单数、支付状态、销售额 。
(4)服务器的设计
服务器端的主要问题是大数据的实时处理 。截至2017年6月 , 后端猫的计算集群约有100台物理机,存储集群约有50台物理机 , 每天处理约200TB的数据 。以下是卡特彼勒服务器的一些设计细节:
结构化
单服务器cat-consumer的总体架构如下:
如上图所示 , CAT服务器在整个实时处理中基本实现了全异步处理 。
消息接收是基于Netty的NIO实现消息接收到服务端就存放内存队列,然后程序开启一个线程会消费这个消息做消息分发每个消息都会有一批线程并发消费各自队列的数据,以做到消息处理的隔离消息存储是先存入本地磁盘,然后异步上传到hdfs文件,这也避免了强依赖hdfs
当报表处理器来不及处理时 , 例如,事务报表处理速度很慢 , 可以通过配置支持启动多个事务处理线程,并且可以并发使用消息 。
实时分析
分析实时猫服务器实时报表分析是整个监控系统的核心 。在CAT中 , 客户端收集原始的Logview,目前每天大概有3000亿条消息,需要基于这些消息实现丰富的报表,以支持业务问题和性能分析的需求 。
根据CAT日志消息的特点(如只读特性)和问题场景,量身定制 。CAT会根据消息的创建时间,在一个小时内对所有报告进行切片,然后每小时生成一个报告 。当前每小时报告的所有计算都基于内存 , 每次用户请求即时报告时,都会获得最新的实时结果 。对于历史报表来说 , 因为是常量,所以实时与否并不重要 。

推荐阅读