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