『互联网架构』调用链系统服务端实现

采集器采集后对应的日志信息,如果正常的传入到目标系统中,这其实有一定的挑战的。如果用http的话会影响应用系统,本身是为了监控业务系统,结果反而导致影响业务系统的性能,这肯定是不应该。日志存储这块不能简简单单用mysql,所以后来用[ElasticeSearch文档的方式进行存储。

(一)追踪数据传输方案

一个调用链系统的实现最基本的模块

1.性能日志采集
2.数据传输
3.数据存储
4.图表展示

这是系统是重点和难点。剩下的传输、存储、图表展示虽然没有那么复杂但不代表它们不重要,接下来就一起搞清楚剩下的三个模块是如何实现的。

  • 数据传输所面临的问题和挑战
    1.业务系统高并发高承载的情况下采集器对资源的占用降至最低
    2.保证数据采集上报的及时性
    3.数据丢失率在可控范围之类

  • 现有架构:

基于这些问题在来看我们架构是如何满足上述要求

上述架构中监听器采集到节点数据之基于Http发送至监控中心在发送至Elasticsearch进行存储。为保证不影响业务系统发送逻辑采用后台线程异步发送,并控制发送线程的数量。

上传流程说明

a. 初化一个限定容量的阻塞队列
b. 采集器抓取数据并上传至队列,超出容量直接丢弃
c. 线程池分配上传线程
d. 控制器取出指定数量数据,如果数量小于0线程阻塞。
e. 调用上传服务,根据策略选择具体(http、logger、jms)服务进行发送

上传流程为什么不直接采用线程池直接控制数据发送,而非得在自己去维护一个阻塞队列呢?

答:首先线程池本身可以限定发送线程最大值、其次减没有了从阻塞队列当中存取的过程、另外线程池本身也有队列和相关的饱和策略设置。

采集器其中有一个是对 Http的监控,而日志传输也是采用Http 不会出现死循环吗?

答:不会,因为上传线程 没有开启监控会话

  • 传输解决方案升级:

上述传输的解决方案对于,对于并发量不高的系统是最优解,因为简单。但随着目标系统的并发量增加,就会显得乏力,当然不管怎么样都不会影响到业务系统,只是采集数据会出现大量的丢失。为解决该问题就得进一步升级传输方案。
现有方案中最大的瓶颈是直接通过Http发送,所以最好的办法是先将其打印到本地日志,在基于logstash、flume日志收集工具进行发送。

(二)日志存储方案

存储需求,跟踪节点模型表

字段类型描述
traceIdstring跟踪ID
rpcId(EventID \spanID\nodeID)string节点ID
appIdstring目标应用ID
appDetailstring应用名称
nodeTypestring节点类型
resultStatestring结果状态
resultSizenumber结果大小
servicePathstring服务路径
serviceNamestring服务名称
beginTimelong开始时间
endTimelong结束时间
addressIpstring目标 IP地址
fromIpstring发起方IP地址
inParamtext(json)输入参数
outParamtext(json)输出结果
errorMessagestring()异常类型
errorStacktext异常堆栈
  • 存储方案要求
    1.大文本的存储
    2.足够快的写入速度

方案选择

a.mysql
b.MongoDB
c.ElasticSearch
d.Redis

基于上述要求 mysql作为关系型数据肯定不能和NoSQL相比。剩下的MongoDB与ElasticSearch都满足需求,只不过ElasticSearch 关于日志传输有完整的解决方案,即ELK。另外加上其搜索功能加持 ,所以选择了ElasticSearch。

  • 具体实现
    a.接收到数据后异步发送至ElasticSearch
    b.Agent 采用fastjson 作为数据存储,而ElasticSearch 采用的是jackson,特殊字符转义的时候会存在格式化失败的问。
(三)可视化展示
  • 知识点
  1. 列表视图
  2. 调用链TreeTable
  3. 调用链关系图
  4. 节点详情视图
    a. 输入输出参数 Json 视图
    b. SQL语句格式化展示
    c. SQL返回结果展示

* 列表视图

  1. 时间过滤
  2. IP过滤
  3. 关键字搜索
  4. 基于条件查询并展示相关节点
    源码位置:com.cbt.server.control.TraceRequestControl
    页面:page/trace/requestTableView.ftl

*节点展示表格视图(TreeTable目的只有一个以TreeTable的形式展示链条节点,并重点标记状态,简单起见这里直接选择了 EasyuI)。

源码位置:com.cbt.server.control.TraceDetailViewControl#openTraceListView

页面:page/trace/traceListView.ftl

  • 调用链关系图

其目的是以图的形式直观展示调用关系。

JsPlumb:是一套开源的流程图创建工具,早期一款画图工具,
D3.js:html5领域,d3可谓是最好的可视化基础库,提供方面的DOM操作,非常强大
Go.js:go.js 提供一整套的JS工具 ,支持各种交互式图表的创建。有免费版和收费版

相关源码:com.cbt.server.control.TraceConsoleControl#getflowChartNodeData

页面: page/trace/traceListView.ftl 216L

  • 节点详情视图

弹窗组件:layer.js

**布局组件:**bootstrap.js

SQL语法高亮:highlight.pack.js

SQL格式化:com.alibaba.druid.sql.SQLUtils#formatMySql(java.lang.String)

相关源码:com.cbt.server.control.TraceDetailViewControl#openDetailView

普通节点页面:page/trace/NormalDetailsView.ftl

SQL节点页面:page/trace/SqlDetailsView.ftl

PS:调用链系统的大体介绍基本完成了,老铁里面用了很多设计模式:代理模式,生产者消费者,策略模式等等吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值