1 生產(chǎn)者發(fā)送消息的流程
(1)生產(chǎn)者連接RabbitMQ,建立TCP連接(Connection),開啟信道(Channel)
(2)生產(chǎn)者聲明一個Exchange (交換器),并設(shè)置相關(guān)屬性,比如交換器類型、是否持久化等
(3)生產(chǎn)者聲明一個隊列井設(shè)置相關(guān)屬性,比如是否排他、是否持久化、是否自動刪除等
(4)生產(chǎn)者通過bindingKey (綁定Key) 將交換器和隊列綁定(binding)起來
(5)生產(chǎn)者發(fā)送消息至RabbitMQ Broker,其中包含routingKey (路由鍵)、交換器等信息
(6)相應(yīng)的交換器根據(jù)接收到的routingkey查找相匹配的隊列。
(7)如果找到,則將從生產(chǎn)者發(fā)送過來的消息存入相應(yīng)的隊列中。
(8)如果沒有找到,則根據(jù)生產(chǎn)者配置的屬性選擇丟棄還是回退給生產(chǎn)者
(9)關(guān)閉信道。
(10)關(guān)閉連接。
2 消費(fèi)者接收消息的過程
(1)消費(fèi)者連接到RabbitMQ Broker,建立一個連接(Connection),開啟一個信道(Channel)。
(2)消費(fèi)者向RabbitMQ Broker請求消費(fèi)相應(yīng)隊列中的消息,可能會設(shè)置相應(yīng)的回調(diào)函數(shù),以及做一些準(zhǔn)備工作
(3)等待RabbitMQ Broker回應(yīng)并投遞相應(yīng)隊列中的消息,消費(fèi)者接收消息。
(4)消費(fèi)者確認(rèn)(ack)接收到的消息。
(5)?RabbitMQ從隊列中刪除相應(yīng)己經(jīng)被確認(rèn)的消息。
(6)關(guān)閉信道。
(7)關(guān)閉連接。
3 Connection和Channel關(guān)系
生產(chǎn)者和消費(fèi)者,需要與RabbitMQ Broker建立TCP連接,也就是Connection。一旦TCP連接建立起來,客戶端緊接著創(chuàng)建一個AMQP 信道(Channel),每個信道都會被指派一個唯一的ID。信道是建立在Connection之上的虛擬連接,RabbitMQ處理的每條AMQP指令都是通過信道完成的。
為什么不直接使用TCP連接,而是使用信道?
RabbitMQ采用類似NIO的做法,復(fù)用TCP連接,減少性能開銷,便于管理。
當(dāng)每個信道的流量不是很大時,復(fù)用單一的Connection可以在產(chǎn)生性能瓶頸的情況下有效地節(jié)省TCP連接資源。
當(dāng)信道本身的流量很大時,一個Connection就會產(chǎn)生性能瓶頸,流量被限制。需要建立多個Connection,分?jǐn)傂诺?。具體的調(diào)優(yōu)看業(yè)務(wù)需要。
信道在AMQP中是一個很重要的概念,大多數(shù)操作都是在信道這個層面進(jìn)行的。文章來源:http://www.zghlxwxcb.cn/news/detail-644487.html
channe1.exchangeDeclare
channe1.queueDeclare
channe1.basicPublish
channe1.basicConsume
//
RabbitMQ相關(guān)的API與AMQP緊密相連,比如channel.basicPublish對應(yīng)AMQP的Basic.Publish命令。文章來源地址http://www.zghlxwxcb.cn/news/detail-644487.html
到了這里,關(guān)于RabbitMQ工作流程詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!