You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
12 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 30 | 持续交付中有哪些宝贵数据?
你好,我是王潇俊。今天我和你分享的主题是:持续交付中有哪些宝贵数据。
通过我前面和你分享的内容,相信你已经掌握了持续交付流水线所包含的五个主要动作:代码管理、环境管理、集成和编译管理、发布管理,以及测试管理。而且,你也应该已经初步掌握了建设持续交付体系的基本方法。
那么,如何使这个初步建立的持续交付体系更上一层楼呢?现在我们都选择用数据说话,所以优化一套系统的最好办法,就是从数据角度进行分析,然后找出优化方向,再进行具体的改进。
所以,我今天就分享一下,我在携程建设持续交付系统时,遇到的几个与数据密切相关的案例。通过对这些数据的分析,我们可以明确优化系统本身处理能力的方向,也可以快速发现日常工作中与持续交付相违背的行为,从而再次展现我们搭建的持续交付系统的作用。
## 案例1要用好的数据来衡量系统
让我记忆犹新的第一个案例,是我们持续交付平台刚上线时,就遇到了一个很大的问题。这个问题就是,这套系统的稳定性怎么样?
这个问题不仅老板会问你,用户会问你,其实你自己都会问自己。如果没有相关的数字指标,那我怎么证明这套系统的稳定性好呢?如果我无法证明这套系统的稳定性,又怎么说服整个公司,把它当做研发的核心流水线呢?
期间,我想过很多方案,比如用宕机时间来计算稳定性。但是实际使用起来,你就会发现,这个衡量指标很不靠谱。
第一,对于平台系统来说,有很多相关联的子系统,有些子系统属于旁支系统,对实际业务影响不大,而有些则影响非常大。那么,我怎么合理计算这些系统间的权重呢?
第二毕竟是一套对内的系统有的时候即使宕机了特别是在夜间因为没有用户使用其实际影响几乎为0而反之有的时候比如处在发布高峰的下午系统宕机则会产生较大的影响。所以用宕机时间这个指标衡量的话就会把这些影响摊平不能正确地反映真实的问题。
第三,宕机时间这个单一指标,不能全面地评价系统的稳定性。比如,有些子系统的运维会在宕机时进行降级(比如,增加排队时间等手段等等),使系统处于将死而不死状态。这种处理,虽然从业务的角度可以理解为降级,但却对系统的真实评价却起到了反作用。
其实上面的这三个问题,也会在真实的业务系统上碰到。所以,我们借鉴了携程业务系统的稳定性评估方案,最后决定采用如下的实施方案:
**首先,我们通过监控、保障、人为记录等手段,统计所有的故障时间**。需要统计的指标包括:开始时间、结束时间和故障时长。
**然后,计算过去三个月内这个时间段产生的持续交付平均业务量**。所谓业务量就是这个时间段内处理的代码提交、code review进行的编译、代码扫描、打包测试部署环境处理测试执行和生产发布的数量。
**最后,计算这个时间段内的业务量与月平均量相比的损失率**。这个损失率,就代表了系统的不稳定性率,反之就是稳定性率了。
这样计算得到的不稳定性率指标,就要比简单粗暴地用宕机时间要精确得多,也不再会遇到前面提到的三种问题。
由此得到的计算模型一旦固定下来,你只要做好业务量的数据统计,其计算难度也会不大。
因此,我推荐你也可以使用这个数据指标来衡量自己系统的稳定性。
## 案例2数据既要抓大势也要看细节
第二个让我映像深刻的案例,是一个与长尾数据有关的案例。
自从我们的持续交付平台在携程上线以后,一直颇受好评。当然,在系统上线后,我们也进行过几次优化,编译和打包速度被提升了非常多。而这些优化的方法,我也已经在专栏前面的文中进行了分享,如果有哪些不太清楚的地方,你可以去回顾一下这些文章,也可以给我留言我们一起讨论我在搭建系统时遇到的具体问题。
而且,我们运维团队也一直谨记,要通过数据分析不断优化系统。所以,我们一直非常关注总体的集成编译速度,因此除了追踪平均速度外,还会定期进行全量个例分析。
从整体的平均速度这个指标来看系统一直表现良好。但在99线以上我们却发现存在一些长尾特例。正常的Java代码平均编译时间大概在1分钟之内而这些特例却在7分钟以上。在几次的全量个例分析中我们虽然发现了这个问题但并没有特别关注。而且在查看了编译过程的几个主要计时点后我们也确实没有发现任何问题。
所以,这时我们都认为,这些长尾数据可能真的只是一些特殊个案。毕竟相对于每天几万次的集成编译来说,这个数量实在太小。
但就是这个小小的数据疏忽,我们差点忽略一个非常重要的故障点。随着时间的推移,我们发现这个长尾在慢慢变大。最终,我们还是尝试去一探究竟,发现原因其实是:
持续交付系统在打包之后会通过网络专线向另外一个IDC分发部署包和容器镜像。但由于历史原因两个IDC之间的防火墙对流量进行了不恰当的限制。随着持续交付在全公司的开展这个分发量也越来越大使网络流量达到了瓶颈从而形成了之前的长尾现象。
当然,这个问题的解决方案十分简单。但是,从中我们看到:**大的故障和影响,往往都是出于一些非常愚蠢的失误。**
所以,这个案例也一直在提醒着我,看数据不仅要抓大势,也要关注细节,特别是异常细节。
## 案例3数据可以推动持续交付
第三个案例是,关于怎么利用数据来改善业务开发团队的持续交付过程。
任何一个团队,都会有它自己的研发习惯、迭代速度以及交付频率。自从携程上线了持续交付平台之后,我们从数据上就能很明显地发现,每个团队乃至整个公司,每周的发布数据是一个固定的趋势。
从周跨度上看周三、周四为发布高峰从日的维度看中午12点开始发布数量逐步增加下午4点达到发布数据的高峰晚上7点之后发布数据逐步回落。
几乎每个团队的发布数据趋势都是这样只有少数几个团队呈现了不同的趋势它们的周趋势与其他团队基本一致但日趋势则非常不同高峰出现在下午5点然后立即回落且高峰值远远高于其他团队的平均值。
这是怎么回事呢很明显这是一种集中式发布的形态。但是我在携程也没听说过有这样的流程。之后我们经过了解发现这种集中发布的情况是这几个团队一直在沿用以前的发布模式即将所有发布会汇总到一个发布负责人处由他专门负责发布。所以为了方便工作这些发布负责人员选择在下午5点集中开始发布。
虽然这种做法和流程没什么问题,但却有违于我们推崇的“谁开发,谁运行”理念,并且也因此增加了一个实际不是必须的工作角色。在这之后,我们改造了这几个团队的流程,相当于是推动了整个公司的持续交付。
这个案例第一次让我们认识到,**我们可以用手上的数据去推动、去优化持续交付体系。**
这三个案例,都充分说明了数据对持续交付、持续交付平台的重要性,所以我们也要善用这些宝贵的数据。接下来,我再和你分享一下,持续交付体系中还有哪些数据值得我们关注。
## 常规系统指标数据列举
在日常工作中,我把需要关注的系统指标数据做了分类处理。这样,我可以通过这些数据指标去了解每一个持续交付子系统的当前状况,并确定需要优化的指标。
**第一类指标,稳定性相关指标**
作为基础服务,稳定性是我们的生命线。所以,对于所有的子系统,包括:代码管理平台、集成编译系统、环境管理系统、测试管理系统和发布系统,我们都会设立必要的稳定性指标,并进行数据监控。这些稳定性相关的数据指标,代表整个系统的可用度。
各系统的稳定性计算则可以参考第一个例子中的算法。
**第二类指标,性能相关指标**
与系统性能相关的指标,通常可以直接反应系统的处理能力,以及计算资源的使用情况。更重要的是,速度是我们对用户服务能力的直观体现。很多时候,系统的处理速度上去了,一些问题也就不再是问题了。比如,如果回滚速度这个指标非常优秀,那么业务发布时就会更有信心。
与性能相关的指标,我比较关注的有:
* push和fetch代码的速度
* 环境创建和销毁的速度;
* 产生仿真数据的速度;
* 平均编译速度及排队时长;
* 静态检查的速度;
* 自动化测试的耗时;
* 发布和回滚的速度。
**第三类指标,持续交付能力成熟度指标**
与持续交付能力成熟度相关的指标,可以帮助我们度量组织在持续交付能力上的缺陷,并加以改善。
不同的子系统,我关注的指标也不同。
* **与代码管理子系统相关的指标包括**commit的数量code review的拒绝率并行开发的分支数量。
这里需要注意的是,并行开发的分支数量并不是越多越好,而是要以每个团队都保持一个稳定状态为优。
* **与环境管理子系统相关的指标包括**:计算资源的使用率,环境的平均大小。
这里需要注意的是,我一直都很关注环境的平均大小这个数据。因为我们鼓励团队使用技术手段来避免产生巨型测试环境,从而达到提高利用率、降低成本的目的。而且,这个指标也可以从侧面反映一个团队利用技术解决问题的能力。
* **与集成编译子系统相关的指标包括**:每日编译数量,编译检查的数据。
我们并不会强制要求编译检查出的不良数据要下降,因为它会受各类外部因素的影响,比如历史代码问题等等。但,我们必须保证它不会增长。这也是我们的团队在坚守质量关的体现。
* **与测试管理子系统相关的指标包括**:单元测试的覆盖率,自动化测试的覆盖率。
这两个覆盖率代表了组织通过技术手段保证质量的能力,也是测试团队最常采用的数据指标。
* **与发布管理子系统相关的指标包括**:周发布数量,回滚比率。
发布数量的增加,可以最直观地表现交付能力的提升;回滚比率,则代表了发布的质量。综合使用周发布数量和回滚比例这两个指标,就可以衡量整个团队的研发能力是否得到了提升。
以上这些数据指标,就是我们在携程要关注的了。希望通过我对这些数据指标的介绍,可以帮助你了解如何衡量自己的持续交付体系,并通过分析这些数据找到优化当前体系的方向。
## 总结
今天我通过三个实际工作中的例子,和你分享了应该如何利用持续交付中产生的数据。
首先,你可以利用与业务量相关的数据模型来衡量持续交付系统的稳定性;
然后,在日常的数据分析中,除了要抓住主要数据的大趋势外,你还要关注那些异常的个性数据,它能帮你及早地发现问题;
最后,通过日常的数据分析,你也能发现持续交付流程上的一些问题,并协助团队一起改进。
当然,这只是三个比较突出的例子而已。在实践中,实施持续交付的过程中还有很多数据需要我们关注。我也一并把这些数据分成了三类,包括:
1. 稳定性相关指标;
2. 性能相关指标;
3. 持续交付能力成熟度指标。
希望这些案例,以及这些数据指标可以对你日常的分析工作有所帮助。
## 思考题
你有没有在推进持续交付过程中遇到一些阻力呢?你有没有尝试通过数据分析去解释和解决这些问题呢?你又有哪些案例,想要和我分享呢?
感谢你的收听,欢迎你给我留言。