Notify是淘寶自主研發的一套消息服務引擎,是支撐雙11最為核心的系統之一,在淘寶和支付寶的核心交易場景中都有大量使用。消息系統的核心作用就是三點:解耦,異步和并行。下面讓我以一個實際的例子來說明一下解耦異步和并行分別所代表的具體意義吧:
假設我們有這么一個應用場景,為了完成一個用戶注冊淘寶的操作,可能需要將用戶信息寫入到用戶庫中,然后通知給紅包中心給用戶發新手紅包,然后還需要通知支付寶給用戶準備對應的支付寶賬號,進行合法性驗證,告知sns系統給用戶導入新的用戶等10步操作。
那么針對這個場景,一個最簡單的設計方法就是串行的執行整個流程,如圖3-1所示:
圖3-1-用戶注冊流程
這種方式的最大問題是,隨著后端流程越來越多,每步流程都需要額外的耗費很多時間,從而會導致用戶更長的等待延遲。自然的,我們可以采用并行的方式來完成業務,能夠極大的減少延遲,如圖3-2所示。
圖3-2-用戶注冊流程-并行方式
但并行以后又會有一個新的問題出現了,在用戶注冊這一步,系統并行的發起了4個請求,那么這四個請求中,如果通知SNS這一步需要的時間很長,比如需要10秒鐘的話,那么就算是發新手包,準備支付寶賬號,進行合法性驗證這幾個步驟的速度再快,用戶也仍然需要等待10秒以后才能完成用戶注冊過程。因為只有當所有的后續操作全部完成的時候,用戶的注冊過程才算真正的“完成”了。用戶的信息狀態才是完整的。而如果這時候發生了更嚴重的事故,比如發新手紅包的所有服務器因為業務邏輯bug導致down機,那么因為用戶的注冊過程還沒有完全完成,業務流程也就是失敗的了。這樣明顯是不符合實際的需要的,隨著下游步驟的逐漸增多,那么用戶等待的時間就會越來越長,并且更加嚴重的是,隨著下游系統越來越多,整個系統出錯的概率也就越來越大。
通過業務分析我們能夠得知,用戶的實際的核心流程其實只有一個,就是用戶注冊。而后續的準備支付寶,通知sns等操作雖然必須要完成,但卻是不需要讓用戶等待的。
這種模式有個專業的名詞,就叫最終一致。為了達到最終一致,我們引入了MQ系統。業務流程如下:
主流程如圖3-3所示:
圖3-3-用戶注冊流程-引入MQ系統-主流程
異步流程如圖3-4所示:
圖3-4-用戶注冊流程-引入MQ系統-異步流程
核心原理
Notify在設計思路上與傳統的MQ有一定的不同,他的核心設計理念是
1. 為了消息堆積而設計系統
2. 無單點,可自由擴展的設計
下面就請隨我一起,進入到我們的消息系統內部來看看他設計的核心原理
圖3-5-Notify系統組成結構
圖3-5展示了組成Notify整個生態體系的有五個核心的部分。
METAQ是一款完全的隊列模型消息中間件,服務器使用Java語言編寫,可在多種軟硬件平臺上部署。客戶端支持Java、C++編程語言,已于2012年3月對外開源,開源地址是:http://metaq.taobao.org/。MetaQ大約經歷了下面3個階段
綜上,MetaQ借鑒了Kafka的思想,并結合互聯網應用場景對性能的要求,對數據的存儲結構進行了全新設計。在功能層面,增加了更適合大型互聯網特色的功能點。
MetaQ簡介
圖3-6-MetaQ整體結構
如圖3-6所示,MetaQ對外提供的是一個隊列服務,內部實現也是完全的隊列模型,這里的隊列是持久化的磁盤隊列,具有非常高的可靠性,并且充分利用了操作系統cache來提高性能。
MetaQ存儲結構
MetaQ的存儲結構是根據阿里大規模互聯網應用需求,完全重新設計的一套存儲結構,使用這套存儲結構可以支持上萬的隊列模型,并且可以支持消息查詢、分布式事務、定時隊列等功能,如圖3-7所示。
圖3-7-MetaQ存儲體系
MetaQ單機上萬隊列
MetaQ內部大部分功能都靠隊列來驅動,那么必須支持足夠多的隊列,才能更好的滿足業務需求,如圖所示,MetaQ可以在單機支持上萬隊列,這里的隊列全部為持久化磁盤方式,從而對IO性能提出了挑戰。MetaQ是這樣解決的
通過以上方式,既做到數據可靠,又可以支持更多的隊列,如圖3-8所示。
圖3-8-MetaQ單機上萬隊列
MetaQ與Notify區別
上一篇 Symfony入門-YAML