工具化法则

《卓越成效的程序员》是若干程序员系列书籍我比较喜欢的一本,类似的还有《卓越程序员密码》等。《卓越成效的程序员》高明之处是不仅仅给出原则,还大谈工具和代码,这如同诸多鸡汤文在”布道”的层面之下实战干货,深得广大从业人员喜爱。

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。

我们先来看这样一个例子:某团队在具体部署SystemP的持续集成的时候发现一个问题, SystemP重度依赖下游系统SystemQ,而SystemQ系统开发环境的不稳定导致CI经常大量失败,后面做了一个工具能够自动采集对下游成功调用的结果转换成缓存文件,后续的CI都使用这分生成的缓存文件,自动完成了对下游的隔离,极大的提升了CI稳定性。解决方案如下图所示:

0cfd462a98142a0d769b392c367c45c5.jpeg

在上图中,当内部节点C依赖下游系统(比如SystemQ),为了隔离下游系统的影响,开发了一个“mock拦截器”。mock拦截器实现思路如下图所示:

62460aa0c8c3aac7254d8b18f71bd5ee.jpeg

如上图所示,通过“mock数据是否存在的判断”,如果存在相关数据,直接从缓存中获取。

我们再来看一个场景。在SOA架构或者微服务架构中,联调是一个比较麻烦的事情,手工联调需要上下游多个系统约定时间,一起配合。好一点的做法是下游系统自己构造本地请求来模拟RPC调用,但是笔者遇到过这样的系统,这个系统是一个规则决策类系统,上游系统大约有20个,各自场景用例包括参数的不同组合达到10万这个级别,构造本地测试用例覆盖难度极高,且不易持续维护。于是团队同学就做了一点创新,思路也比较简单:做一个工具能够自动打印历史请求,然后通过工具平台将打印的请求重发到指定的服务器上, 提升了研发效率。

2b347f3bcf0908f5cfe3fe9328d3c8dd.jpeg

如上图所示,上游系统联调的时候调用服务接口,这个时候工具进行请求拦截,把上游请求序列化并保存下来。那么在下游要触发验证的时候,可以通过“重发工具平台”查找对应的日志,完成输入的触发。另外,在做回归测试的时候,采用类似的方法,可以从线上环境的用户真实访问日志提取用例导入到线下用例环境。

我们再看一个case,就是系统迁移,系统迁移往往涉及到多个烟囱型架构迁移到平台型架构,或者若干类似职责的系统统一到一个平台。一种常规的做法是先观察对比、再逐步切流、再下线老系统。笔者所在项目团队就曾开发过支持新老系统切流对比的工具。

为了确保新老服务结果的一致性和正确性,开发了一套切流对比工具,能够自动将一个接口的流量copy一份到另一个对应接口,执行完成后对两个接口的结果进行详细比对,验证正确性,在业务场景复杂的业务系统上,没有类似的工具保障,很难保证不出问题。该工具的实现示意图,如下所示。

f72dedcbd55d18d4d4c02ce6e621a0dc.jpeg

随着工具化思路的深入人心,各个产品、各个团队都会构建处理特定问题,或者相对宽泛领域的问题。这时候为了避免重复建设,应该进行相应的治理和统筹。笔者列举一些似曾相识的场景。

场景一:研发小李需要解决分布式系统的用例沉淀的问题,他做一个线上线下日志迁移的工具。

场景二:研发小周为了解决联调成本高,时间要求的问题,开发了前文介绍的“重发”工具平台。

场景三:SOA架构下,排查问题需要登录不同的系统去查看对应的日志文件,成本高,工具团队开发了一个基于traceId的日志关联工具。

场景四:测试工具团队开发了一个叫“望眼镜”的工具用于快速定位SOA架构下系统的复杂依赖关系中error的传递情况,并用时序图展示。

场景五:在优惠场景下,由于业务复杂度、优惠规则复杂度等各种原因,用户对于一个平台的支付工具使用存在认知偏差,对于支付的优惠券、红包和支付顺序可能存在疑惑,往往通过客服渠道反馈。客服一般求助产品经理或者技术同学,最终技术同学通过日志及数据库结合类似traceId进行排查。由于类似的查询场景比较高频,技术同学研发了一个平台,把查询的结果翻译成客服可以明白的业务语义内容,可以供客服自助查询。

