最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【RabbitMQ】消息隊(duì)列

2022-11-06 19:37 作者:阿提艾斯  | 我要投稿

1、認(rèn)識(shí)RabbitMQ

MQ: Message Queue,是一種應(yīng)用程序?qū)?yīng)用程序的通信方法,可以理解為進(jìn)程間通信的一種方法,它不限編程語(yǔ)言,各個(gè)語(yǔ)言都可以使用RabbitMQ。MQ是一種生產(chǎn)-消費(fèi)者模型,一端不斷往消息隊(duì)列中寫(xiě)消息,另一端則可以讀取隊(duì)列中的消息進(jìn)行處理。

消息隊(duì)列中間件是分布式系統(tǒng)中重要的組件,主要解決應(yīng)用解耦、異步消息、流量消鋒等問(wèn)題,實(shí)現(xiàn)高性能、高可用、可伸縮和最終一致性架構(gòu)。

解耦和異步消息主要是將消息隊(duì)列用在系統(tǒng)內(nèi)部,不同系統(tǒng)進(jìn)程之間通過(guò)消息隊(duì)列達(dá)到高內(nèi)聚低耦合的目的。

流量消鋒主要是將消息隊(duì)列放在請(qǐng)求進(jìn)入系統(tǒng)內(nèi)部之前,比如雙十一用戶請(qǐng)求系統(tǒng)量增加,就可以在請(qǐng)求進(jìn)入系統(tǒng)之前,把這些請(qǐng)求放入消息隊(duì)列里,然后系統(tǒng)再?gòu)南㈥?duì)列里獲取請(qǐng)求,防止系統(tǒng)被海量請(qǐng)求沖垮。


目前使用較多的消息隊(duì)列有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ。

Kafka: 主要解決日志方面的問(wèn)題。

RabbitMQ是由Erlang語(yǔ)言基于AMQP協(xié)議開(kāi)發(fā)的消息中間件.


2、rabbitmq安裝

因?yàn)槟康氖菍W(xué)習(xí)rabbitmq邏輯思想,所以使用了在虛擬機(jī)(ubuntu)上使用docker安裝的方式,非常簡(jiǎn)單直觀。

2.1 下載rabbitmq鏡像

如果不指定rabbitmq,默認(rèn)下載的最新版本rabbitmq。

下載rabbitmq最新版本


2.2 運(yùn)行rabbitmq容器

?從下圖中也能看到rabbitmq中的一些基礎(chǔ)信息,比如rabbitmq版本,erlang版本等。

運(yùn)行rabbitmq

查看docker下載的rabbitmq版本,從下圖中可以看到下載的版本是3.9.11

查看docker下載的rabbitmq版本


2.3 安裝rabbitmq插件

rabbitmq_management插件提供了一個(gè)基于HTTP的API,用于管理和監(jiān)控您的RabbitMQ服務(wù)器,以及基于瀏覽器的UI和命令行工具。

安裝rabbitmq_management插件

那現(xiàn)在就可以在瀏覽器里訪問(wèn)http://127.0.0.1:15672查看rabbitmq情況了

網(wǎng)頁(yè)登陸查看rabbitmq web服務(wù)

如果在2.2中運(yùn)行容器的時(shí)候沒(méi)有指定rabbitmq啟動(dòng)的用戶名和密碼的話,這里登陸的默認(rèn)用戶名和密碼是:guest/guest,下圖是登陸之后的網(wǎng)頁(yè)樣式,很簡(jiǎn)潔。

登陸rabbitmq 網(wǎng)頁(yè)

2.4 python代碼驗(yàn)證是否能聯(lián)通rabbitmq服務(wù)

也可以換做其他語(yǔ)言連接rabbitmq服務(wù),就像連接mysql一樣。

前提是需要安裝python庫(kù)pika

生產(chǎn)者的一個(gè)樣例:

注意連接rabbitmq的時(shí)候,ip換成虛擬機(jī)的ip,以下是驗(yàn)證結(jié)果,打印信息走到了,說(shuō)明之前的連接是正常的:

驗(yàn)證

?管理界面查看下推送的消息是否存在。

管理界面查看消息

如果連接失敗,會(huì)報(bào)如下錯(cuò)誤:

連接rabbitmq失敗的情況

3、rabbitmq的2種模式

3.1 簡(jiǎn)單模式

生產(chǎn)者做的三件事

(1) 連接rabbitmq

(2) 創(chuàng)建rabbitmq消息隊(duì)列

(3) 向消息隊(duì)列種插入數(shù)據(jù)

消費(fèi)者做的三件事

(1)連接rabbitmq

(2)監(jiān)聽(tīng)模式

