我們最近啟動了一個小型項目,以清理系統各部分在 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