分散式版本

回報問題 查看原始碼 。 。 。 。 夜間。 。 7.37.2 。 。 7.1 。 。 7.0 。 。 6.5

當程式碼集較大時,依附元件鏈結會變得非常深遠。 即使是簡單的二進位檔,通常也取決於數萬個建構目標。在 只是在合理的範圍內完成建構作業 來執行:沒有建構系統能運作基本原則 電腦硬體所施行的物理法則唯有這麼做 是一種支援分散式建構的建構系統,而這類系統的 系統執行的作業會分散於任意且可擴充 機器數量假設我們已將系統工作分割為更小的 因為這樣我們就能完成所有建構作業 大小隨位置調整這樣的擴充性 一直以來,我們已致力定義以構件為基礎的建構系統。

遠端快取

最簡單的分散式建構類型僅利用 remote 快取,如圖 1 所示。

採用遠端快取的分散式版本

圖 1. 顯示遠端快取的分散式版本

所有執行建構作業的系統,包括開發人員工作站和 與其他持續整合系統一樣,共用常見的遠端快取參照 課程中也會快速介紹 Memorystore 這是 Google Cloud 的全代管 Redis 服務這項服務可能是快速的本機短期儲存系統, Redis 或 Google Cloud Storage 等雲端服務。每當使用者需要 無論是直接建構構件,還是做為依附元件 遠端快取檢查是否已存在該構件。如果是, 開發人員可以下載構件而非建構構件否則系統會建構 成果,然後將結果傳回快取。也就是說 不會經常變動的低層級依附元件 可建構一次並共用 不必一一重新建構Google 對許多 構件是由快取提供,而非從頭開始建構 可降低建構系統的執行成本

為了讓遠端快取系統能夠順利運作,建構系統必須保證執行建構作業 完全可以重現也就是說,無論是建構目標 以找出該目標的輸入項目組合 在所有機器上產生的輸出內容都一樣這是將 確保下載構件的結果與結果相同 是自行建構的 AI 技術請注意,這種做法要求快取中的每個構件 將索引鍵設為索引鍵目標和輸入內容的雜湊值 工程師就能對同一個目標 遠端快取則會儲存所有產生的成果 確保資源正常且不會衝突

當然,遠端快取具有任何好處 構件需要比建構速度更快實際情況並非總是如此 尤其是在快取伺服器與執行建構的機器距離遙遠的情況下Google 並經過妥善調整 也就是預測結果

遠端執行

遠端快取並非真正的分散式版本。如果快取遺失 如要進行低階變更,您需要重建所有內容,但您仍然需要 在本機上執行整個建構作業真正的目標是提供支援 遠端執行,透過這種方式執行建構的實際作業 供任意數量的工作站使用圖 2 說明遠端執行系統。

遠端執行系統

圖 2. 遠端執行系統

在每位使用者的機器上執行建構工具 (使用者為人 工程或自動化建構系統) 會將要求傳送到中央建構主要執行個體。 建構主程序會將要求分解成其元件動作和排程 可在可擴充的工作站集區中執行這些動作。每個工作站 會根據使用者指定的輸入內容執行要求的動作 寫入產生的構件這些構件會互相共用 執行需要這些動作的機器 直到最終輸出內容可以 產生並傳送給使用者

實作這種系統最難的部分,就是管理通訊 工作站、主要執行個體和使用者本機電腦的區隔。工作站可能 取決於其他工作站產生的中繼成果,以及最終輸出內容 不必傳回至使用者的本機電腦為此,我們以 讓每個工作站寫入,以達到先前描述的分散式快取之目的 並在快取中讀取其依附元件主模塊 工作站從繼續到依賴的一切都完成為止 以便從快取中讀取輸入內容最終成品為 快取,允許本機電腦下載。請注意,我們也需要 透過獨立的方式,在使用者的原始碼樹狀結構中匯出本機變更。 而且工作人員可以在建構前套用變更

為執行這項作業,本文說明的構件式建構系統各部分 需要一起處理您必須完全建立建構環境 自主進行商業行為,讓我們無須人為介入,即可啟動員工。建構 容器本身也必須完全獨立,因為每個步驟 在不同機器上執行的應用程式輸出內容必須完全具確定性, 讓每個工作站都能信任從其他工作站收到的結果。這些 保證讓工作導向系統難以提供保證 因此根本不可能在 第一項。

Google 的分散式版本

自 2008 年起,Google 一直使用採用 AI 技術的分散式建構系統, 遠端快取和遠端執行,如圖 3 所示。

高階建構系統

圖 3. Google 的分散式建構系統

Google 的遠端快取稱為 ObjFS。由儲存的後端 建構輸出內容 以及名為 objfsd 的前端 FUSE Daemon 這類機制更為快速FUSE Daemon 可讓工程師瀏覽建構輸出內容,就像 通常是儲存在工作站中的一般檔案,但附帶檔案內容 只會按隨選下載、下載或下載 內容。隨需提供檔案內容會大幅減少網路和磁碟 相較於儲存資料 開發人員本機磁碟的所有建構輸出內容

Google 的遠端執行系統稱為 Forge。Blaze 中的 Forge 客戶 (Bazel 的內部對等項目) 稱為 發布商會將每個動作的要求傳送至 名為「排程器」的資料中心排程器會維護動作快取 結果,如果動作已有回應,可讓它立即傳回回應 是由系統其他任何使用者建立如果不是,則會將動作放入 佇列。大量執行器工作集區會持續讀取這個佇列中的動作。 執行指令,並將結果直接儲存在 ObjFS Bigtables 中。這些 結果將會提供給執行程式日後的動作 來回應使用者

最終結果是一套可擴充的系統,可有效支援所有建構作業 負責任職於 Google 的Google 版本的規模相當龐大:Google 執行數百萬個建構作業,執行數百萬個測試案例並產生 PB 規模的測試 每天從數十億行原始碼中輸出 所需內容不只是 此類系統可讓工程師迅速建構複雜的程式碼集, 導入大量自動化工具和系統 建構應用程式