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