I. RabbitMQ的基本概念
1. 生產(chǎn)者/消費(fèi)者
-
生產(chǎn)者(Producer)
消息的創(chuàng)建者。
負(fù)責(zé)創(chuàng)建和推送數(shù)據(jù)到消息服務(wù)器。 -
消費(fèi)者(Consumer)
消息的接收方。
負(fù)責(zé)接收消息和處理數(shù)據(jù)。
2. 消息隊列(Queue)
消息隊列是RabbitMQ的內(nèi)部對象,用于存儲生產(chǎn)者的消息直到發(fā)送給消費(fèi)者,它是消費(fèi)者接收消息的地方。
消息隊列的重要屬性:
- 持久性
broker重啟前都有效。 - 自動刪除
在所有消費(fèi)者停止使用之后自動刪除。 - 惰性
沒有主動聲明隊列,調(diào)用會導(dǎo)致異常。 - 排他性
-一旦啟用,聲明它的消費(fèi)者才能使用。
3. 交換機(jī)(Exchange)
交換機(jī)用于接收,分配消息。
1. 生產(chǎn)者要先指定一個routing key,然后將消息發(fā)送到交換機(jī)。
2. routing key需要與exchange type和binding key聯(lián)合使用才能最終生效。
3. 交換機(jī)將消息路由到一個或多個隊列中,或丟棄。
交換機(jī)包含4中類型: direct, topic, fanout, headers。
- direct(直連交換機(jī))
具有路由功能的交換機(jī),綁定到此交換機(jī)的時候需要指定一個routing_key,交換機(jī)發(fā)送消息的時候需要routing_key,會將消息發(fā)送道對應(yīng)的隊列。
先匹配,再投送。
Direct Exchange是RabbitMQ的默認(rèn)交換機(jī)模式。
這是最簡單的模式。
它根據(jù)routing key全文匹配去尋找隊列。
在綁定隊列時會設(shè)定一個routing key(通常是隊列的名字)。
只有在消息的routing key與隊列匹配時,消息才會被交換機(jī)投送到綁定的隊列中。
- topic(主題交換機(jī))
在直連交換機(jī)基礎(chǔ)上增加模式匹配,也就是對routing_key進(jìn)行模式匹配,*代表一個單詞,#代表多個單詞。
按規(guī)則轉(zhuǎn)發(fā)消息。
主題交換機(jī)(Topic Exchange)主要根據(jù)通配符轉(zhuǎn)發(fā)消息。
這種方式最靈活。
交換機(jī)和隊列的綁定會定義一種路由模式。
路由鍵(routing key)和路由模式匹配后,交換機(jī)才能轉(zhuǎn)發(fā)消息。
在這種交換機(jī)模式下,路由鍵(routing key)必須是一串字符,用"."隔開。
路由模式必須包含一個星號"*", 主要用于匹配路由鍵指定位置的一個單詞。
* 匹配一個單詞。
# 匹配0個或多個單詞。
eg:
binding key: *.com.#
匹配的routing key: cn.com, us.com.aa
不匹配: com.bb
- headers(首部交換機(jī))
忽略routing_key,使用Headers信息(一個Hash的數(shù)據(jù)結(jié)構(gòu))進(jìn)行匹配,優(yōu)勢在于可以有更多更靈活的匹配規(guī)則。
根據(jù)應(yīng)用程序消息的特定屬性進(jìn)行匹配。
- fanout(扇形交換機(jī))
廣播消息到所有隊列,沒有任何處理,速度最快。
消息廣播的模式。
這種方式將消息廣播到所有綁定到它的隊列中。
不考慮routing key的值,即使配置了路由鍵,依然會被忽略。
4. 消息確認(rèn)
消息確認(rèn)是指當(dāng)一個消息從隊列中投遞給消費(fèi)者(consumer)后,消費(fèi)者會通知一下消息代理(broker)。
消息確認(rèn)可以自動,也可以由處理消息的開發(fā)者手動執(zhí)行。
當(dāng)啟用消息確認(rèn)后,消息代理需要收到來自消費(fèi)者的確認(rèn)回執(zhí)后,才完全將消息從隊列中刪除。
?
?
II. 七種隊列模式
1. 簡單模式(Hello World)
做最簡單的事情,一個生產(chǎn)者對應(yīng)一個消費(fèi)者,RabbitMQ相當(dāng)于一個消息代理,負(fù)責(zé)將A的消息轉(zhuǎn)發(fā)給B。
單生產(chǎn)者,單消費(fèi)者,單隊列。
應(yīng)用場景:
將發(fā)送的電子郵件放到消息隊列,然后郵件服務(wù)在隊列中獲取郵件并發(fā)送給收件人。
2. 工作隊列模式(Work queues)
在多個消費(fèi)者之間分配任務(wù)(競爭的消費(fèi)者模式),一個生產(chǎn)者對應(yīng)多個消費(fèi)者。
適用于資源密集型任務(wù), 單個消費(fèi)者處理不過來,需要多個消費(fèi)者進(jìn)行處理的場景。
單生產(chǎn)者,多消費(fèi)者,單隊列。
應(yīng)用場景:
一個訂單的處理需要10s,有多個訂單可以同時放到消息隊列,
然后讓多個消費(fèi)者同時并行處理,而不是單個消費(fèi)者的串行消費(fèi)。
3. 發(fā)布訂閱模式(Publish/Subscribe)
一次向許多消費(fèi)者發(fā)送消息,將消息將廣播到所有的消費(fèi)者。
單生產(chǎn)者,多消費(fèi)者,多隊列。
應(yīng)用場景:
更新商品庫存后需要通知多個緩存和多個數(shù)據(jù)庫。
結(jié)構(gòu)如下:
- 一個fanout類型交換機(jī)扇出兩個消息隊列,分別為緩存消息隊列、數(shù)據(jù)庫消息隊列
- 一個緩存消息隊列對應(yīng)著多個緩存消費(fèi)者
- 一個數(shù)據(jù)庫消息隊列對應(yīng)著多個數(shù)據(jù)庫消費(fèi)者
4. 路由模式(Routing)
根據(jù)Routing Key有選擇地接收消息。
多消費(fèi)者,選擇性多隊列,每個隊列通過routing key全文匹配。
發(fā)送消息到交換機(jī)并且要指定路由鍵(Routing key) 。
消費(fèi)者將隊列綁定到交換機(jī)時需要指定路由key,僅消費(fèi)指定路由key的消息。
應(yīng)用場景:
在商品庫存中增加了1臺iphone12,iphone12促銷活動消費(fèi)者指定routing key為iphone12 promote,
只有此促銷活動會接收到消息,其它促銷活動不關(guān)心也不會消費(fèi)此routing key的消息。
5. 主題模式(Topics)
主題交換機(jī)方式接收消息,將routing key和模式進(jìn)行匹配。
多消費(fèi)者,選擇性多隊列,每個隊列通過模式匹配。
隊列需要綁定在一個模式上。
#匹配一個詞或多個詞,*只匹配一個詞。
應(yīng)用場景:
iphone促銷活動可以接收主題為多種iPhone的消息,如iphone12、iphone13等。
6. 遠(yuǎn)程過程調(diào)用(RPC)
在遠(yuǎn)程計算機(jī)上運(yùn)行功能并等待結(jié)果。
應(yīng)用場景:
需要等待接口返回數(shù)據(jù),如訂單支付。
7. 發(fā)布者確認(rèn)(Publisher Confirms)
與發(fā)布者進(jìn)行可靠的發(fā)布確認(rèn),發(fā)布者確認(rèn)是RabbitMQ擴(kuò)展,可以實現(xiàn)可靠的發(fā)布。
在通道上啟用發(fā)布者確認(rèn)后,RabbitMQ將異步確認(rèn)發(fā)送者發(fā)布的消息,這意味著它們已在服務(wù)器端處理。
應(yīng)用場景:
對于消息可靠性要求較高,比如錢包扣款。文章來源:http://www.zghlxwxcb.cn/news/detail-546441.html
?
https://www.cnblogs.com/davidgu/p/14702449.html文章來源地址http://www.zghlxwxcb.cn/news/detail-546441.html
到了這里,關(guān)于RabbitMQ的基本概念和七種隊列模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!