日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

消息中间件之RabbitMq

發布時間:2023/12/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 消息中间件之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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。