场景六:工具团队开发了一个故障排查模块,因为SOA架构下,定位问题基本靠吼,比如交易大盘下跌了,各变更系统owner都会去看自身系统的错误情况,然后去人肉关联思考故障原因。能不能把这些经验通过一系列规则脚本承担下来呢?

通过6个场景,我们可以总结出下表。以上场景其实是冰山一角,如果在上千人的团队大团队,对于各种差异化的场景不可胜数,因此统一规划工具势在必行。

ce50cfab2b243d68ac70de038b162b99.jpeg

通过以上分析,可以得到一些阶段性结论。比如“故障排查模块”用于线上,而且用于即时的故障定位,那么日志数据不用单独存储,重点在快、准,这个工具是单独一套架构体系。而“望眼镜”这个工具如果也是瞬间定位,那么完全可以复用“故障排查模块”的核心能力,“系统调用时序图”是增强的一个特性而已。

结论:统一工具平台,可以考虑不同工具层次,能复用的尽量复用,并且注意平台的开放性,比如插件化能力。而对于目标和实现方案差异很大的平台,则可以分别建设。比如“业务优惠查询工具”需要处理几天甚至1个月前的用户投诉,在数据上面需要从日志提取、转换和专门存储。而“故障排查模块”在于解决故障的快速定位问题,超过1个小时的定位无法容忍,日志文件默认7天,则不需要把目标数据从日志提取,专门存储。这是2个工具最大的差异,应该分别建设为宜。

PS:本文选自右军专栏《20年职业50个思考与洞察》

e0a27bc5dc5760b1a47298cf9b50b851.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/254116.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用openMVS库,在VS2022中启用c++17标准编译仍然报错

使用openMVS库,在VS2022中启用c17标准编译仍然报错 现象 项目中引用了某些开源库(例如openmvs2.1.0),编译时要求启用编译器对c17的支持。 没问题!大家都知道在下图所示的位置调整C语言标准: 但是&#…

【Transformer】Transformer and BERT(1)

文章目录 TransformerBERT 太…完整了!同济大佬唐宇迪博士终于把【Transformer】入门到精通全套课程分享出来了,最新前沿方向 学习笔记 Transformer 无法并行,层数比较少 词向量生成之后,不会变,没有结合语境信息的情…

动态加载库

no_mangle 不要改标识符 首先是认识这个标注:mangle,英文的含义“撕裂、碾压”。我第一次把这个单次误以为是manage,说实话两个单词还挺像的。 RUS中函数或静态变量使用#[no_mangle]这个标注属性后,编译器就不会修改它们的名字了…

机器学习 | KNN算法

一、KNN算法核心思想和原理 1.1、怎么想出来的? 近朱者赤,近墨者黑! 距离决定一切、民主集中制 1.2、基本原理 —— 分类 k个最近的邻居 民主集中制投票分类表决与加权分类表决 1.3、基本原理 —— 回归 计算未知点的值决策规则不同均值法与…

windows10-EMQX与MQTTX的安装及配置使用教程

windows10-EMQX安装及配置使用教程 一、下载安装1.1 下载1.2 安装1.3 设置开机自启动 二、连接MQTT2.1 MQTT下载安装2.1.1 下载2.1.2 安装及配置 三、EMQX常用命令 本文介绍的是在windows10系统下的emqx的安装、配置及使用教程。 一、下载安装 1.1 下载 下载链接&#xff1a…

设计模式之创建型设计模式(一):单例模式 原型模式

单例模式 Singleton 1、什么是单例模式 在软件设计中,单例模式是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。 这意味着无论何时需要该类的实例,都可以获得相同的实例,而不会创建…

1.新入手的32位单片机资源和资料总览

前言: 学了将近1年的linux驱动和uboot,感觉反馈不足,主要是一直在学各种框架,而且也遇到了门槛,比如驱动部分,还不能随心所欲地编程,原因是有些外设的原理还不够深刻、有些复杂的底层驱动的代码…

Vue3知识点总结

目录 一.创建Vue2工程 1.使用 vue-cli 创建 2.使用 vite 创建 二.常用 Composition API setup ref函数 reactive函数 计算属性与监视 1.computed函数 2.watch函数 3.watchEffect函数 一.创建Vue2工程 1.使用 vue-cli 创建 查看vue/cli版本,确保vue/cli版本…

