rabbitmq 不同的消费者消费同一个队列_消息队列王者--rabbitMQ深入理解--工作过程、消费模式、持久化等...
概述
之前已經(jīng)對(duì)rabbitMQ的一些基本概念做了介紹和不同MQ之間的比較,今天主要對(duì)rabbitMQ的一些方面做擴(kuò)展。
01
消息隊(duì)列
Broker:簡(jiǎn)單來說就是消息隊(duì)列服務(wù)器實(shí)體。
Exchange:消息交換機(jī),它指定消息按什么規(guī)則,路由到哪個(gè)隊(duì)列。
Queue:消息隊(duì)列載體,每個(gè)消息都會(huì)被投入到一個(gè)或多個(gè)隊(duì)列。
Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來。
Routing Key:路由關(guān)鍵字,exchange根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息投遞。
vhost:虛擬主機(jī),一個(gè)broker里可以開設(shè)多個(gè)vhost,用作不同用戶的權(quán)限分離。每個(gè)虛擬主機(jī)是隔離的,互不影響.
producer:消息生產(chǎn)者,就是投遞消息的程序。
consumer:消息消費(fèi)者,就是接受消息的程序。
channel:消息通道,在客戶端的每個(gè)連接里,可建立多個(gè)channel,每個(gè)channel代表一個(gè)會(huì)話任務(wù)。
02
消息隊(duì)列的工作過程
(1)客戶端連接到消息隊(duì)列服務(wù)器,打開一個(gè)channel。
(2)客戶端聲明一個(gè)exchange,并設(shè)置相關(guān)屬性。
(3)客戶端聲明一個(gè)queue,并設(shè)置相關(guān)屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好綁定關(guān)系。
(5)客戶端投遞消息到exchange。
03
消費(fèi)模式 :推(push)模式和拉(pull)模式。
Pull(推模式)是指由Broker(中介,這里是隊(duì)列),主動(dòng)推送消息至消費(fèi)端,實(shí)時(shí)性較好,不過需要一定的流制機(jī)制來確保服務(wù)端推送過來的消息不會(huì)壓垮消費(fèi)端。
而拉模式是指消費(fèi)端主動(dòng)向Broker端請(qǐng)求拉取(一般是定時(shí)或者定量)消息,實(shí)時(shí)性較推模式差,但是可以根據(jù)自身的處理能力而控制拉取的消息量。
04
消息持久化
rabbit如何進(jìn)行消息持久化操作呢?exchange是實(shí)現(xiàn)發(fā)布訂閱的基礎(chǔ),其類型包含fanout、headers、direct、、topic。我們本次僅討論類型為topic。
發(fā)布訂閱模式執(zhí)行消息發(fā)送的流程:
RabbitMQ要實(shí)現(xiàn)發(fā)布訂閱持久化,按照消息的傳輸流程,可以分成三類:
Exchange 持久化:如果不設(shè)定Exchange持久化,那么在RabbitMQ由于某些異常等原因重啟之后,Exchange會(huì)丟失。Exchange丟失, 會(huì)影響發(fā)送端發(fā)送消息到RabbitMQ。
Queue持久化:發(fā)送端將消息發(fā)送至Exchange,Exchange將消息轉(zhuǎn)發(fā)至關(guān)聯(lián)的Queue。如果Queue不設(shè)置持久化,那么在RabbitMQ重啟之后,Queue信息會(huì)丟失。導(dǎo)致消息發(fā)送至Exchange,但Exchange不知道需要將該消息發(fā)送至哪些具體的隊(duì)列。
Message持久化:發(fā)送端將消息發(fā)送至Exchange,Exchange將消息轉(zhuǎn)發(fā)至關(guān)聯(lián)的Queue,消息存儲(chǔ)于具體的Queue中。如果RabbitMQ重啟之后,由于Message未設(shè)置持久化,那么消息會(huì)在重啟之后丟失。
為了保證發(fā)布訂閱的持久化,必須設(shè)置Exchange、Queue、Message的持久化,才可以保證消息最終不會(huì)丟失。雖然持久化會(huì)造成性能損耗,但為了生產(chǎn)環(huán)境的數(shù)據(jù)一致性,這是我們必須做出的選擇。但我們可以通過設(shè)置消息過期時(shí)間、降低發(fā)送消息大小等其他方式來盡可能的降低MQ性能的降低。
消息隊(duì)列持久化包括3個(gè)部分:
(1)exchange持久化,在聲明時(shí)指定durable => 1
(2)queue持久化,在聲明時(shí)指定durable => 1
(3)消息持久化,在投遞時(shí)指定delivery_mode => 2(1是非持久化)
如果exchange和queue都是持久化的,那么它們之間的binding也是持久化的。如果exchange和queue兩者之間有一個(gè)持久化,一個(gè)非持久化,就不允許建立綁定。
05
消息發(fā)送步驟
exchange接收到消息后,就根據(jù)消息的key和已經(jīng)設(shè)置的binding,進(jìn)行消息路由,將消息投遞到一個(gè)或多個(gè)隊(duì)列里。
exchange也有幾個(gè)類型,完全根據(jù)key進(jìn)行投遞的叫做Direct交換機(jī),例如,綁定時(shí)設(shè)置了routing key為”abc”,那么客戶端提交的消息,只有設(shè)置了key為”abc”的才會(huì)投遞到隊(duì)列。對(duì)key進(jìn)行模式匹配后進(jìn)行投遞的叫做Topic交換 機(jī),符號(hào)”#”匹配一個(gè)或多個(gè)詞,符號(hào)”*”匹配正好一個(gè)詞。
例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。還有一種不需要key的,叫做Fanout交換機(jī),它采取廣播模式,一個(gè)消息進(jìn)來時(shí),投遞到與該交換機(jī)綁定的所有隊(duì)列。
RabbitMQ的Connection是昂貴的,但Channel是廉價(jià)的,在多線程環(huán)境下,盡量創(chuàng)建少數(shù)Connection,然后在每個(gè)Connection中創(chuàng)建多個(gè)Channel,利用Channel實(shí)現(xiàn)Connection復(fù)用,從而提高系統(tǒng)性能。很像Java NIO里的Selector到Channel的多路復(fù)用。
生產(chǎn)端發(fā)送消息時(shí),同一個(gè)Channel的basicPublish方法并不是線程安全的,因此更加體現(xiàn)出多Channel的重要性。如果生產(chǎn)端需要使用多線程發(fā)送消息,那么必須創(chuàng)建多個(gè)Channel,每一個(gè)線程單獨(dú)使用一個(gè)Channel,但是這些Channel可以來自同一個(gè)Connection。假如線程數(shù)量過多,那么也不可以無限制的創(chuàng)建Channel,需要使用Channel Pool(連接池)的思路去控制并發(fā)。
后面會(huì)分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注一下~
總結(jié)
以上是生活随笔為你收集整理的rabbitmq 不同的消费者消费同一个队列_消息队列王者--rabbitMQ深入理解--工作过程、消费模式、持久化等...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 河北大学计算机专业调剂,【计算机考研调剂
- 下一篇: python etree创建xml_Py