Facebook是如何防止消息系統在新年前夕發生崩潰?
知識
12-30
這是一篇來自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團隊可以更積極地擁有系統批處理。這樣做會將延遲(消息的往返延遲)增加幾毫秒,但更有可能使所有消息都通過。
打開今日頭條,查看更多圖片
※CGLIB(Code Generation Library) 介紹與原理
※DBScan+iris數據集實現+參數調節
TAG:程序員小新人學習 |