RabbitMQ是流行的開(kāi)源消息隊(duì)列系統(tǒng),用erlang語(yǔ)言開(kāi)發(fā)。RabbitMQ是AMQP(高級(jí)消息隊(duì)列協(xié)議)的標(biāo)準(zhǔn)實(shí)現(xiàn)。如果不熟悉AMQP,直接看RabbitMQ的文檔會(huì)比較困難。不過(guò)它也只有幾個(gè)關(guān)鍵概念,這里簡(jiǎn)單介紹幾個(gè)概念說(shuō)明:
成都創(chuàng)新互聯(lián)長(zhǎng)期為上千余家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為瑤海企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作,瑤海網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。Broker:簡(jiǎn)單來(lái)說(shuō)就是消息隊(duì)列服務(wù)器實(shí)體。
Exchange:消息交換機(jī),它指定消息按什么規(guī)則,路由到哪個(gè)隊(duì)列。
Queue:消息隊(duì)列載體,每個(gè)消息都會(huì)被投入到一個(gè)或多個(gè)隊(duì)列。
Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來(lái)。
Routing Key:路由關(guān)鍵字,exchange根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息投遞。
vhost:虛擬主機(jī),一個(gè)broker里可以開(kāi)設(shè)多個(gè)vhost,用作不同用戶的權(quán)限分離。
producer:消息生產(chǎn)者,就是投遞消息的程序。
consumer:消息消費(fèi)者,就是接受消息的程序。
channel:消息通道,在客戶端的每個(gè)連接里,可建立多個(gè)channel,每個(gè)channel代表一個(gè)會(huì)話任務(wù)。
由Exchange,Queue,RoutingKey三個(gè)才能決定一個(gè)從Exchange到Queue的唯一的線路。
消息隊(duì)列的使用過(guò)程大概如下:
(1)客戶端連接到消息隊(duì)列服務(wù)器,打開(kāi)一個(gè)channel。
(2)客戶端聲明一個(gè)exchange,并設(shè)置相關(guān)屬性。
(3)客戶端聲明一個(gè)queue,并設(shè)置相關(guān)屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好綁定關(guān)系。
(5)客戶端投遞消息到exchange。
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)來(lái)時(shí),投遞到與該交換機(jī)綁定的所有隊(duì)列。
RabbitMQ支持消息的持久化,也就是數(shù)據(jù)寫(xiě)在磁盤(pán)上,為了數(shù)據(jù)安全考慮,我想大多數(shù)用戶都會(huì)選擇持久化。消息隊(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è)非持久化,就不允許建立綁定.
無(wú)論是要發(fā)布消息還是要獲取消息 ,應(yīng)用程序都需要通過(guò)TCP連接到RabbitMQ.應(yīng)用程序連接并通過(guò)權(quán)限認(rèn)證之后就要?jiǎng)?chuàng)建Channel來(lái)執(zhí)行AMQP命令.Channel是建立在 實(shí)際TCP連接之上通信管道,這里之所以引入channel的概念而不是直接通過(guò)TCP鏈接直接發(fā)送AMQP命令,是出于兩方面的考慮:建立上成百上千的 TCP鏈接,一方面浪費(fèi)了TCP鏈接,一方面很快會(huì)觸及系統(tǒng)瓶頸.引入了Channel之后多個(gè)進(jìn)程與RabbitMQ的通信可以在一條TCP鏈接上完 成.我們可以把TCP類比做光纜,那么Channel就像光纜中的一根根光纖.