日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

RabbitMQ--基础--04--运转流程

發(fā)布時(shí)間:2024/1/8 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RabbitMQ--基础--04--运转流程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

RabbitMQ–基礎(chǔ)–04–運(yùn)轉(zhuǎn)流程


1、在最初狀態(tài)下,Producer(生產(chǎn)者)發(fā)送消息的流程

  • Producer 連接到 Broker,建立一個(gè)Conection(TCP連接),開(kāi)啟一個(gè)Channel(信道)
  • Producer 聲明一個(gè)交換機(jī),并設(shè)置相關(guān)屬性,屬性包括如下
  • 交換機(jī)類型
  • 是否持久化等
  • Producer 聲明一個(gè)隊(duì)列,并設(shè)置相關(guān)屬性,屬性包括如下
  • 是否持久化
  • 是否排他
  • 自動(dòng)刪除等
  • Producer 通過(guò)綁定鍵(BindingKey)將交換機(jī)(Exchange)和隊(duì)列(Queue)綁定起來(lái)
  • Producer 發(fā)送消息至 Broker,其中信息包括
  • 路由鍵
  • 交換器等信息
  • 相應(yīng)的交換機(jī) Exchange 根據(jù)接收到的路由鍵查找相匹配的隊(duì)列
  • 如果找到,則將從Producer 發(fā)送過(guò)來(lái)的消息存入相應(yīng)的隊(duì)列中去
  • 如果沒(méi)有找到,則根據(jù)Producer配置的屬性
  • 可以選擇丟棄
  • 可以選擇回退給Producer
  • 關(guān)閉信道 Channel,Connection
  • 2、Consumer(消費(fèi)者)接收消息的過(guò)程

  • Consumer連接到 Broker, 建立一個(gè)Conection(TCP 連接),開(kāi)啟一個(gè)Channel(信道)
  • Consumer向 Broker 請(qǐng)求消費(fèi)相應(yīng)隊(duì)列中的消息,可能會(huì)設(shè)置相應(yīng)的回調(diào)函數(shù),以及做一些準(zhǔn)備工作
  • 等待 Broker 回應(yīng)并投遞相應(yīng)隊(duì)列中的消息,Consumer接收消息
  • Consumer確認(rèn) ACK 接收到的消息
  • RabbitMQ 從隊(duì)列中刪除相應(yīng)已經(jīng)被確認(rèn)的消息
  • 關(guān)閉信道、連接
  • 3、consumer接收消息后,隊(duì)列對(duì)ACK的處理情況

  • 如果consumer接收消息后發(fā)送ack,rabbitmq會(huì)刪除隊(duì)列中這個(gè)消息,發(fā)送另一條消息給consumer。
  • 如果cosumer接收了消息,但在發(fā)送ack之前斷開(kāi)連接,rabbitmq會(huì)認(rèn)為這條消息沒(méi)有發(fā)送成功,在consumer再次連接的時(shí)候,rabbitmq會(huì)再次發(fā)送這條消息。
  • 如果consumer接收了消息,但是程序中如果忘記了ack/nack,rabbitmq不會(huì)重復(fù)推此消息到consumer,但是,在consumer再次連接的時(shí)候,rabbitmq會(huì)再次發(fā)送這條消息。
  • rabbitmq2.0.0和之后的版本支持consumer reject某條(類)消息,可以通過(guò)設(shè)置requeue參數(shù)中的reject為true,那么rabbitmq將會(huì)把消息發(fā)送給下一個(gè)注冊(cè)的consumer。
  • 4、總結(jié)

  • 根據(jù)上述過(guò)程,無(wú)論P(yáng)roducer還是Consumer,都需要和 RabbitMQ Broker 建立連接,這個(gè)連接就是一條 TCP連接(Connection)
  • 一旦 TCP連接 建立起來(lái),客戶端緊接著可以創(chuàng)建一個(gè) AMQP 信道(Channel),每個(gè)信道都會(huì)被指派一個(gè)唯一的 ID。
  • 信道(Channel) 是建立在 Connection 之上的虛擬連接,RabbitMQ 處理每條 AMQP 指令都是通過(guò)信道 Channel 完成的。
  • 4.1、我們完全可以直接使用 Connection 就能完成信道的工作,為什么還要引入信道 Channel 呢?

    4.1.1、場(chǎng)景

    一個(gè)應(yīng)用程序中有很多個(gè)線程需要從 RabbitMQ 中消費(fèi)消息,或者生產(chǎn)消息,那么,必然需要建立很多個(gè) Connection,也就是許多個(gè) TCP連接。然而,對(duì)于操作系統(tǒng)而言,建立和銷毀 TCP連接 是非常昂貴的開(kāi)銷,如果遇到使用高峰,性能瓶頸也隨之顯現(xiàn)。

    4.1.2、解決方案

  • RabbitMQ 采用類似于 NIO 的做法,選擇 TCP 連接復(fù)用,不僅可以減少性能開(kāi)銷,同時(shí)也便于管理。
  • 每個(gè)線程把持一個(gè)信道,所以,信道復(fù)用了 Connection 的 TCP 連接。同時(shí),RabbitMQ 可以確保每個(gè)線程的私密性,就像擁有獨(dú)立的連接一樣。
  • 總結(jié)

    以上是生活随笔為你收集整理的RabbitMQ--基础--04--运转流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。