(3)確定回調(diào)函數(shù)


啟動(dòng)生產(chǎn)者和消費(fèi)者程序,查看運(yùn)行情況:

生產(chǎn)者運(yùn)行結(jié)果:

生產(chǎn)者運(yùn)行結(jié)果

消費(fèi)者運(yùn)行結(jié)果:發(fā)現(xiàn)消費(fèi)者一直處于hang狀態(tài),只要生產(chǎn)者發(fā)送一個(gè)消息,消費(fèi)者就會(huì)接收到并打印出來(lái)。

消費(fèi)者運(yùn)行結(jié)果


注意,有幾個(gè)參數(shù)需要解釋下:

(1) 應(yīng)答參數(shù)

默認(rèn)應(yīng)答

消費(fèi)者監(jiān)聽(tīng)隊(duì)列代碼中,有一個(gè)參數(shù)auto_ack=True,表示設(shè)置為默認(rèn)應(yīng)答。

這個(gè)參數(shù)設(shè)置后,有什么效果呢?消費(fèi)者從消息隊(duì)列中取走數(shù)據(jù)之后,消息隊(duì)列中就沒(méi)有這個(gè)數(shù)據(jù)了??梢钥慈缦聢D截圖。

默認(rèn)應(yīng)答

手動(dòng)應(yīng)答

那上面的自動(dòng)應(yīng)答就有一個(gè)問(wèn)題,如果消費(fèi)者的回調(diào)函數(shù)報(bào)錯(cuò)了,修復(fù)問(wèn)題后,我們想重新從消息隊(duì)列中取報(bào)錯(cuò)的那個(gè)消息就取不到了,所以為了解決這個(gè)問(wèn)題,有了一個(gè)手動(dòng)應(yīng)答的參數(shù)。

手動(dòng)應(yīng)答就是把a(bǔ)uto_ack參數(shù)設(shè)置為False,同時(shí)手動(dòng)在回調(diào)函數(shù)里加一個(gè)數(shù)據(jù)已處理完的應(yīng)答,通知rabbitmq,可以把消息隊(duì)列中的這個(gè)數(shù)據(jù)刪掉了。

為了驗(yàn)證手動(dòng)應(yīng)答生效,修改消費(fèi)者應(yīng)答為手動(dòng)應(yīng)答,并且在回調(diào)函數(shù)里寫(xiě)一個(gè)異常,查看產(chǎn)生異常之后,數(shù)據(jù)是否還在消息隊(duì)列中,如果還在就表明手動(dòng)應(yīng)答生效了:

