丨消息模型主題和隊(duì)列有什么區(qū)別_第1頁
丨消息模型主題和隊(duì)列有什么區(qū)別_第2頁
丨消息模型主題和隊(duì)列有什么區(qū)別_第3頁
丨消息模型主題和隊(duì)列有什么區(qū)別_第4頁
丨消息模型主題和隊(duì)列有什么區(qū)別_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

現(xiàn)代的消息隊(duì)列呈現(xiàn)出的模式,一樣是經(jīng)過之前的十幾年逐步演進(jìn)而來的。Qe種數(shù)據(jù)結(jié)構(gòu),有完整而嚴(yán)格的定義。在百科中,隊(duì)列的定義是這樣的:隊(duì)列是先進(jìn)先出(FIFO,First-In-First-Out)的線性表(LinearList)。在具體應(yīng)用中通常用鏈表或者數(shù)組來實(shí)現(xiàn)。隊(duì)列只允許在后端(稱為rear)進(jìn)行插入操作,端(稱為front)進(jìn)行刪除操作。嚴(yán)格有序早期的消息隊(duì)列,就是按照“隊(duì)列”的數(shù)據(jù)結(jié)構(gòu)來設(shè)計(jì)的。我們一起看下這個(gè)圖Produr)發(fā)消息就是入隊(duì)操作,消費(fèi)者Consumr這就是最初的一種消息模型:隊(duì)列模型產(chǎn)者生產(chǎn)的所有消息的合集。消息的順序就是這些生產(chǎn)者發(fā)送消息的自然順序。如果有多如果需要將一份消息數(shù)據(jù)分發(fā)給多個(gè)消費(fèi)者,要求每個(gè)消費(fèi)者都能收到全量的消息,例如,對(duì)于一份訂單數(shù)據(jù),風(fēng)控系統(tǒng)、分析系統(tǒng)、支付系統(tǒng)等都需要接收消息。這個(gè)時(shí)候,單個(gè)隊(duì)列就滿足不了需求,一個(gè)可行的解決方式是,為每個(gè)消費(fèi)者創(chuàng)建一個(gè)單獨(dú)的隊(duì)列,讓生產(chǎn)者發(fā)送多份。顯然這是個(gè)比較蠢的做法,同樣的一份消息數(shù)據(jù)被到多個(gè)隊(duì)列中會(huì)浪費(fèi)資源,更重要的是,生產(chǎn)者必須知道有多少個(gè)消費(fèi)者。為每個(gè)消費(fèi)者單獨(dú)發(fā)送一份消息,這實(shí)際上違背了消為了解決這個(gè)問題,演化出了另外一種消息模型:“發(fā)布-訂閱模型SubscribePattern)”在發(fā)布-訂閱模型中,消息的發(fā)送方稱為發(fā)布者(Publisher),消息的接收方稱為訂閱(Subscriber),服務(wù)端存放消息的容器稱為(Topic)。發(fā)布者將消息發(fā)送訂閱接收之前閱在這是一作,還可以認(rèn)為是在消費(fèi)時(shí)的一個(gè)邏輯副本,每份訂閱中,訂閱者都可以接收到的所有消在消息領(lǐng)域的歷史上很長(zhǎng)的一段時(shí)間,隊(duì)列模式和發(fā)布-訂閱模式是并存的,有些消息隊(duì)列同時(shí)支持這兩種消息模型,比如Act。我們仔細(xì)對(duì)比一下這兩種模型,生產(chǎn)者就是發(fā)布者,消費(fèi)者就是訂閱者,隊(duì)列就是,并沒有本質(zhì)的區(qū)別。就是,一份消息數(shù)據(jù)能不能被消費(fèi)多次的問題。實(shí)際上,在這種閱模型中,如果只有一個(gè)訂閱者,那它和隊(duì)列模型就基本是一樣的了。也就是說,發(fā)布-訂閱模型在功能層面上是可以兼容隊(duì)列模型的?,F(xiàn)代的消息隊(duì)列產(chǎn)品使用的消息模型大多是這種發(fā)布-訂閱模型,當(dāng)然也有例外RabbitMQ這個(gè)例外就是RabbQ,它是少數(shù)依然堅(jiān)持使用隊(duì)列模型的產(chǎn)品之一。那它是怎么解決多個(gè)消費(fèi)者的問題呢?你還記得我在上節(jié)課中講到RabbitMQxchange嗎?在RabbQ中,xchae位于生產(chǎn)者和隊(duì)列之間,生產(chǎn)者并不關(guān)心將消息發(fā)送給哪個(gè)隊(duì)列,而是將消息發(fā)送給xchang由Exe同一份消息如果需要被多個(gè)消費(fèi)者來消費(fèi),需要配置Exe-RabbitMQ,其中一個(gè)章專門是講如何實(shí)現(xiàn)發(fā)布訂閱的MQ講完了RabbitMQ的消息模型,我們?cè)賮砜纯? MQ使用的消息模型是標(biāo)準(zhǔn)的發(fā)布-訂閱模型,在 MQ的術(shù)語表中,生產(chǎn)者、消費(fèi)者和與我在上面講的發(fā)布-訂閱模型中的概念是完全一樣的。 MQ也有隊(duì)列(Queue)這個(gè)概念,并且隊(duì)列在 MQ中是一個(gè)非 MQ中的作用是什么呢?這就要從消息隊(duì)列的消費(fèi)機(jī)制說-Brok服務(wù)端在收到消息并將消息寫入或者隊(duì)列中后,會(huì)給生產(chǎn)者發(fā)送確認(rèn)的響應(yīng)。如果生產(chǎn)者沒有收到服務(wù)端的確認(rèn)或者收到失敗的響應(yīng),則會(huì)重新發(fā)送消息;在消費(fèi)端,消費(fèi)者在收到消息并完成自己的消費(fèi)業(yè)務(wù)邏輯(比如,將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中)務(wù)端發(fā)送消費(fèi)成功的確認(rèn),服務(wù)端只有收到消費(fèi)確認(rèn)后,才認(rèn)為一條消息被成功消費(fèi),否則它會(huì)給消費(fèi)者重新發(fā)送這條消息,直到收到對(duì)應(yīng)的消費(fèi)成功確認(rèn)。這個(gè)確認(rèn)機(jī)制很好地保證了消息傳遞過程中的可靠性,但是,引入這個(gè)機(jī)制在消費(fèi)端帶來了一個(gè)不小的問題。什么問題呢?為了確保消息的有序性,在某一條消息被成功消費(fèi)之前,下一條消息是不能被消費(fèi)的,否則就會(huì)出現(xiàn)消息空洞,違背了有序性這個(gè)原則。 MQ在主每個(gè)包含多個(gè)隊(duì)列,通過多個(gè)隊(duì)列來實(shí)現(xiàn)多實(shí)例并行生產(chǎn)和消費(fèi)。需要注意的是RockeMQ只在隊(duì)列上保證消息的有序性,層面是無法保證消息的嚴(yán)格順序的MQ中,訂閱者的概念是通過消費(fèi)組(ConsumrGroup)來體現(xiàn)的。每個(gè)消費(fèi)組都消費(fèi)中一份完整的消息,不同消費(fèi)組之間消費(fèi)進(jìn)度彼此不受影響,也就是說,一條消ConsumrGroup1ConsumrGroup2Consum1消費(fèi)了,那同組的其他消費(fèi)者就不會(huì)再收到這條消息。在Topic的消費(fèi)過程中,由于消息需要被不同的組進(jìn)行多次消費(fèi),所以消費(fèi)完的消息并不 MQ為每個(gè)消費(fèi)組在每個(gè)隊(duì)列上一個(gè)消費(fèi)位置ConsumrOffsetMQ的消息模型中,比較關(guān)鍵的概念就是這些了。為了便于你理解,我畫了下面張圖你可以對(duì)照這張圖再把我剛剛講的這些概念繼續(xù)消化一下,加Kafka我們?cè)賮砜纯戳硪环N常見的消息隊(duì)列Kafka,Kafka的消息模型和 MQ是完全一樣 MQ中對(duì)應(yīng)的概念,和生產(chǎn)消費(fèi)過程中的確認(rèn)機(jī)制,都完全適用于Kafka。唯一的區(qū)別是,在Kafka中,隊(duì)列這個(gè)概念的名稱不一樣,Kafka中對(duì)應(yīng)的來總下本學(xué)習(xí)容。我們隊(duì)列和的,這概念后實(shí)際上對(duì)應(yīng)著兩種不同的消息模型:隊(duì)列模型和發(fā)布-常用的消息隊(duì)列中,RabbitMQ采用的是隊(duì)列模型,但是它一樣可以實(shí)現(xiàn)發(fā)布-訂閱的功能 MQ和Kafka采用的是發(fā)布-訂閱模型,并且二者的消息模型是基本一致的型有助于你用最佳的去使用消息隊(duì)列。但業(yè)務(wù)模型不等于就是實(shí)現(xiàn)層面的模型。比如說MySQL和Hbase同樣是支持SQL的數(shù)據(jù)庫(kù),它們的業(yè)務(wù)模型中,存放數(shù)據(jù)的單元都是“表”,但是在實(shí)現(xiàn)層面,沒有哪個(gè)數(shù)據(jù)是以二維表的方式去數(shù)據(jù)的,MySQL使用B+樹來數(shù)據(jù),而HBase使用的是KV的結(jié)構(gòu)來。同樣,像Kafka和 MQ的業(yè)務(wù)模型基本是一樣的,并不是說他們的最后給大家留一個(gè)思考題。剛剛我在介紹 Q的消息模型時(shí)講過,在消費(fèi)的為了保證消息的不丟失和嚴(yán)格順序,每個(gè)隊(duì)列只能串行消費(fèi),無法做到并發(fā),否則會(huì)出現(xiàn)消費(fèi)空洞的問題。那如果放寬一下限制,不要求嚴(yán)格順序,能否做到單個(gè)隊(duì)列的并行消費(fèi)呢?如果可以,該如何實(shí)現(xiàn)?歡迎在留言區(qū)與我討論。感謝閱讀,如果你覺得這篇文章對(duì)你有一些啟發(fā),也歡迎把它給你的朋友?歸科技所有,不得售賣。頁面已增加防盜追蹤,將依法其上一 02|該如何選擇消息隊(duì)列言精選留言言發(fā)條橙子。mq更新()消息(比如下架),那商品中心有多臺(tái)機(jī)器就對(duì)應(yīng)多個(gè)producer。消費(fèi)者組有兩個(gè),分別是導(dǎo)購(gòu)中心和活動(dòng)中心。…展作者回復(fù):A1:不是,消費(fèi)者組和隊(duì)列數(shù)沒有關(guān)系,你這個(gè)例子中消費(fèi)者組的數(shù)量是2個(gè)。隊(duì)列數(shù) 2 4展9沒啥問題,就是想點(diǎn)個(gè)贊,老 很展4 展3 作者回復(fù):對(duì)應(yīng) 1 3 展2老師您好,關(guān) mq的那有幾個(gè)疑問sumergoup中的某個(gè)sumer是和某個(gè)具體的queuesumer每次都隨機(jī)從某queu消費(fèi),另外如果是一一關(guān)聯(lián)的話,那某個(gè)ser掛了,那關(guān)聯(lián)的那個(gè)queue的消息該由哪個(gè)sumer來消費(fèi)呢?展同一個(gè)consumergroup中最多只能有一個(gè)consumer占用。1 2展作者回復(fù):沒錯(cuò)!具體可以看一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論