消息中間件的四種投遞模式對(duì)比-創(chuàng)新互聯(lián)

消息中間件的四種投遞模式對(duì)比

成都創(chuàng)新互聯(lián)主要為客戶(hù)提供服務(wù)項(xiàng)目涵蓋了網(wǎng)頁(yè)視覺(jué)設(shè)計(jì)、VI標(biāo)志設(shè)計(jì)、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站程序開(kāi)發(fā)、HTML5響應(yīng)式成都網(wǎng)站建設(shè)手機(jī)網(wǎng)站制作、微商城、網(wǎng)站托管及成都網(wǎng)站維護(hù)、WEB系統(tǒng)開(kāi)發(fā)、域名注冊(cè)、國(guó)內(nèi)外服務(wù)器租用、視頻、平面設(shè)計(jì)、SEO優(yōu)化排名。設(shè)計(jì)、前端、后端三個(gè)建站步驟的完善服務(wù)體系。一人跟蹤測(cè)試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為衛(wèi)生間隔斷行業(yè)客戶(hù)提供了網(wǎng)站營(yíng)銷(xiāo)服務(wù)。

消息中間件( Message Oriented Middleware,簡(jiǎn)稱(chēng)MOM)在企業(yè)開(kāi)發(fā)中變得越來(lái)越重要。本文介紹消息中間件中的四種消息投遞模型,主要是介紹模型的核心特性,以及不同模型之前的區(qū)別。這四種模型分別是:

  • PTP模型

  • Pub/Sub模型

  • Partition模型

  • Transfer模型

其中PTP模型和Pub/Sub模型在JMS規(guī)范中有定義,消息中間件ActiveMQ就實(shí)現(xiàn)了JMS規(guī)范。然而一些消息中間件,并沒(méi)有實(shí)現(xiàn)JMS規(guī)范,而是自己設(shè)計(jì)出了一套模型,例如Kafka和RocketMQ就采用了Partition模型。此外業(yè)界還有一些其他的消息投遞模型,例如Transfer模型,這是筆者自己起的名字。

1、PTP模型

Point-to-Point,點(diǎn)對(duì)點(diǎn)通信模型。PTP是基于隊(duì)列(Queue)的,一個(gè)隊(duì)列可以有多個(gè)生產(chǎn)者,和多個(gè)消費(fèi)者。消息服務(wù)器按照收到消息的先后順序,將消息放到隊(duì)列中。隊(duì)列中的每一條消息,只能由一個(gè)消費(fèi)者進(jìn)行消費(fèi),消費(fèi)之后就會(huì)從隊(duì)列中移除。

消息中間件的四種投遞模式對(duì)比

需要注意的是,盡管這里使用Queue的概念,但并不是先進(jìn)入隊(duì)列消息,一定會(huì)被先消費(fèi)。在存在多個(gè)下游Consumer情況下,一些消息中間件,例如ActiveMQ,為了提升消費(fèi)能力,會(huì)將隊(duì)列中的消息分發(fā)到不同Consumer并行進(jìn)行處理。這意味著消息發(fā)送的時(shí)候可能是有序的,但是在消費(fèi)的時(shí)候,就變成無(wú)序了。為了保證消費(fèi)的有序,一些MQ提供了"專(zhuān)有消費(fèi)者”或者"排他消費(fèi)者”的概念,在這種情況下,隊(duì)列中的消息僅允許一個(gè)消費(fèi)者進(jìn)行消費(fèi),如果存在多個(gè)消費(fèi)者,那么從中選擇一個(gè)。但是,這意味著在消息在處理中沒(méi)有了并行性。如果消息量很多的情況下,將會(huì)產(chǎn)生消息積壓。為了解決"專(zhuān)有消費(fèi)者”的性能問(wèn)題,一些消息中間件采用分區(qū)的概念來(lái)解決性能問(wèn)題,我們將在后文進(jìn)行介紹。

2、Pub/Sub模型

