發佈訂閱是消息中間件最基本的功能前端
在消息隊列中,每條消息都有不一樣的優先級,優先級高的先投遞。數據庫
因爲rocketmq的全部消息都是持久化的,按照優先級排序開銷會很是大,因此不支持持久化。可是能夠配置一個優先級高的隊列和一個普通的隊列,將不一樣的消息發送到不一樣的隊列。後端
優先級問題能夠分爲兩類:服務器
消息有序指的是一類消息消費時,能按照發送的順序來消費。例如:一個訂單產生了 3 條消息,分別是訂單創 建,訂單付款,訂單完成。消費時,要按照這個順序消費纔能有意義。可是同時訂單之間是能夠並行消費的。網絡
rocketmq嚴格保證消息有序性。異步
在broker中按照consumer的要求過濾,優勢是減小了對應consumer的無用消息的傳輸。但增長了broker的負擔,使得實現變複雜。分佈式
這種過濾方式可由應用徹底自定義實現,可是缺點是不少無用的消息要傳輸到 consumer端。性能
消息中間件一般採用幾種方式持久化:spa
前三種持久化方式都具備將內存隊列 buffer 進行擴展的能力,後一種則當broker掛掉重啓後仍然能將以前內存的數據恢復出來。中間件
rocketmq參考了kafka的持久化方式,充分利用Linux文件系統內存cache來提升性能。
影響消息可靠性的幾種狀況:
前面1-4四種狀況都屬於硬件資源可當即恢復的狀況。rocketmq在這四種狀況下能保證消息不丟,或丟失少許數據(依賴刷盤方式是同步仍是異步)。
5-6兩種狀況屬於單點故障,且不能恢復,一旦發生,在此單點上的消息所有丟失。rocketmq在這兩種狀況下,經過異步複製,可保證99%的消息不丟。經過同步雙寫技術能夠徹底避免單點,但會影響性能,適合對消息可靠性要求極高的場景,如與錢相關的應用。
在消息不堆積狀況下,消息到達 broker 後,能馬上到達 consumer。
rocketmq使用長輪詢 pulll 方式,可保證消息很是實時,消息實時性不低於 push。
指每一個消息必須投遞一次
rocketmq的consumer先pull消息到本地,消息完成後,才向服務器返回ask。若是沒有消費,必定不會ask消息。
只有兩個條件都知足,才能認爲消息是去除的。而要實現以上兩點,在分佈式環境下,無疑會產生巨大開銷。
rocketmq並不保證此特性,而是要求在業務上去重,即消費消息作到冪等性。
broker中的buffer一般指broker中一個隊列中的內存buffer大小。若是buffer滿了怎麼辦?
CORBA Notification 規範中處理方式:
rockermq的隊列都是持久化磁盤,buffer大小是磁盤容量,且數據按期清理。
回溯消息指consumer成功消費的消息因爲業務上的需求,須要從新消費。要支持此功能,broker在向consumer投遞消息後,消息仍要保留。。而且從新消費通常是按照時間維度,例如因爲 Consumer 系統故障, 恢復後須要從新消費 1 小時前的數據,那麼 Broker 要提供一種機制,能夠按照時間維度來回退消費進度。
rocketmq支持按照時間回溯消息,時間維度精確到毫秒,能夠向前回溯,也能夠向後回溯。
消息中間件的主要功能是異步解耦,擋住前端的數據洪峯,保證後端系統的穩定性。這要求消息中間件具備必定的消息堆積能力。
消息堆積分兩種:
rocketmq採用第一階段發送Prepared消息時,拿到消息的offset,第二階段經過offset訪問消息,並修改狀態。offset就是數據的地址。
rocketmq實現事務方式,沒有經過KV存儲作,而是經過offset方式,存在一個顯著缺陷,即經過offset更改數據,會令系統的髒頁過多。
定時消息指消息放到broker後,不能當即被consumer消費,需到特定時間點或等待特定時間後才能被消費。
若是支持任意時間精度,在broker層,就必須作消息排序,涉及到持久化,排序就會產生大量性能開銷。
rocketmq支持定時消息,但不支持任意精度,只支持特定level,如:5s,10s,1m等
consumer消費消息失敗後,要提供一種重試機制,令消息再消費一次。
consumer消費消息失敗有幾種狀況:
這種狀況建議應用sleep 30s,再消費下條消息,從而減輕broker重試消息的壓力。