Facebook 如何實現大規模快速發布

2021-09-17 05:49:58 字數 1789 閱讀 2791

不久前有篇關於縮短 facebook 發布流程的文章,闡述了將**投入生產的靈活方法。這篇文章著重講述了他們在一年之內如何從「 cherry-picking 」公升級到「 push-from-master 」策略。早些時候, facebook 也

分享了他們部署過程的細節。作者 chuck rossi 是 facebook 的首位發布工程師,目前是 facebook 發布工程的工程總監。

\\ facebook 的發布週期是「 quasi-continuous 」 (準連續)——這只是一種委婉的說法,表明並非每次提交都會部署到生產環境,實際上它採用的是對幾十到幾百個提交進行批處理,每隔幾個小時就進行推送。這種分層發布的方式使任何變更的回滾很容易。

\\ 這個新系統從 2016 年 4 月開始,經過一年的時間慢慢地完善。早先的模式是從主幹分支的提交中選擇特定的變更放到發布分支上。發布分支每天將這些變更推送到生產環境。這種「 cherry-picking 」的特點是,每天選擇變更的數量為 500 ~ 1000。剩下的變更就推入到每週發布分支中。隨著時間的推移,提交的數量和參與其中的工程師都有所增加,發布工程師的手工勞動變得過多,以至於無法持續。

\\ 這個 cd 系統的關鍵元件是一種控制方法,即誰將接收變更,以及用於部署和測量的自動化工具。在第一步中,經過一系列自動化測試後,變更就從內部推送到 facebook 員工。在這一階段發現的任何回歸,都會被認為這一程序受阻或者停止。下一步涉及到「 canary deployment 」(金絲雀部署),只推送至生產環境的 2% 。依靠連續的監測來檢測問題。如果一切順利,這些變更將 100% 部署到生產環境中。名為 flytrap 的工具收集使用者報告,並傳送任何異常情況的告警。

\\ 來自:

\\ facebook 中的 web 和移動產品遵循兩條不同的路徑,原生移動變更的部署頻率低於 web 。這兩個都由名為 gatekeeper 的系統控制。除此之外,gatekeeper 還分離出了部署和發布。這種分離帶來了挑戰,包括維護向下相容性。

\\ 由於工具和部署選項的性質,移動持續部署面臨著一些特定的挑戰。web 部署則更為容易,因為 facebook 擁有完整的技術棧和工具。為了解決這些挑戰,facebook 已經構建了一些專注於更快的移動開發的工具和庫,包括 buck、phabricator、 infer、 react 以及 nuclide 。facebook 的移動部署是以三層來併發執行。\\

在**變更的生命週期內,每次提交都會執行移動構建並執行測試棧,這樣就會執行很多次。單單 android 一天就有 5 萬到 6 萬個構建版本。移動部署系統遵循較早的基於 web 的模式,每週發布一次,按 cherry-picking 策略隨機選擇變更。儘管**傳輸速度和發布頻率有所增長,但工程師的生產率保持不變。然而,本文提到的標準(**行和推送次數),可能並非

衡量生產率的最佳標準。

\\ 據 2016 年 ieee 的**和相關討論,facebook 早在 2005 年就利用了某種形式的 cd。該**中的一些結論列出了 cd 成功的先決條件:可觀的持續投資、高度熟練的開發人員、強大的技術管理,開放和平等的文化,風險回報權衡管理、客觀回顧失敗以及有專注力的小團隊。

\\ facebook 的準連續部署系統具備這幾個優點:沒有推送熱補丁的手工開銷,對分布式工程師團隊有更好的支援,為工程師提供了更快的反饋迴圈。

\\檢視英文原文:how facebook achieves rapid release at massive scale

\\ 感謝張衛濱對本文的審校。

\\

Facebook 如何實現大規模快速發布

不久前有篇關於縮短 facebook 發布流程的文章,闡述了將 投入生產的靈活方法。這篇文章著重講述了他們在一年之內如何從 cherry picking 公升級到 push from master 策略。早些時候,facebook 也 分享了他們部署過程的細節。作者 chuck rossi 是 fa...

python實現Simhash處理大規模文字相似度

simhash 顧名思義,通過hash值比較相似度,通過兩個字串得出來的hash值,進行異或操作,然後得到相差的個數,數字越大則差異越大。1 用分詞工具 jieba nlpir 哈工大分詞器等 對字串進行分詞 去除停用詞,英文除外 seg jieba.cut str keyword jieba.an...

大規模機器學習

如果我們有乙個低方差的模型,增加資料集的規模可以幫助你獲得更好的結果。我們應 該怎樣應對乙個有 100 萬條記錄的訓練集?以線性回歸模型為例,每一次梯度下降迭代,我們都需要計算訓練集的誤差的平方和,如果我們的學習演算法需要有 20 次迭代,這便已經是非常大的計算代價。首先應該做的事是去檢查乙個這麼大...