publish-and- subscribe, 即發(fā)布訂閱模型。在Pub/Sub模型中,生產(chǎn)者將消息發(fā)布到一個(gè)主題(Topic)中,訂閱了該Topic的所有下游消費(fèi)者,都可以接收到這條消息。如下圖:

消息中間件的四種投遞模式對(duì)比

通常情況下,一個(gè)條消息只要被消費(fèi)一次就行了,那么什么情況下需要所有的消費(fèi)者都對(duì)這條消息進(jìn)行消費(fèi)呢?最典型的情況就是需要在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行緩存,并需要實(shí)時(shí)進(jìn)行更新。例如,筆者做過(guò)一個(gè)違禁詞系統(tǒng),對(duì)用戶(hù)輸入的評(píng)論內(nèi)容進(jìn)行違禁詞匯檢測(cè)。這個(gè)違禁詞系統(tǒng),部署了在N臺(tái)服務(wù)器上,為了提升檢測(cè)性能,每臺(tái)機(jī)器都會(huì)將違禁詞庫(kù)全量加載到內(nèi)存中,詞庫(kù)的更新,是通過(guò)發(fā)送MQ消息來(lái)完成的。由于采用Pub/Sub模型,每臺(tái)機(jī)器的consumer,都可以接收到這條消息,直接在內(nèi)存中更新敏感詞庫(kù)即可。

3、Partition模型

為了解決在PTP模型下,有序消息需要通過(guò)"專(zhuān)有消費(fèi)者”消費(fèi)帶來(lái)的性能問(wèn)題,一些消息中間件,如rocketmq,kafka采用了Partition模型,即分區(qū)模型,如下所示:

消息中間件的四種投遞模式對(duì)比

生產(chǎn)者發(fā)送消息到某個(gè)Topic中時(shí),最終選擇其中一個(gè)Partition進(jìn)行發(fā)送。你可以將Parition模型中的分區(qū),理解為PTP模型的隊(duì)列,不同的是,PTP模型中的隊(duì)列存儲(chǔ)的是所有的消息,而每個(gè)Partition只會(huì)存儲(chǔ)部分?jǐn)?shù)據(jù)。對(duì)于消息者,此時(shí)多了一個(gè)消費(fèi)者組的概念,Paritition會(huì)在同一個(gè)消費(fèi)者組下的消費(fèi)者中進(jìn)行分配,每個(gè)消費(fèi)者只消費(fèi)分配給自己的Paritition。上圖演示了不同的消費(fèi)者可能會(huì)分配到不同數(shù)量的Paritition。Paritition模式巧妙的將PTP模型和Pub/Sub模型結(jié)合在了一起:

對(duì)于PTP模型:

一條消息只會(huì)由一個(gè)消費(fèi)者進(jìn)行消費(fèi),而Partition模型中每個(gè)分區(qū)最終也只會(huì)有一個(gè)消費(fèi)者進(jìn)行消費(fèi)。對(duì)于通過(guò)"專(zhuān)有消費(fèi)者"來(lái)保證全局消費(fèi)有序的場(chǎng)景,在Partition模型中,只需保證創(chuàng)建的Topic只有一個(gè)Partition即可,這個(gè)Paritition最終也只會(huì)分配其中一個(gè)消費(fèi)者。另外,在絕大部分場(chǎng)景下,我們沒(méi)有必要保證全局有序,例如一個(gè)訂單產(chǎn)生了3條消息,分別是訂單創(chuàng)建,訂單付款,訂單完成。消費(fèi)時(shí),要按照這個(gè)順序消費(fèi)才能有意義。但是訂單之間是可以并行消費(fèi)的,例如將訂單1產(chǎn)生的3條消息發(fā)送到Partiton 1,將訂單2產(chǎn)生的3條消息發(fā)送到Partition 2,如此便達(dá)到了不同訂單之間的并行消費(fèi)。

對(duì)于Pub/Sub模型:

