Facebook是如何防止訊息系統在新年前夕發生崩潰?

banq發表於2018-12-29

這是一篇來自IEEE Spectrum的文章,Facebook的Messenger的13億使用者會在新年前夜集中傳送的訊息,比如新年快樂等祝願,這種傳送量比一年中任何其他日子都多得多。
如果一切順利,這些訊息將在不到100毫秒的時間內到達收件人,但是,如果訊息系統服務停止或失敗,位於公司紐約辦事處的一個小型軟體工程師團隊將不得不對其負責。
工程經理Isaac Ahdout和軟體工程師Thomas Georgiou都在該團隊中。他們全年都對應用程式進行了測試和調整,很快就會面臨最大的年度效能考試。Messenger的13億月活躍使用者會在新年前夜傳送的訊息,許多人在各自時區的午夜時間段會使用Messenger中點選按鈕“傳送”問候。
對於在一天或一年中的特定時間看到使用量急劇增加的網路或服務的任何人來說,這是一個熟悉的問題。由於類似的原因,美國電信公司經常在Super Bowls,州博覽會和總統就職典禮之前安裝新的基站。
對於Facebook的Messenger團隊來說,這種挑戰比將一個簡單的訊息從一個使用者直接傳送另一個使用者要稍微複雜一些。Facebook允許人們設定大型群組聊天,並在每次傳送,傳送或閱讀訊息時向發件人顯示結果,意味著必須在跨服務分發的訊息總數。
與平均日相比,使用者在新的一年中傳送和接收的照片和影片的比例也更高。人們經常會嘗試重新傳送似乎沒有立即透過的訊息,這些訊息會堆積更多的請求。

最大的擔心問題是:你如何防止這種級聯故障發生?

一種方法是提前進行廣泛的負載測試,模擬Facebook在新年前夜根據前幾年的活動預期的訊息量。(該公司拒絕分享其預測細節,並且不會說前幾年傳送了多少訊息。)。
例如,在上一個新年前夕,一個資料中心因收到的訊息量而堵塞,因此團隊將流量從該中心轉移到另一箇中心。在此事件發生後,該小組建立了工具,使他們能夠在今年更輕鬆地進行這些變更。

除了轉移負載之外,Messenger團隊還開發了其他槓桿,如果事情變得非常糟糕,它可以採取Pull拉的方式,傳送到伺服器的每條新訊息都作為名為Iris的服務的一部分進入佇列  。在那裡,訊息被分配超時設定,之後該訊息將從佇列中退出以為新訊息騰出空間。在高容量事件期間,這能讓團隊快速丟棄某些型別的訊息,例如讀取收據,以將其資源集中於提供使用者已經點選後組合的訊息。

Iris服務寧願傳送資訊並放棄閱讀回執,而不是丟棄資訊併傳送閱讀回執,這裡面有流量的優先順序設定。

還可以犧牲Messenger應用中表示朋友目前線上的功能,減慢線上情況的更新點頻率可以緩解網路擁塞,或者,團隊可以指示系統暫時延遲某些功能 - 例如刪除有關舊訊息的資訊 - 幾個小時以釋放通常執行該任務的CPU,以便在此刻處理更多訊息。
 
所有這些選擇都屬於“優雅回退”的概念。不是讓你的服務死亡,以至於沒有人使用它,會讓它變得不那麼棒,但人們仍然可以使用它。

除了這些努力之外,Messenger工程師還花費大量時間在旨在充分利用每臺伺服器內CPU和記憶體的效率專案上。例如,在2018年新年前夕,該團隊新增了一個排程程式,該程式允許系統將類似的訊息“批處理”在一起。伺服器同時收到很多請求,在向下遊傳送請求之前,您可以將其中的一些捆綁在一起。這樣做可以減少下游系統的計算負擔。

基於親和力聚合的原理形成批次一次性傳送訊息,這可以源自各種特徵,如果兩個訊息正在前往同一個接收者,或者需要來自後端的類似資源,則它們可能具有更高的親和力。隨著流量的增加,Messenger團隊可以更積極地擁有系統批處理。這樣做會將延遲(訊息的往返延遲)增加幾毫秒,但更有可能使所有訊息都透過。


 

相關文章