消息中間件的產生主要是爲了達到如下目的:後端
- 異步
- 解耦
- 最終一致性
- 並行
下面咱們來看針對同一件事情,不一樣的處理辦法:安全
過年了拜年發微信:服務器
咱們如今主要關注第二種場景,它的使用方式實現瞭解耦操做和異步操做。微信
一筆交易的完成涉及到不少系統協調操做的過程,如上多個系統,但若是隻是串行的執行這些操做,可能還沒執行完這些操做,用戶可能已沒有耐心,離開了操做界面。給用戶留下很差的用戶體驗。異步
(如下截圖都取自阿里沈詢消息中間件ONS講解)分佈式
消息中間件具備減小延遲,提高用戶體驗(異步解耦)spa
最終一致性:若是因爲消息中間件消費端的一個模塊 crash 了,而出現的短暫不一致現象,而該模塊恢復之後會從新完成它的操做,最終保證數據操做的一致性,咱們可使用消息中間件來保證最終狀態的統一。設計
並行:由於消息時並行發送到各個消息隊列的,也是並行的被各個系統進行處理的,系統的高效能夠由此獲得保證。日誌
ONS的設計思路:中間件
消息中間件的難點主要是在於權衡和取捨。
數據安全:交易物流等 數據不能丟失
使用隊列多冗餘的方式保證消息隊列的高可用性。(包括數據的複製,服務器的切換等操做都是在消息隊列後端來完成,對用戶是不可見的)。
中間件設計保證:無論系統堆積了多少消息,系統自己的處理能力不能慢或不能掛。
- 推
- 拉
- 推拉結合
Kafkia 面向的場景是:日誌的分析,處理 及 統計功能,它主要更關注於日誌拉取的吞吐量。而不太關注數據拉取的延遲,它採起的主要地消息投遞模式是拉模型。
ONS採起的是推拉結合的模式(長輪詢的模式)
推送策略:
隊列中收到消息後會主動推送給訂閱者,訂閱者返回一個ack,這樣的數據延遲會比較小,而且訂閱者比較輕量,主須要關注接收和處理消息就能夠了。
拉取策略:拉消息是訂閱者定時向消息服務器拉取消息,這樣消息服務器壓力會比較大,而且延遲相對來講會比較大,拉消息模式關注的主要是吞吐量。
推拉結合:當隊列中收到發佈者發送的消息以後,會給消息訂閱者一個通知,我這邊收到消息了,而後訂閱者會向消息中間件的服務器拉取消息。——缺點,拉取消息自己的交互次數會變得很是多。
另外一種方案:消息的訂閱者在主動拉取消息的同時,ONSServer 會 hold住你拉的請求,知道有消息之後會返回給你。以這種方式能夠實現 以拉取的模式(策略)來實現很是及時的通信。