一條消息所有的下游消費(fèi)者都可以進(jìn)行消費(fèi)。在Paritition模型中,只需要為每個(gè)消費(fèi)者設(shè)置成不同的消費(fèi)者組即可。然而,過(guò)多的消費(fèi)者組,會(huì)給消息中間件運(yùn)維帶來(lái)麻煩。所以一些消息中間件,結(jié)合了Partition模型和Pub/Sub模型。例如RocketMQ,支持為消費(fèi)者組設(shè)置消費(fèi)模式,如果是集群模式,就按照上述描述進(jìn)行消費(fèi),如果是廣播模式,就按照Pub/Sub模型進(jìn)行消費(fèi)。當(dāng)然,Partition模型也不全是優(yōu)點(diǎn),其大的限制在于Partition數(shù)量是固定的(雖然可以調(diào)整),且只可以分配給其中一個(gè)消費(fèi)者。當(dāng)消費(fèi)者的數(shù)量大于Partition數(shù)量時(shí),這些多出來(lái)的消費(fèi)者將無(wú)法消費(fèi)到消息。一些消息中間件對(duì)此進(jìn)行了優(yōu)化,例如rocketmq,支持單個(gè)partition的并行消費(fèi)。即在對(duì)單個(gè)消費(fèi)者內(nèi),同時(shí)啟動(dòng)多個(gè)線程,來(lái)消費(fèi)這個(gè)Partition中的數(shù)據(jù),當(dāng)然前提是要求消息不是有序的,對(duì)于有序的消息,只能使用一個(gè)線程按順序消費(fèi)這個(gè)Partition中的數(shù)據(jù)。

4、Transfer模型

Paritition模型中的消費(fèi)者組概念很有用,同一個(gè)Topic下的消息可以由多個(gè)不同業(yè)務(wù)方進(jìn)行消費(fèi),只要使用不同的消費(fèi)者組即可,不同消費(fèi)者組消費(fèi)到的位置單獨(dú)記錄,互不影響。?但是,Paritition模型還是限制了消費(fèi)者數(shù)量不能多于分區(qū)數(shù)。因此,又有了另外一種消費(fèi)模型,筆者稱(chēng)之為T(mén)ransfer模型,如下圖所示:

消息中間件的四種投遞模式對(duì)比

生產(chǎn)者還是將消息發(fā)送到Topic中,針對(duì)一個(gè)Topic,可以創(chuàng)建多個(gè)通道,這里稱(chēng)之為channel。與分區(qū)不同的是,發(fā)送到Topic中的每條消息,都會(huì)轉(zhuǎn)發(fā)到每個(gè)channel,因此每個(gè)channel都有這個(gè)Topic的全量數(shù)據(jù)。當(dāng)然,沒(méi)有必要把真的把消息體完整的拷貝一份到channel中,可以只記錄一下消息元數(shù)據(jù),表示有一條放到這個(gè)channel中了。消費(fèi)者在消費(fèi)消息時(shí),必須指定從哪個(gè)channel消費(fèi)。多個(gè)消費(fèi)者消費(fèi)同一個(gè)channel時(shí),每條消息只會(huì)有一個(gè)消費(fèi)者消費(fèi)達(dá)到,這一點(diǎn)與PTP模型類(lèi)似。事實(shí)上,我們可以認(rèn)為,消費(fèi)了同一個(gè)channel的消費(fèi)者,就自動(dòng)組成了一個(gè)消費(fèi)者組。但是,與Partition模型不同的是,這里沒(méi)有分區(qū)的概念,因此消費(fèi)者的數(shù)量可以是任意的。事實(shí)上,GO語(yǔ)言編寫(xiě)的NSQ消息中間件,采用的就是這種模型。當(dāng)然,這種模型與PTP一樣,也不能保證被消息有序,除非通過(guò)類(lèi)似于”專(zhuān)用消費(fèi)者”的概念。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

文章名稱(chēng):消息中間件的四種投遞模式對(duì)比-創(chuàng)新互聯(lián)
文章分享:http://muchs.cn/article30/egsso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站制作、建站公司網(wǎng)站維護(hù)、微信小程序、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)