我们最近启动了一个小项目,以清理系统各部分在 Buffer 的幕后通信方式。一些快速背景信息:我们使用一种称为 SQS(Amazon Simple Queue Service)的东西。这些队列就像任务等待室。我们系统的一部分发出消息,另一部分稍后再接收。可以将其想象为给同事留一张便条:“嘿,当你有机会时,处理此数据。”发送便条的系统不必等待响应。我们的项目是执行日常维护:更新我们用来在本地测试队列并清理其配置的工具。但是,当我们规划出我们实际使用的队列时,我们发现了一些我们没有想到的东西:七个不同的后台进程(或 cron 作业,它们是自动运行的计划任务)和已经静默运行长达五年的工作人员。所有这些都完全没有做任何有用的事情。这就是为什么这很重要,我们如何找到它们,以及我们做了什么。为什么这比你想象的更重要是的,运行不必要的基础设施成本。我快速计算了一下,对于其中一名工人,我们在 5 年内支付的费用约为 360-600 美元,但对于一个无所作为的流程来说,这绝对是浪费。但是,在完成这次清理之后,我认为财务成本实际上是问题的最小部分。每次新工程师加入团队并探索我们的系统时,他们都会遇到这些神秘的流程。我们都经历过这样的情况——盯着一段代码,害怕触碰它,因为它可能正在做一些重要的事情。即使是“被遗忘的”基础设施,有时也需要关注,当其他事情发生变化时,这会导致我们的团队在毫无意义的代码路径上花费维护周期。随着时间的推移,这种制度知识会逐渐消失吗?创建它的人几年前就离开了公司,而环境也随之消失了。这是怎么发生的?很容易指责,但事实是,这种情况在任何长期存在的系统中都会自然发生。某个功能被弃用,但支持它的后台作业仍在运行,有人“临时”启动一个工作程序来处理迁移,并且在架构更改后它永远不会被拆除,但没有人想到检查。为此,我们运行了一个检查整个数据库的生日电子邮件的计划任务。在 2020 年的重构中,我们更换了事务性电子邮件工具,但忘记删除这个工作程序——它又继续运行了五年。这些都不是个人的失败——它们是流程的失败,如果我们的工作方式没有刻意的清理,熵就会获胜。我们的架构如何帮助我们找到它和许多公司一样,Buffer 几年前就接受了微服务运动(一种流行的方法,公司将其代码拆分为许多小型独立服务)。我们的整体架构分为单独的服务,每个服务都有自己的存储库、部署管道和基础设施。当时,这是有道理的:每个服务都可以单独部署,团队之间有明确的界限。但多年来,我们发现管理数十个存储库的开销超过了我们规模的团队的收益,因此我们将服务合并为一个多服务单一存储库,但它们仍然存在于一个地方。事实证明,这使得发现成为可能。在微服务世界中,每个存储库都是它的。一个存储库中被遗忘的工作人员可能永远不会被在另一个存储库中工作的工程师注意到。没有一个地方可以搜索队列名称,也没有统一的视图来了解正在运行的内容。通过一个存储库中的所有内容,我们最终可以跟踪每个队列的消费者和生产者。我们可以找到引用不再存在的队列的工作人员。合并的目的不是为了帮助我们找到僵尸基础设施。发现几乎是不可避免的。我们实际上做了什么 一旦我们识别出孤立进程,我们就必须决定如何处理它们。我们是这样处理的。首先,我们追踪每个问题的起源。我们深入研究 git 历史和旧文档,以了解为什么每个工作人员首先被创建。在大多数情况下,最初的目的很明确:一次性数据迁移、一项已被淘汰的功能、一种不再有用的临时解决方法。然后我们确认它们确实未被使用。在删除任何内容之前,我们添加了日志记录以验证这些进程没有悄悄执行我们错过的重要操作。我们监控了几天,以确保它们根本没有被调用,然后我们逐步删除它们。我们并没有立即删除所有内容。我们一一删除了进程,观察是否有任何意外的副作用。 (幸运的是,没有。)最后,我们记录了我们学到的东西。我们在内部文档中添加了关于每个流程最初执行的操作以及删除原因的注释,因此未来的工程师不会怀疑是否丢失了重要的内容。清理后发生了什么变化我们仍处于衡量全面影响的早期阶段,但这是我们迄今为止所看到的。我们的基础设施清单现在是准确的。当有人问:“我们运行什么工人?”我们实际上可以自信地回答这个问题。入职对话也变得更加简单。新工程师不会偶然发现神秘的流程并怀疑它们是否缺少上下文。代码库反映了我们实际所做的事情,而不是我们五年前所做的事情。将重构视为考古学和预防。我从这个项目中得到的最大收获是:每一次重要的重构都是考古学的机会。当您深入系统,真正了解各个部分如何连接时,您就处于完美的位置来质疑还需要什么。来自某个旧项目的队列?有人为一次性数据迁移创建的工作人员?计划任务引用了您从未听说过的功能?它们可能仍在运行。以下是我们在未来流程中构建的内容:在任何重构过程中,问问:还有哪些东西触及了这个系统,而我们已经有一段时间没有关注了?当弃用某个功能时,将其一直跟踪到其后台进程,而不仅仅是面向用户的代码。当有人离开团队时,记录他们负责的内容,尤其是在后台运行的内容。我们的代码库中仍有较旧的部分尚未迁移到单个存储库。随着我们不断巩固,我们有信心会发现更多这些隐藏的遗迹。但现在我们已经准备好捕获它们并防止形成新的代码。当所有代码都位于一个地方时,孤立的基础设施就无处可藏。

You May Also Like

Enjoyed This Article?

Get weekly tips on growing your audience and monetizing your content — straight to your inbox.

No spam. Join 138,000+ creators. Unsubscribe anytime.

Create Your Free Bio Page

Join 138,000+ creators on Seemless.

Get Started Free