生活随笔
收集整理的這篇文章主要介紹了
RabbitMQ--基础--04--运转流程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
RabbitMQ–基礎–04–運轉流程
1、在最初狀態下,Producer(生產者)發送消息的流程
Producer 連接到 Broker,建立一個Conection(TCP連接),開啟一個Channel(信道)Producer 聲明一個交換機,并設置相關屬性,屬性包括如下 交換機類型是否持久化等 Producer 聲明一個隊列,并設置相關屬性,屬性包括如下 是否持久化是否排他自動刪除等 Producer 通過綁定鍵(BindingKey)將交換機(Exchange)和隊列(Queue)綁定起來Producer 發送消息至 Broker,其中信息包括 路由鍵交換器等信息 相應的交換機 Exchange 根據接收到的路由鍵查找相匹配的隊列 如果找到,則將從Producer 發送過來的消息存入相應的隊列中去如果沒有找到,則根據Producer配置的屬性 可以選擇丟棄可以選擇回退給Producer 關閉信道 Channel,Connection
2、Consumer(消費者)接收消息的過程
Consumer連接到 Broker, 建立一個Conection(TCP 連接),開啟一個Channel(信道)Consumer向 Broker 請求消費相應隊列中的消息,可能會設置相應的回調函數,以及做一些準備工作等待 Broker 回應并投遞相應隊列中的消息,Consumer接收消息Consumer確認 ACK 接收到的消息RabbitMQ 從隊列中刪除相應已經被確認的消息關閉信道、連接
3、consumer接收消息后,隊列對ACK的處理情況
如果consumer接收消息后發送ack,rabbitmq會刪除隊列中這個消息,發送另一條消息給consumer。如果cosumer接收了消息,但在發送ack之前斷開連接,rabbitmq會認為這條消息沒有發送成功,在consumer再次連接的時候,rabbitmq會再次發送這條消息。如果consumer接收了消息,但是程序中如果忘記了ack/nack,rabbitmq不會重復推此消息到consumer,但是,在consumer再次連接的時候,rabbitmq會再次發送這條消息。rabbitmq2.0.0和之后的版本支持consumer reject某條(類)消息,可以通過設置requeue參數中的reject為true,那么rabbitmq將會把消息發送給下一個注冊的consumer。
4、總結
根據上述過程,無論Producer還是Consumer,都需要和 RabbitMQ Broker 建立連接,這個連接就是一條 TCP連接(Connection)一旦 TCP連接 建立起來,客戶端緊接著可以創建一個 AMQP 信道(Channel),每個信道都會被指派一個唯一的 ID。信道(Channel) 是建立在 Connection 之上的虛擬連接,RabbitMQ 處理每條 AMQP 指令都是通過信道 Channel 完成的。
4.1、我們完全可以直接使用 Connection 就能完成信道的工作,為什么還要引入信道 Channel 呢?
4.1.1、場景
一個應用程序中有很多個線程需要從 RabbitMQ 中消費消息,或者生產消息,那么,必然需要建立很多個 Connection,也就是許多個 TCP連接。然而,對于操作系統而言,建立和銷毀 TCP連接 是非常昂貴的開銷,如果遇到使用高峰,性能瓶頸也隨之顯現。
4.1.2、解決方案
RabbitMQ 采用類似于 NIO 的做法,選擇 TCP 連接復用,不僅可以減少性能開銷,同時也便于管理。每個線程把持一個信道,所以,信道復用了 Connection 的 TCP 連接。同時,RabbitMQ 可以確保每個線程的私密性,就像擁有獨立的連接一樣。
總結
以上是生活随笔為你收集整理的RabbitMQ--基础--04--运转流程的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。