生产环境缺陷管理

简介: 软件开发中,bug难以避免,而多分支协作与异步沟通易致问题重复发生。百人团队协同成本剧增,人为疏漏不可避免。唯有通过自动化工具实现bug全流程管控,才能从“依赖不犯错”转向“无法犯错”,保障发布质量。

任何软件都会有bug。即使再全面的测试,再细致的代码review,也不能保证线上的每一段代码都bug-free。但是已经识别到的bug,为什么还会重复翻车呢?归根结底,git多分支开发模式会导致bug扩散。引入bug和发现和修复bug的时间异步,口头沟通确认bug易疏漏。
很多人看到前言的故障可能会认为,这只是“不小心”犯了个错误,下次再“细心”一点儿就好了。其实不是的,在百人规模的团队中,人犯错可以说是必然的。

图1 (Baron Schwartz "Approaching the Unacceptable Workload Boundary")
上图形象展示了人与人之间的协同成本。10人团队的整体协同一次的沟通次数为90/2=45次,那么100人则是4650次。这个次数只是相互协同一次,大多数场景下,由于bug和bugfix是随时出现的,再加上人的失误 (沟通中忘了某些bug等),所以一般来讲,一个发布流程至少需要前后同步三次,沟通成本巨大。所以谁能打包票,在这个流程中不犯错?只有通过工具来进行自动化管理才能保证从“不做错”到“做不错”。
如何使用
git-poison基于go-git的分布式源码管理,实现bug的追溯、查询和反馈,灵活&&可复制性高,适用于任何开发模式以及任意代码仓库。另外,git-poison不依赖人与人之间的协作沟通,减少认知负担沟通成本,自动化精准召回bug中毒域,实现poison commit发布阻塞。

图6 git-poison 投毒/解药/银针 (yum install git-poison)
对于开发者,只需要记住一件事:抓紧投毒!
回到前言说到的P1故障,使用git-poison就能简单有效避免“重复翻车”的场景:
● 值班:线上出现故障,定位问题。使用git-posion投毒。
● 开发:bug修复,使用git-poison解毒。
● 发布hotfix:发布完毕后,使用git-poison银针,确保线上所有带bug的版本,都带有本次的bugfix。
如何实现
每一次投毒/解毒,git-poison的poisons远程git仓库中都会生成/更新一条对应记录。不同代码仓库对应不同分支,隔离不同源的posions信息。
{ "poison":"1q234tre5467gcs7yui8ew13", "cure":"9875jgbsw32gtx6djri8sofi0h", "comment":"[to #12345678] service iohang", "editor":"Iris",}
check-commit则应用了git原生强大的history tree管理。

相关文章
|
1天前
|
存储 Java
Java泛型类型擦除以及类型擦除带来的问题
Java泛型在编译时会进行类型擦除,所有泛型信息被移除,仅保留原始类型。例如`List<String>`和`List<Integer>`在运行时均为`List`,类型参数被擦除,统一替换为`Object`或限定类型。通过反射可绕过泛型限制添加不同类型元素,证明泛型仅在编译期有效。
|
1天前
|
Java 调度
线程池
线程池通过复用线程提升性能,避免频繁创建与销毁的开销。它统一管理线程,提高资源利用率,防止过度切换。Java中通过Executor框架实现,核心类包括ExecutorService、ThreadPoolExecutor等,Executors为便捷工厂类,ScheduledThreadPoolExecutor支持定时调度,整体基于池化思想优化并发编程。
|
1天前
|
Java
ArrayList扩容机制
ArrayList初始化容量为0,添加第一个元素时触发扩容,minCapacity设为10,执行grow(),容量从0扩至10。后续添加元素至第10个时均不扩容。添加第11个时,minCapacity为11,大于当前容量10,再次调用grow(),新容量为15。grow()通过比较minCapacity与旧容量的1.5倍决定新容量,不超过最大值。注意:length用于数组,length()用于字符串,size()用于集合。
|
1天前
|
存储 网络协议 Linux
零拷贝
实现文件传输时,若采用传统read/write方式,每32KB需两次系统调用,引发4次上下文切换,1万次共4万次切换,性能低下。主因是频繁的用户态与内核态切换开销大,且数据需经内存缓冲中转。可优化为使用零拷贝技术(如sendfile),减少数据复制和上下文切换,提升传输效率。
|
1天前
|
缓存 Linux 调度
零拷贝2
进程上下文切换指从一个进程切换到另一个进程运行,需保存和恢复用户态与内核态资源,开销较大;而系统调用不切换进程,仅在内核态执行,开销较小。上下文切换涉及虚拟内存、栈、寄存器等的保存与恢复,频繁切换会消耗大量CPU时间,影响性能。Linux通过TLB加速地址转换,但切换时需刷新TLB,进一步增加成本。切换主要发生在时间片耗尽、资源不足、主动挂起、高优先级进程就绪或硬件中断等场景。
|
1天前
|
Linux 调度
零拷贝3
线程是调度的基本单位,进程是资源分配的基本单位。进程为线程提供虚拟内存等资源,线程间共享资源,切换时开销更小。中断会打断进程,引发上下文切换,消耗CPU资源。过多切换和内存拷贝降低性能,零拷贝技术通过减少切换与拷贝提升文件传输效率。
|
1天前
|
监控 算法 Unix
Thread.sleep(0) 到底有什么用
Thread.Sleep用于暂停线程执行,Sleep(1000)不保证精确唤醒时间,因CPU调度受优先级和竞争影响;Sleep(0)则触发系统立即重新分配CPU,让其他线程有机会运行,常用于避免界面假死。两者作用不同,不可简单省略。
|
1天前
|
存储 NoSQL 关系型数据库
1-MongoDB相关概念
MongoDB是一款高性能、无模式的文档型数据库,适用于高并发、海量数据、高扩展性场景。广泛应用于社交、游戏、物流、物联网及视频直播等领域,支持灵活的数据模型、丰富的查询及水平扩展,是Web2.0和大数据时代的理想选择。
|
1天前
|
存储 NoSQL 关系型数据库
4-MongoDB索引知识
MongoDB索引通过B树结构提升查询效率,避免全表扫描。支持单字段、复合、地理空间、文本和哈希索引,优化相等匹配、范围查询、排序及全文搜索,显著提升大数据量下的查询性能。
|
1天前
|
缓存 Java 数据库连接
Mybatis1.常见配置
MyBatis配置优先级:方法参数 > resource/url > properties内属性。核心设置包括缓存、延迟加载、主键生成等。支持多环境配置,通过environments指定,默认使用development。事务管理可选JDBC或MANAGED,与Spring集成时由Spring接管。

热门文章

最新文章