【引言】
本期由阿里云ACE(阿里云开发者社群)&成都柠檬云网络技术有限公司资深架构师 曾昌强 为大家分享个人成长经历与个人专业技术之分布式链路追踪系统架构设计。
视频:https://yq.aliyun.com/live/581
Part 1:成长经历
讲述一个不知道什么叫编程的门外汉,如何穿越几千公里来到石油名校学习计算机,当家教,炸金花最终进入目标企业的故事而后又辗转几千公里进入梦想公司阿里巴巴,后来又回归家乡的故事讲述一个如何从ERP,进入互联网,又进入区块链行业的故事。
Part 2:分布式链路追踪系统架构设计
- 为什么需要分布式链路追踪
- 链路追踪核心模型
- 链路追踪的作用,原理
- 链路追踪各个模块地设计与经验分享
- 链路追踪产品展示
【正文】
一、对程序员的感悟与成长经历
首先和大家讲述一下我认为的程序员有哪些境界,搬砖,就是大家所说的苦逼程序员,没有成就感,没有技术含量,年复一日,度日如年,想想这样也挺难熬的,毕竟还有几十年。情怀,有一定技术含量,也能从工作中找到一些成就感,当然也能获得可观的收入维持程序员体面的生活。快乐,以编程为快乐,只要写代码就感觉兴奋,高兴,深深地佩服自己的计算机技能,徜徉于自己的世界中。希望你能在代码中找到自己的快乐。
本人在上大学之前并不了解计算机编程时干啥的,由于在07年的时候考上了一所大学,无奈对所学专业的不感兴趣,不想就此决定此生的方向,就是年复一日的搬砖,在读了半年之后,毅然退学。重新高考,由于当时石油很火,就想读一个石油名校,就选择了大庆石油学院,没想到,拿到的通知书却是计算机科学与技术,想着这半年来的悬梁刺股,苦逼生活,不敢再复读了,就毅然抱着当网管的心态,去学习计算机技术了。
到了大学,感觉挺闲的,就去找了中介,当了家教,教书育人,补贴家用,闲暇时间又通读了古今中外经典书籍(其实就是看小说),提升自己的文化修养。后来思考,为啥别人可以给我介绍家教挣我的钱,就迅速调研了家教中介的门槛,发现很简单,就去学校周边印一些广告,然后联系大学生,做一个双向沟通,遂成立天翼家教。当然还是挣了些钱,有了钱,机缘巧合之下,就去炒股了,没想到赔了不少,发现股市比较坑人(当然在我研究了股市很长时间发现,散户根本不能炒短线,一定要能熬,熬到庄家都怕你,两年之后,收益100%)。然后在隔壁班同学的怂恿下,就去砸金花了,但是还被警察抓了一回(故事很长),第一次砸金花被抓,第一次知道玩牌会被抓(四川人)。渐渐到了大三,发现明年就要找工作了,发现自己啥都不会啊,那咋办呢?想想还是去做一下项目吧,然后就去找了个相熟的教授,进了他的实验室,然后就开始接触了一些项目,渐渐的发现还有那么点意思,尤其看到自己设计的代码,真的按照自己的想法出结果了,并且还有人在用,并且还有收入,瞬间就膨胀了,发现计算机这行不错。双选会(哈工大的)的时候,进入了自己心仪的企业用友软件,待遇在当时也算非常不错的,因为当时还没有bat这一说法,由于上一届师兄的影响,认为用友软件就是当时最牛逼的企业(当然本来也很不错)。然后就去了用友工作,用友园区好大,就是偏僻了点,还包住,想想也是挺幸福的。在那度过了两年多,认识了很多好朋友。后来去了58同城,把互联网技术深入的学习了一遍。而后去了上海的饿了么,专注于数据库中间件的开发,我们是从头开始设计架构数据库中间件的,基于mysql协议,所以对mysql协议现在是非常熟悉了,同时也对数据库相关的优化,设计,性能有一些理解。再后来,就去阿里天猫,再后来由于家里的一些事情,就回到了成都。现在在柠檬云任职架构师。
我的梦想就是成为诗人,游侠,是不是有点像李白,对的,李白就是我的偶像。曾梦想仗剑走天涯,看一看世界的繁华。结果为什么没有去呢,就是bug太多了。怎么才能bug少一些呢,或者解决bug更容易呢?我们就需要一个非常重要的工具,链路追踪
二、专业技术分享:分布式链路追踪系统架构设计
1. 为什么需要分布式链路追踪
我们刚才也说到,解决bug需要用到链路追踪工具,下面我们来举个“较复杂的分布式调用网络”的例子。
这是一个很典型的分布式网络拓扑图,真实的环境可能比这个网络复杂得多,那么
我们如何能理清应用之间的调用关系?
出错之后如何快速定位?
如何监控每个服务的健康状况,性能情况?
如何监控每个调用在各个服务的调用和耗时情况?
回答以上问题需要用到Trace的一次追踪
可以很清晰地看到此次调用在每个服务的耗时,以及直接可以定位出性能瓶颈在哪里
2. 链路追踪主要核心领域模型,Opentracing核心模型
3.链路追踪的作用与原理说明
假设游客要进入每个景点,必须使用身份证扫描,并且记录一个日志在本地,有一个收集系统会定时收集所有景点的数据,汇总到一个中央日志处理系统。那么,我们就是分析这些数据,得到小明这一次去游览了哪些景点,在每个景点停留了多久。还有每个景点在某一时刻的人流量,每个景点的最大承载量是多大等等。这就是完全类似于我们的链路追踪系统。
现在开源或者在使用的链路追踪系统中绝大部份是参考了Google 的这篇Dapper论文,其中最重要的就是指明了一个实现方向,以及证明了实现的可能性
4. 链路追踪各个模块地设计与经验分享
设计目标
整体框架
TraceId设计
我们的TraceId设计了业务字段,包含起始appid,起始ip,采样标识等。大家可以思考使用UUID是否可以?
Span设计
span使用多级设计,清晰明确地展示每个span在追踪链中的位置。traceId一直保持不变,在所有span中传输,最终根据traceId和spanId的层级关系,准确还原整个调用链路。
Client设计
当请求进入某一个span之后,会创建线程上下文,然后对应的RPC,SQL,HTTP等调用,都会作为一个节点,加入到线程上下文中,当请求结束的时候,整个span会发送到异步队列中,通过线程逐渐发送到server端。
Server设计
server使用netty作为网络框架,接收客户端发送的数据。分析之后,全量数据发送到hbase,需要再分析的数据发送到kafka,后续使用storm集群来分析
Storm设计
上面为storm大致的设计拓扑图,使用kafkaSpout读取刚才server端写入kafka的的数据。然后经过统一AnalysisBolt,分析进入,EntryStatistics,ErrorStatistic等,最后再经过HbaseBolt,将分析完的数据写入Hbase。
5. 产品展示