多個中介軟體 訊息中介軟體 四種投遞模式對比

2021-10-14 18:27:33 字數 3056 閱讀 4715

原文出自田守枝的技術部落格:

訊息中介軟體( message oriented middleware,簡稱mom)在企業開發中變得越來越重要。本文介紹訊息中介軟體中的四種訊息投遞模型,主要是介紹模型的核心特性,以及不同模型之前的區別。這四種模型分別是:

其中ptp模型和pub/sub模型在jms規範中有定義,訊息中介軟體activemq就實現了jms規範。然而一些訊息中介軟體,並沒有實現jms規範,而是自己設計出了一套模型,例如kafka和rocketmq就採用了partition模型。此外業界還有一些其他的訊息投遞模型,例如transfer模型,這是筆者自己起的名字。

point-to-point,點對點通訊模型。ptp是基於佇列(queue)的,乙個佇列可以有多個生產者,和多個消費者。訊息伺服器按照收到訊息的先後順序,將訊息放到佇列中。佇列中的每一條訊息,只能由乙個消費者進行消費,消費之後就會從佇列中移除。

需要注意的是,儘管這裡使用queue的概念,但並不是先進入佇列訊息,一定會被先消費。在存在多個下游consumer情況下,一些訊息中介軟體,例如activemq,為了提公升消費能力,會將佇列中的訊息分發到不同consumer並行進行處理。這意味著訊息傳送的時候可能是有序的,但是在消費的時候,就變成無序了。為了保證消費的有序,一些mq提供了"專有消費者」或者"排他消費者」的概念,在這種情況下,佇列中的訊息僅允許乙個消費者進行消費,如果存在多個消費者,那麼從中選擇乙個。但是,這意味著在訊息在處理中沒有了並行性。如果訊息量很多的情況下,將會產生訊息積壓。為了解決"專有消費者」的效能問題,一些訊息中介軟體採用分割槽的概念來解決效能問題,我們將在後文進行介紹。

publish-and- subscribe, 即發布訂閱模型。在pub/sub模型中,生產者將訊息發布到乙個主題(topic)中,訂閱了該topic的所有下游消費者,都可以接收到這條訊息。如下圖:

為了解決在ptp模型下,有序訊息需要通過"專有消費者」消費帶來的效能問題,一些訊息中介軟體,如rocketmq,kafka採用了partition模型,即分割槽模型,如下所示:

生產者傳送訊息到某個topic中時,最終選擇其中乙個partition進行傳送。你可以將parition模型中的分割槽,理解為ptp模型的佇列,不同的是,ptp模型中的佇列儲存的是所有的訊息,而每個partition只會儲存部分資料。對於訊息者,此時多了乙個消費者組的概念,paritition會在同乙個消費者組下的消費者中進行分配,每個消費者只消費分配給自己的paritition。上圖演示了不同的消費者可能會分配到不同數量的paritition。paritition模式巧妙的將ptp模型和pub/sub模型結合在了一起:

對於ptp模型:

一條訊息只會由乙個消費者進行消費,而partition模型中每個分割槽最終也只會有乙個消費者進行消費。對於通過"專有消費者"來保證全域性消費有序的場景,在partition模型中,只需保證建立的topic只有乙個partition即可,這個paritition最終也只會分配其中乙個消費者。另外,在絕大部分場景下,我們沒有必要保證全域性有序,例如乙個訂單產生了3條訊息,分別是訂單建立,訂單付款,訂單完成。消費時,要按照這個順序消費才能有意義。但是訂單之間是可以並行消費的,例如將訂單1產生的3條訊息傳送到partiton 1,將訂單2產生的3條訊息傳送到partition 2,如此便達到了不同訂單之間的並行消費。

對於pub/sub模型:

一條訊息所有的下游消費者都可以進行消費。在paritition模型中,只需要為每個消費者設定成不同的消費者組即可。然而,過多的消費者組,會給訊息中介軟體運維帶來麻煩。所以一些訊息中介軟體,結合了partition模型和pub/sub模型。例如rocketmq,支援為消費者組設定消費模式,如果是集群模式,就按照上述描述進行消費,如果是廣播模式,就按照pub/sub模型進行消費。當然,partition模型也不全是優點,其最大的限制在於partition數量是固定的(雖然可以調整),且只可以分配給其中乙個消費者。當消費者的數量大於partition數量時,這些多出來的消費者將無法消費到訊息。一些訊息中介軟體對此進行了優化,例如rocketmq,支援單個partition的並行消費。即在對單個消費者內,同時啟動多個執行緒,來消費這個partition中的資料,當然前提是要求訊息不是有序的,對於有序的訊息,只能使用乙個執行緒按順序消費這個partition中的資料。

paritition模型中的消費者組概念很有用,同乙個topic下的訊息可以由多個不同業務方進行消費,只要使用不同的消費者組即可,不同消費者組消費到的位置單獨記錄,互不影響。 但是,paritition模型還是限制了消費者數量不能多於分割槽數。因此,又有了另外一種消費模型,筆者稱之為transfer模型,如下圖所示:

生產者還是將訊息傳送到topic中,針對乙個topic,可以建立多個通道,這裡稱之為channel。與分割槽不同的是,傳送到topic中的每條訊息,都會**到每個channel,因此每個channel都有這個topic的全量資料。當然,沒有必要把真的把訊息體完整的拷貝乙份到channel中,可以只記錄一下訊息元資料,表示有一條放到這個channel中了。消費者在消費訊息時,必須指定從哪個channel消費。多個消費者消費同乙個channel時,每條訊息只會有乙個消費者消費達到,這一點與ptp模型類似。事實上,我們可以認為,消費了同乙個channel的消費者,就自動組成了乙個消費者組。但是,與partition模型不同的是,這裡沒有分割槽的概念,因此消費者的數量可以是任意的。事實上,go語言編寫的nsq訊息中介軟體,採用的就是這種模型。當然,這種模型與ptp一樣,也不能保證被訊息有序,除非通過類似於」專用消費者」的概念。

中介軟體 訊息中介軟體學習總結

冪等 在程式設計中.乙個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函式,或冪等方法,是指可以使用相同引數重複執行,並能獲得相同結果的函式。這些函式 不會影響系統狀態,也不用擔心重複執行會對系統造成改變。例如,getusername 和settrue 函式就是乙個冪等函式....

訊息中介軟體

1.訊息的優先順序 2.訊息排序 3.訊息過濾 4.訊息持久化 5.訊息重試 6.事務的支援 7.broker滿 生產者,佇列,消費者 訊息佇列的優點 1 解耦2 非同步訊息,系統響應 在jms中,有兩種訊息模型 點對點模式和發布訂閱模式。1.在點對點模式中 有三種角色 1 訊息佇列,傳送者,接受者...

訊息中介軟體

如何理解訊息中介軟體?訊息中介軟體是儲存訊息的乙個容器,與資料庫不同的是資料庫儲存的資料是可以被修改的,而訊息中介軟體一般不會被修改 訊息中介軟體在消費的生產者與消費者產生,相當於乙個中間人的角色,提供了路由保證訊息的傳遞,如果消費者不能及時接收,訊息會保留下來,知道消費者上線 保證在存活期內 訊息...