消息中間件Notify和MetaQ-阿里中間件

3.一、Notify

Notify是淘寶自主研發的一套消息服務引擎,是支撐雙11最爲核心的系統之一,在淘寶和支付寶的核心交易場景中都有大量使用。消息系統的核心做用就是三點:解耦,異步和並行。下面讓我以一個實際的例子來講明一下解耦異步和並行分別所表明的具體意義吧:git

假設咱們有這麼一個應用場景,爲了完成一個用戶註冊淘寶的操做,可能須要將用戶信息寫入到用戶庫中,而後通知給紅包中心給用戶發新手紅包,而後還須要通知支付寶給用戶準備對應的支付寶帳號,進行合法性驗證,告知sns系統給用戶導入新的用戶等10步操做。github

那麼針對這個場景,一個最簡單的設計方法就是串行的執行整個流程,如圖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. 無單點,可自由擴展的設計

下面就請隨我一塊兒,進入到咱們的消息系統內部來看看他設計的核心原理

    1. 爲了消息堆積而設計系統在市面上的大部分MQ產品,大部分的核心場景就是點對點的消息傳輸通道,而後很是激進的使用內存來提高總體的系統性能,這樣作雖然標稱的tps都能達到很高,但這種設計的思路是很難符合大規模分佈式場景的實際須要的。 
      在實際的分佈式場景中,這樣的系統會存在着較大的應用場景瓶頸,在後端有大量消費者的前提下,消費者出現問題是個很是常見的狀況,而消息系統則必須可以在後端消費不穩定的狀況下,仍然可以保證用戶寫入的正常而且TPS不降,是個很是考驗消息系統能力的實際場景。 
      也由於如此,在Notify的總體設計中,咱們最優先考慮的就是消息堆積問題,在目前的設計中咱們使用了持久化磁盤的方式,在每次用戶發消息到Notify的時候都將消息先落盤,而後再異步的進行消息投遞,而沒有采用激進的使用內存的方案來加快投遞速度。 
      這種方式,雖然系統性能在峯值時比目前市面的MQ效率要差一些,可是做爲整個業務邏輯的核心單元,穩定,安全可靠是系統的核心訴求。
    2. 無單點,可自由擴展的設計

 

圖3-5-Notify系統組成結構

圖3-5展現了組成Notify整個生態體系的有五個核心的部分。

  • 發送消息的集羣這主要是業務方的機器,這些APP的機器上是沒有任何狀態信息的,能夠隨着用戶請求量的增長而隨時增長或減小業務發送方的機器數量,從而擴大或縮小集羣能力。
  • 配置服務器集羣(Config server)這個集羣的主要目的是動態的感知應用集羣,消息集羣機器上線與下線的過程,並及時廣播給其餘集羣。如當業務接受消息的機器下線時,config server會感知到機器下線,從而將該機器從目標用戶組內踢出,並通知給notify server,notify server 在獲取通知後,就能夠將已經下線的機器從本身的投遞目標列表中刪除,這樣就能夠實現機器的自動上下線擴容了。
  • 消息服務器(Notify Server)消息服務器,也就是真正承載消息發送與消息接收的服務器,也是一個集羣,應用發送消息時能夠隨機選擇一臺機器進行消息發送,任意一臺server 掛掉,系統均可以正常運行。當須要增長處理能力時,只須要簡單地增長notify Server就能夠了
  • 存儲(Storage)Notify的存儲集羣有多種不一樣的實現方式,以知足不一樣應用的實際存儲需求。針對消息安全性要求高的應用,咱們會選擇使用多份落盤的方式存儲消息數據,而對於要求吞吐量而不要求消息安全的場景,咱們則可使用內存存儲模型的存儲。天然的,全部存儲也被設計成了隨機無狀態寫入存儲模型以保障能夠自由擴展。
  • 消息接收集羣業務方用於處理消息的服務器組,上下線機器時候也可以動態的由config server 感知機器上下線的時機,從而能夠實現機器自動擴展。

3.三、MetaQ

METAQ是一款徹底的隊列模型消息中間件,服務器使用Java語言編寫,可在多種軟硬件平臺上部署。客戶端支持Java、C++編程語言,已於2012年3月對外開源,開源地址是: http://metaq.taobao.org/ 。MetaQ大約經歷了下面3個階段

  • 在2011年1月份發佈了MetaQ 1.0版本,從Apache Kafka衍生而來,在內部主要用於日誌傳輸。
  • 在2012年9月份發佈了MetaQ 2.0版本,解決了分區數受限問題,在數據庫binlog同步方面獲得了普遍的應用。
  • 在2013年7月份發佈了MetaQ 3.0版本,MetaQ開始普遍應用於訂單處理,cache同步、流計算、IM實時消息、binlog同步等領域。MetaQ3.0版本已經開源, 參見這裏

綜上,MetaQ借鑑了Kafka的思想,並結合互聯網應用場景對性能的要求,對數據的存儲結構進行了全新設計。在功能層面,增長了更適合大型互聯網特點的功能點。

 

圖3-6-MetaQ總體結構

如圖3-6所示,MetaQ對外提供的是一個隊列服務,內部實現也是徹底的隊列模型,這裏的隊列是持久化的磁盤隊列,具備很是高的可靠性,而且充分利用了操做系統cache來提升性能。

  • 是一個隊列模型的消息中間件,具備高性能、高可靠、高實時、分佈式特色。
  • Producer、Consumer、隊列均可以分佈式。
  • Producer向一些隊列輪流發送消息,隊列集合稱爲Topic,Consumer若是作廣播消費,則一個consumer實例消費這個Topic對應的全部隊列,若是作集羣消費,則多個Consumer實例平均消費這個topic對應的隊列集合。
  • 可以保證嚴格的消息順序
  • 提供豐富的消息拉取模式
  • 高效的訂閱者水平擴展能力
  • 實時的消息訂閱機制
  • 億級消息堆積能力

MetaQ存儲結構

MetaQ的存儲結構是根據阿里大規模互聯網應用需求,徹底從新設計的一套存儲結構,使用這套存儲結構能夠支持上萬的隊列模型,而且能夠支持消息查詢、分佈式事務、定時隊列等功能,如圖3-7所示。

 

圖3-7-MetaQ存儲體系

MetaQ單機上萬隊列

MetaQ內部大部分功能都靠隊列來驅動,那麼必須支持足夠多的隊列,才能更好的知足業務需求,如圖所示,MetaQ能夠在單機支持上萬隊列,這裏的隊列所有爲持久化磁盤方式,從而對IO性能提出了挑戰。MetaQ是這樣解決的

  • Message所有寫入到一個獨立的隊列,徹底的順序寫
  • Message在文件的位置信息寫入到另外的文件,串行方式寫。

經過以上方式,既作到數據可靠,又能夠支持更多的隊列,如圖3-8所示。

 

 

圖3-8-MetaQ單機上萬隊列

MetaQ與Notify區別

  • Notify側重於交易消息,分佈式事務消息方面。
  • MetaQ側重於順序消息場景,例如binlog同步。以及主動拉消息場景,例如流計算等。

來自:http://www.tuicool.com/articles/zqyYrm

相關文章
相關標籤/搜索