淘寶notify-訊息中介軟體(2)
核心原理
Notify在設計思路上與傳統的MQ有一定的不同,他的核心設計理念是
為了訊息堆積而設計系統
無單點,可自由擴充套件的設計
下面就請隨我一起,進入到我們的訊息系統內部來看看他設計的核心原理
為了訊息堆積而設計系統在市面上的大部分MQ產品,大部分的核心場景就是點對點的訊息傳輸通道,然後非常激進的使用記憶體來提升整體的系統性能,這樣做雖然標稱的tps都能達到很高,但這種設計的思路是很難符合大規模分散式場景的實際需要的。
在實際的分散式場景中,這樣的系統會存在著較大的應用場景瓶頸,在後端有大量消費者的前提下,消費者出現問題是個非常常見的情況,而訊息系統則必須能夠在後端消費不穩定的情況下,仍然能夠保證使用者寫入的正常並且TPS不降,是個非常考驗訊息系統能力的實際場景。
也因為如此,在Notify的整體設計中,我們最優先考慮的就是訊息堆積問題,在目前的設計中我們使用了持久化磁碟的方式,在每次使用者發訊息到Notify的時候都將訊息先落盤,然後再非同步的進行訊息投遞,而沒有采用激進的使用記憶體的方案來加快投遞速度。
這種方式,雖然系統性能在峰值時比目前市面的MQ效率要差一些,但是作為整個業務邏輯的核心單元,穩定,安全可靠是系統的核心訴求。
無單點,可自由擴充套件的設計
圖3-5展示了組成Notify整個生態體系的有五個核心的部分。
傳送訊息的叢集這主要是業務方的機器,這些APP的機器上是沒有任何狀態資訊的,可以隨著使用者請求量的增加而隨時增加或減少業務傳送方的機器數量,從而擴大或縮小叢集能力。
配置伺服器叢集(Config server)這個叢集的主要目的是動態的感知應用叢集,訊息叢集機器上線與下線的過程,並及時廣播給其他叢集。如當業務接受訊息的機器下線時,config server會感知到機器下線,從而將該機器從目標使用者組內踢出,並通知給notify server,notify server 在獲取通知後,就可以將已經下線的機器從自己的投遞目標列表中刪除,這樣就可以實現機器的自動上下線擴容了。
訊息伺服器(Notify Server)訊息伺服器,也就是真正承載訊息傳送與訊息接收的伺服器,也是一個叢集,應用傳送訊息時可以隨機選擇一臺機器進行訊息傳送,任意一臺server 掛掉,系統都可以正常執行。當需要增加處理能力時,只需要簡單地增加notify Server就可以了
儲存(Storage)Notify的儲存叢集有多種不同的實現方式,以滿足不同應用的實際儲存需求。針對訊息安全性要求高的應用,我們會選擇使用多份落盤的方式儲存訊息資料,而對於要求吞吐量而不要求訊息安全的場景,我們則可以使用記憶體儲存模型的儲存。自然的,所有儲存也被設計成了隨機無狀態寫入儲存模型以保障可以自由擴充套件。
訊息接收叢集業務方用於處理訊息的伺服器組,上下線機器時候也能夠動態的由config server 感知機器上下線的時機,從而可以實現機器自動擴充套件。
3.2、Notify雙11準備與優化
在雙11的整個準備過程中,Notify都承載了非常巨大的壓力,因為我們的核心假定就是後端系統一定會掛,而我們需要能夠承載整個交易高峰內的所有訊息都會堆積在資料庫內的實際場景。
在多次壓測中,我們的系統表現還是非常穩定的,以60w/s的寫入量堆積4.5億訊息的時候,整個系統表現非常淡定可靠。在真正的大促到來時,我們的後端系統響應效率好於預期,所以我們很輕鬆的就滿足了使用者所有訊息投遞請求,比較好的滿足了使用者的實際需要。