很明顯,消費(fèi)者收到消息之后,肯定會(huì)報(bào)錯(cuò),因?yàn)榛卣{(diào)函數(shù)里發(fā)生了除0操作。

回調(diào)函數(shù)構(gòu)造異常

查看消息隊(duì)列中報(bào)錯(cuò)對(duì)應(yīng)的那條消息是否還存在,從下圖rabbitmq管理界面看出消息果然還在,修復(fù)回調(diào)函數(shù),依舊能正常取出堆積的消息,手動(dòng)應(yīng)答至此驗(yàn)證結(jié)束。

驗(yàn)證手動(dòng)應(yīng)答

(2) 持久化參數(shù)

持久化就是把數(shù)據(jù)保存在硬盤(pán)里,防止rabbitmq服務(wù)突然斷掉了,內(nèi)存里的消息都不見(jiàn)了。方法是:

創(chuàng)建隊(duì)列的時(shí)候,指定該隊(duì)列為可持久化隊(duì)列;

插入消息時(shí),指定該消息需要被持久化。

(3)分發(fā)參數(shù)

當(dāng)有多個(gè)消費(fèi)者時(shí),默認(rèn)采用的是輪詢分發(fā),也就是當(dāng)生產(chǎn)者產(chǎn)生多個(gè)消息,會(huì)輪著給不同的消費(fèi)者,這就是輪詢分發(fā)。


但是輪詢分發(fā)會(huì)有一個(gè)問(wèn)題,消費(fèi)者A拿到消息需要處理2小時(shí),消費(fèi)者B拿到消息需要處理3分鐘,如果再來(lái)一個(gè)消息,按照輪詢分發(fā)機(jī)制,是肯定要分發(fā)給消費(fèi)者A的,那就得等消費(fèi)者A把前一個(gè)消息處理完才會(huì)接著處理下一條消息,這就導(dǎo)致了時(shí)間上的浪費(fèi)。因此引出了公平分發(fā)機(jī)制。


公平分發(fā)機(jī)制的目的就是哪個(gè)消費(fèi)者先運(yùn)行結(jié)束,就可以緊接著讀取下一條消息進(jìn)行處理,在時(shí)間上有了很大的節(jié)省。代碼中操作起來(lái)起始很方便,就是在消費(fèi)者中指定分發(fā)機(jī)制:

3.2 交換機(jī)模式

3.2.1 發(fā)布訂閱模式

如下圖所示,發(fā)布訂閱模式生產(chǎn)者和消費(fèi)者分別做的事情為:

生產(chǎn)者:

(1) 創(chuàng)建交換機(jī),并向交換機(jī)中插入消息,這就相當(dāng)于發(fā)布。

消費(fèi)者:

(1)創(chuàng)建消息隊(duì)列

(2)監(jiān)聽(tīng)交換機(jī),這樣交換機(jī)中一有數(shù)據(jù),就會(huì)向監(jiān)聽(tīng)它的消息隊(duì)列中同步數(shù)據(jù),這就相當(dāng)于訂閱。每個(gè)消費(fèi)者接收到的數(shù)據(jù)都是相同的。

發(fā)布訂閱模式原理圖

生產(chǎn)者關(guān)鍵代碼:

交換機(jī)類(lèi)型設(shè)置為fanout

消費(fèi)者關(guān)鍵代碼


3.2.2 關(guān)鍵字模式

有些場(chǎng)景并不需要消費(fèi)者創(chuàng)建的消息隊(duì)列全部接受交換機(jī)發(fā)布的數(shù)據(jù),比如消費(fèi)者1只想處理日志級(jí)別為info的信息,消費(fèi)者2只想處理日志級(jí)別為warning的信息,消費(fèi)者3想處理日志級(jí)別為info、warning、error的信息。rabbitmq正好提供了一個(gè)關(guān)鍵字模式,可以實(shí)現(xiàn)上述目的。


生產(chǎn)者關(guān)鍵代碼:

交換機(jī)類(lèi)型設(shè)置為direct,同時(shí)插入交換機(jī)的數(shù)據(jù)添加關(guān)鍵字routing_key,值可以自定義。

消費(fèi)者關(guān)鍵代碼:

接受消息指定關(guān)鍵字routing_key,值可自定義,但是要想接收到生產(chǎn)者發(fā)布的數(shù)據(jù),就必須要和生產(chǎn)者發(fā)布消息時(shí)指定的關(guān)鍵字保持一直。

3.2.3 通配符模式

關(guān)鍵字模式要求生產(chǎn)者插入數(shù)據(jù)的關(guān)鍵和消費(fèi)者接受數(shù)據(jù)的關(guān)鍵字保持一致,一個(gè)字符都不可以差。通配符模式則可以進(jìn)行模糊匹配,類(lèi)似于正則。

通配符模式將消息的傳輸類(lèi)型的key更加細(xì)化,以”key1.key2.key3...“的模式來(lái)指定信息傳輸?shù)膋ey的大類(lèi)型和小類(lèi)型,讓消費(fèi)者可以更加精細(xì)的確認(rèn)想要獲取的信息類(lèi)型。

通配符模式中兩個(gè)符號(hào)含義需要明確:

“#”匹配一個(gè)或多個(gè)詞,例如a.#可以匹配到a.b.c.d;

“**僅匹配一個(gè)詞,例如a.*只能匹配到a.b,匹配不到a.b.c。


生產(chǎn)者關(guān)鍵代碼:

交換機(jī)類(lèi)型指定為topic,同時(shí)關(guān)鍵字可以指定的更精細(xì)一些。

消費(fèi)者關(guān)鍵代碼:

綁定的關(guān)鍵字routing_key使用通配符匹配一類(lèi)消息。


最后通過(guò)rabbitmq管理界面再查看下生成的交換機(jī):

交換機(jī)


參考資料:

官方文檔:https://www.rabbitmq.com/documentation.html

docker hub官網(wǎng):https://hub.docker.com/

個(gè)人倉(cāng):https://gitee.com/atiaisi/python_rabbitmq




【RabbitMQ】消息隊(duì)列的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
枝江市| 临潭县| 满洲里市| 茂名市| 通化县| 诸城市| 林甸县| 寻乌县| 宜兰市| 鸡西市| 饶河县| 石阡县| 侯马市| 迭部县| 静安区| 清徐县| 合山市| 凌源市| 九龙城区| 那曲县| 昌宁县| 淮南市| 巧家县| 敖汉旗| 高邑县| 上虞市| 靖安县| 博白县| 波密县| 夏河县| 南开区| 台中市| 灵川县| 巴南区| 彭山县| 剑川县| 聂拉木县| 长葛市| 阿坝县| 招远市| 兴安盟|