消息中间件之RabbitMq
消息中間件是系統(tǒng)間異步交互的重要手段之一,目前常用的消息中間件很多,包括Rabbitmq、Activemq、Rocketmq、IBM MQ、kafka等,這些都是成熟的技術(shù)體系,理論上,只要是可以存儲數(shù)據(jù)的軟件,都可用來做消息中間件,比如redis,再比如各種數(shù)據(jù)庫,當(dāng)然軟件設(shè)計(jì)都有其定位,我們也沒必要做舍本求末的事情。
下面主要說其中的RabbitMq
RabbitMq是用Erlang語言編寫的實(shí)現(xiàn)了高級消息隊(duì)列協(xié)議(AMQP:Advanced Message Queue Protocol)的開源的消息中間件。
主要概念介紹
publisher:發(fā)布者,也可以稱producer生產(chǎn)者,負(fù)責(zé)推送消息到rabbitmq;
consumer:消費(fèi)者,負(fù)責(zé)從rabbitmq消費(fèi)消息;
vhost:虛擬機(jī),一個rabbitmq進(jìn)程可以有多個vhost,每個vhost互相隔離,可以單獨(dú)配置權(quán)限,類似mysql中得多個schema;
queue:消息隊(duì)列,具體存放消息的盒子;
exchange:交換機(jī),producer發(fā)消息到rabbitmq不是直接發(fā)到queue的,而是通過exchange根據(jù)相應(yīng)的規(guī)則路由到queue的;
bindingkey:exchange和queue的綁定關(guān)系叫bindingkey,一個exchange可以綁定多個queue(bindingkey可以相同也可以不同),一個queue也可以綁定到多個exchange(bindingkey可以相同也可以不同);
routingkey:producer發(fā)送消息到exchange,并指定routingkey,那么exchange就會把消息路由給bindingkey和routingkey能對應(yīng)上的所有queue中(rabbitmq有多種exchange類型,不是都靠routingkey和bindingkey進(jìn)行匹配路由的,后面會詳細(xì)介紹);
其簡單模型圖如下:
交換機(jī)(exchange)詳細(xì)介紹
RabbitMq交換機(jī)主要有四種,每一種交換機(jī)都有自己的路由規(guī)則:
直連交換機(jī)(Direct Exchange)
該交換機(jī)的作用簡單明了,就是將發(fā)送過來的消息,根據(jù)其指定的routingkey去匹配bindingkey,匹配上了(routingkey=bindingkey)就將消息發(fā)送到對應(yīng)的queue中,如下圖所示,一個routingkey="key_a"的消息就會路由到queue01和queue02。
?
?
扇形交換機(jī)(Fanout Exchange)
扇形交換機(jī)會將消息路由到綁定在其上的所有隊(duì)列中,它不會去匹配routingkey和bindingkey,它是一個廣播路由,下圖中只要有消息發(fā)到該交換機(jī),那么queue01、queue02、queue03都會收到消息。
主題交換機(jī)(Topic Exchange)
主題交換機(jī)跟上面說的直連交換機(jī)很相似,也是通過routingkey和bindingkey匹配路由消息的,不同點(diǎn)在于,直連交換機(jī)的匹配規(guī)則是routingkey=bindingkey,而主題交換機(jī)的匹配規(guī)則可以理解成routingkey like '%bindingkey%',也就是說主題交換機(jī)是模糊匹配,其具體匹配規(guī)則如下:
routingkey的定義跟java包的定義類似用"."分隔單詞,如user.log.info;
bindingkey的定義也是"."分隔,但是它可以擁有兩個通配符,一個為"*",匹配一個單詞,一個為"#",匹配零或多個單詞;
如下圖所示,routingkey="user.log.info"的消息可以路由到queue02和queue03;routingkey="process.log.error"的消息可以路由到queue01和queue03;routingkey="user.request.log"的消息可以路由到queue02。
?
頭交換機(jī)(Headers Exchange)
頭交換機(jī)的路由規(guī)則不依賴于routingkey和bindingkey的匹配關(guān)系,而是一種特殊的鍵值對匹配規(guī)則,具體規(guī)則為:
隊(duì)列queue和交換機(jī)exchange也有綁定關(guān)系,但是不叫bindingkey,而是通過一組鍵值對來綁定,其中有兩個特殊的參數(shù):
x-match:any,表示當(dāng)前組內(nèi)鍵值對只要有一個能匹配到,消息就可以進(jìn)來;
x-match:all,表示當(dāng)前組內(nèi)鍵值對必須全部匹配,消息才能進(jìn)來;
publisher在發(fā)布消息時必須指定消息頭,頭交換機(jī)就會根據(jù)消息的消息頭來做路由匹配,例如:有一個消息頭為name:beijing的消息,可以路由到queue01;消息頭為name:shanghai,id:123的消息可以路由到queue01和queue02;消息頭為id:123的消息可以路由到queue01。
RabbitMq消息可靠性
1、RabbitMq可以分為磁盤節(jié)點(diǎn)和內(nèi)存節(jié)點(diǎn)
內(nèi)存節(jié)點(diǎn):exchange、queue、vhost等元數(shù)據(jù)信息系都存在內(nèi)存中,當(dāng)然消息本身也只會在內(nèi)存中,當(dāng)服務(wù)器宕機(jī)重啟,將丟失所有的信息;
磁盤節(jié)點(diǎn):元數(shù)據(jù)和消息都會持久化到磁盤,服務(wù)器宕機(jī)重啟可以自動恢復(fù);
單機(jī)RabbitMq只能是磁盤節(jié)點(diǎn),保證服務(wù)器宕機(jī)重啟后可以恢復(fù)數(shù)據(jù);而在集群模式中,一般至少會保證有兩個磁盤節(jié)點(diǎn)和多個內(nèi)存節(jié)點(diǎn),既保證了數(shù)據(jù)的可靠性,又保證了服務(wù)器的性能。
2、數(shù)據(jù)發(fā)送到consumer后,消息會從隊(duì)列中移除,但是這個移除動作不是立馬完成,而是需要consumer ack后,默認(rèn)情況下是自動ack,消息給到consumer就刪除,但是如果consumer處理消息失敗,消息就丟失了,所以如果消息很重要,也可以手動設(shè)置ack,確認(rèn)消息處理成功后通知rabbitmq刪除該消息。
總結(jié)
以上是生活随笔為你收集整理的消息中间件之RabbitMq的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 栅格布局一般怎么用_Bootstrap每
- 下一篇: MTK keypad调试,扩张键盘IC