RabbitMQ 基本介紹
RabbitMQ的設計理念是.只要有接收消息的隊列. 郵件就會存放到隊列里. 直到訂閱人取走. . 如果沒有可以接收這個消息的消息隊列. 默認是拋棄這個消息的..
我實現的功能是將遠程實現兩
Publisher:
是Message的生產者,Publisher這個Clients產生了一些Message。
Consumer:
Message的消費者,Publisher產生的Message,最終要到達Consumer這個Clients,進行消費。
Exchange:
指定消息按什么規則,路由到哪個Queue,Message消息先要到達Exchange,在Server中承擔着從Produce接收Message的責任。
Queue:
到達Exchange的消息,根據制定的規則(Routing key)到達對應的Queue,在Server中承擔着裝載Message,是Message的容器,等待被消費出去。
Routing key:
在Exchange和Queue之間隱藏有一條黑線,可以將這條黑線看成是Routing key,Exchange就是根據這些定義好的Routing key將Message送到對應的Queue中去,是Exchange和Queue之間的橋梁。
Broker:
之前一直不理解這個Broker,其實Broker就是接收和分發消息的應用,也就是說RabbitMQ Server就是Message Broker。
VirtualHost:
虛擬主機,一個Broker里可以開有多個VirtualHost,它的作用是用作不同用戶的權限分離。
Connection:
是Publisher/Consumer和Broker之間的TCP連接。斷開連接的操作只會在Publisher/Consumer端進行,Broker不會斷開連接,除非出現網絡故障或者Broker服務出現問題,Broker服務宕了。
Connection: Channel:
如果每一次訪問RabbitMQ就建立一個Connection,那在消息量大的時候建立TCP Connection的開銷就會很大,導致的后果就是效率低下。
左邊的Client向右邊的Client發送消息,流程:
第一:獲取Conection
第二:獲取Channel
第三:定義Exchange,Queue
第四:使用一個RoutingKey將Queue Binding到一個Exchange上
第五:通過指定一個Exchange和一個RoutingKey來將消息發送到對應的Queue上,
第六:Consumer在接收時也是獲取connection,接着獲取channel,然后指定一個Queue,到Queue上取消息,它對Exchange,RoutingKey及如何Binding都不關心,到對應的Queue上去取消息就行了。
一個Publisher Client發送消息,哪些Consumer Client可以收到消息,在於Exchange,RoutingKey,Queue的關系上。
RabbitMQ的簡單理論知識就介紹這么多,下篇博客介紹RabbitMQ在CentoOS7上的安裝和配置。
首先要區別AMQP協議mandatory和immediate標志位的作用。
mandatory和immediate是AMQP協議中basic.pulish方法中的兩個標志位,它們都有當消息傳遞過程中不可達目的地時將消息返回給生產者的功能。具體區別在於:
1. mandatory標志位
當mandatory標志位設置為true時,如果exchange根據自身類型和消息routeKey無法找到一個符合條件的queue,那么會調用basic.return方法將消息返還給生產者;當mandatory設為false時,出現上述情形broker會直接將消息扔掉。
2. immediate標志位
當immediate標志位設置為true時,如果exchange在將消息route到queue(s)時發現對應的queue上沒有消費者,那么這條消息不會放入隊列中。當與消息routeKey關聯的所有queue(一個或多個)都沒有消費者時,該消息會通過basic.return方法返還給生產者。
如想使用RabbitMQ 需要先安裝 erlang 虛擬機 在安裝RabbitMQ 服務器 具體實現請查看 我的上一篇博客
具體的代碼參考請參考參考資料 良心制作 環境Springboot +maven +IDEA
https://gitee.com/xdymemory00/RabbitMQ.git