成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

消息中間件:四種投遞模式對比

開發(fā) 架構(gòu)
本文介紹消息中間件中的四種消息投遞模型,主要是介紹模型的核心特性,以及不同模型之前的區(qū)別。

[[282632]]

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

  • PTP模型
  • Pub/Sub模型
  • Partition模型
  • Transfer模型

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

1、PTP模型

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

 

消息中間件:四種投遞模式對比

 

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

2、Pub/Sub模型

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

 

消息中間件:四種投遞模式對比

 

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

3、Partition模型

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

 

消息中間件:四種投遞模式對比

 

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

對于PTP模型:

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

對于Pub/Sub模型:

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

4、Transfer模型

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

 

消息中間件:四種投遞模式對比

 

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

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2023-10-24 07:50:18

消息中間件MQ

2023-06-29 10:10:06

Rocket MQ消息中間件

2022-10-28 13:33:05

Push模式互聯(lián)網(wǎng)高并發(fā)

2019-09-18 15:22:52

消息中間件RabbitMQ

2021-12-14 10:39:12

中間件ActiveMQRabbitMQ

2025-03-26 07:53:24

2022-11-02 10:08:46

分布式高并發(fā)消息中間件

2015-08-11 11:16:36

淘寶中間件

2023-05-08 08:09:26

路由元信息謂詞

2022-08-09 08:31:29

RocketMQ消息中間件

2022-02-13 23:04:28

RedisRabbitMQKafka

2022-10-21 10:48:17

消息中間件互聯(lián)網(wǎng)應(yīng)用協(xié)議

2024-01-24 08:19:02

Stream應(yīng)用場景注解

2011-10-24 07:41:38

SOA中間件應(yīng)用服務(wù)器

2019-07-19 07:56:13

消息隊列消息代理消息中間件

2023-11-27 13:42:00

消息隊列RocketMQ

2011-05-24 15:10:48

2021-02-11 08:21:02

中間件開發(fā)CRUD

2022-12-27 17:56:40

ack機(jī)制RocketMQ

2023-10-16 12:25:48

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日本一区不卡 | 黄色网址免费在线观看 | 日本精品一区二区三区视频 | 99久久亚洲 | 久久1区 | 992人人草 | 国产第一亚洲 | 国产成人精品免费视频大全最热 | 久久伊人影院 | 在线一区视频 | www.99热这里只有精品 | 精品国产一区二区三区久久久蜜月 | 精品视频在线免费观看 | 国产男人的天堂 | 一级做a爰片性色毛片16 | 91精品一区二区三区久久久久久 | 久久6视频 | 免费在线成人 | 99热播精品 | 国产精品看片 | 免费观看毛片 | 日韩久久久久 | 国产一区二区久久 | 国产情侣在线看 | 精品久久99 | 欧美日韩电影一区二区 | 国产亚洲欧美另类一区二区三区 | 久久久亚洲成人 | 黄色av免费网站 | 久久久国产精品视频 | 中文字幕高清免费日韩视频在线 | 欧美乱操 | 狠狠干美女 | 欧美日韩电影在线 | 日韩欧美在线播放 | 午夜激情网| 国产精品久久久久久久久久久免费看 | 亚洲iv一区二区三区 | 久久99久久99精品免视看婷婷 | 91在线 | 在线欧美一区 |