【2023海光杯】“智能储物柜系统”电控部分

简单说明 在代码实现部分会给出设计理念和分析,整体资源可以直接下载压缩包(手机端依然看不到,还是不知道为什么)。 使用设备 按照题目要求需要制作16个储物格,对应16扇门。16扇门的开关可以用矩阵键盘来控制。 在不考…

C# 基本桌面编程(二)

一、前言 本章为C# 基本桌面编程技术的第二节也是最后一节。前一节在下面这个链接 C# 基本桌面编程(一)https://blog.csdn.net/qq_71897293/article/details/135024535?spm1001.2014.3001.5502 二、控件布局 1 叠放顺序 在WPF当中布局,通…

【咕咕送书 | 第7期】深入探索Spring Batch:大规模批处理的领航者

🎬 鸽芷咕:个人主页 🔥 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式:关注博主、点赞、收藏、评论,任意评论(每人最多评论…

bp神经网络对csv文件或者xlsx文件进行数据预测

1.input(1:m,:)‘含义 矩阵A第一列的转置矩阵。(x,y)表示二维矩阵第x行第y列位置的元素,x为:则表示所有的行。因此,A(:,1)就表示A的第1列的所有元素,这是一个列向量。 所以这里input(1:m,:)表示1到m行,所有列,而后面…

Win32程序与MFC程序构建顺序梳理

Windows程序的生成顺序 Windows窗口的生命周期 初始化操作 从WinMain函数开始,注册窗口;创建窗口; 调用CreateWindow,为程序建立了一个窗口,作为程序的屏幕 舞台。CreateWindow产生窗口之后会送出WM_CREATE消息给窗口函数&…

人工智能中的核心概念

1 概述 人工智能英文缩写为AI,是一种由人制造出来的机器,该机器可以模仿人的思想和行为,从而体现出一种智能的反应。 人工智能的产业链分为基础层、技术层、应用层三个层次。 基础层包括:芯片、大数据、算法系统、网络等多项基础…

企业呼叫中心系统怎么样?

随着现代商业环境的变化,呼叫中心系统成为众多企业日常运营的重要组成部分。企业呼叫中心系统是一种集中管理和处理企业电话通信的解决方案,它可以改善客户服务质量,提升服务效率,并为企业带来诸多优势。 企业呼叫中心系统功能概…

2021年数维杯国际大学生数学建模D题2021年电影市场票房波动模型分析求解全过程文档及程序

2021年数维杯国际大学生数学建模 D题 2021年电影市场票房波动模型分析 原题再现: 1、电影票房预测建模背景   随着人们文化消费需求的增加,电影院和银幕的数量不断增加,我国的电影产业不断呈现出繁荣景象。2019年,全国电影票房…

2024年【金属非金属矿山(地下矿山)安全管理人员】及金属非金属矿山(地下矿山)安全管理人员实操考试视频

题库来源:安全生产模拟考试一点通公众号小程序 金属非金属矿山(地下矿山)安全管理人员是安全生产模拟考试一点通总题库中生成的一套金属非金属矿山(地下矿山)安全管理人员实操考试视频,安全生产模拟考试一…

libxls - 编译

文章目录 libxls - 编译概述笔记静态库工程测试控制台exe工程测试备注备注END libxls - 编译 概述 想处理.xls格式的excel文件. 查了一下libxls库可以干这个事. 库地址 https://github.com/libxls/libxls.git 但是这个库的makefile写的有问题, 在mingw和WSL下都编译不了. 好在…

1265. 数星星(树状数组/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 5 1 1 5 1 7 1 3 3 5 5输出样例&#xff1a; 1 2 1 1 0 思路&#xff1a; 树状数组 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std; const int N32010; int n; int tr[N],level[N];int lo…

Linux---用户组相关操作

1. 创建用户组 命令说明groupadd创建(添加)用户组 创建用户组效果图: 2. 创建用户并指定用户组 创建用户并指定用户组效果图: 3. 修改用户组 修改用户组效果图: 4. 删除用户组 命令说明groupdel删除用户组 删除用户组效果图: 说明: 如果用户组下面有用户先删除用户在…