作為測(cè)試你應(yīng)該知道的MQ知識(shí)(一)

-----------------------------------------------------------------------------------------------------------

【愛測(cè)試·愛分享】

更多內(nèi)容可關(guān)注公眾號(hào):測(cè)試專享

? ? ? ?專注于性能、自動(dòng)化、接口測(cè)試、中間件等技術(shù),與您分享測(cè)試技術(shù)點(diǎn)滴,內(nèi)容涵蓋:Jmeter、PTS、Python、Selenium、小程序自動(dòng)化、Linux等熱門測(cè)試技術(shù),讓您在實(shí)戰(zhàn)中提升自我。在手機(jī)上閱讀所有文章,隨時(shí)隨地都能學(xué)習(xí)。

-------------------------------------------------------------------------------------------------------------------


? ? ? ?筆者收到幾位小伙伴的私信,作為測(cè)試工程師,需要學(xué)習(xí)消息隊(duì)列MQ嗎?從測(cè)試職業(yè)發(fā)展,保持市場(chǎng)競(jìng)爭(zhēng)力的角度來(lái)看,掌握一些底層技術(shù),深耕個(gè)人技術(shù)棧的深度,對(duì)測(cè)試工作是有重要的作用的。接下來(lái)我?guī)銓W(xué)會(huì)MQ,提升你的技術(shù)棧,讓開發(fā)測(cè)試都對(duì)你刮目相看~

一、消息隊(duì)列有什么作用?

???在分布式場(chǎng)景下,消息隊(duì)列MQ基本上是標(biāo)配,在很多場(chǎng)景下都會(huì)用到,MQ主要有三大角色(生產(chǎn)者、消息服務(wù)、消費(fèi)者),大致的過程是這樣的:

????在這個(gè)過程中,發(fā)送和接收是異步的,也就是發(fā)送無(wú)需等待,而且發(fā)送者和接收者的生命周期也沒有必然的關(guān)系;以下以電商中最常見的秒殺場(chǎng)景為例分析消息隊(duì)列的作用。

1、異步處理

① 不使用消息隊(duì)列下單步驟:

以上,從用戶下單需要經(jīng)歷5個(gè)流程才能返回結(jié)果給用戶,用戶需要等待結(jié)果的返回。

② 使用消息隊(duì)列后下單步驟:

? ? ?以上,從用戶下單只經(jīng)歷2個(gè)流程就可以返回結(jié)果給用戶,生成訂單、短信通知、更新統(tǒng)計(jì)數(shù)據(jù)都是異步通過MQ消費(fèi)的,無(wú)需等待這3個(gè)流程的結(jié)果,縮短了響應(yīng)時(shí)間。

2、服務(wù)解耦

① 不使用消息隊(duì)列下單:

以上,一個(gè)下單流程經(jīng)歷了4個(gè)系統(tǒng)。當(dāng)任何一個(gè)系統(tǒng)出現(xiàn)問題無(wú)法訪問時(shí), 訂單也會(huì)失敗。訂單系統(tǒng)與其他系統(tǒng)耦合。

② 使用消息隊(duì)列后下單:

【訂單系統(tǒng)】:用戶下單后,訂單系統(tǒng)完成持久化處理,將消息寫入消息隊(duì)列,返回用戶訂單下單成功。

【其他系統(tǒng)】:訂閱下單的消息,采用pull或push的方式,獲取下單信息,庫(kù)存系統(tǒng)根據(jù)下單信息,進(jìn)行庫(kù)存操作。

此時(shí),其他系統(tǒng)出問題,不會(huì)影響到訂單系統(tǒng)。這就是將原來(lái)耦合的兩個(gè)系統(tǒng)實(shí)現(xiàn)了應(yīng)用解耦。

3、流量削峰

前面說(shuō)的秒殺活動(dòng)異步處理僅僅只是提升響應(yīng)速度,但是面對(duì)秒殺場(chǎng)景也需要做好流量控制,避免流量過大將秒殺系統(tǒng)壓垮。因此可以利用消息隊(duì)列隔離網(wǎng)關(guān)和后端服務(wù),以達(dá)到流量控制和保護(hù)后端服務(wù)的目的。

? ? 以上,當(dāng)短時(shí)間內(nèi)大量的秒殺請(qǐng)求到達(dá)網(wǎng)關(guān)時(shí),不會(huì)直接沖擊到后端的秒殺服務(wù),而是先堆積在消息隊(duì)列中,后端服務(wù)按照自己的最大處理能力,從消息隊(duì)列中消費(fèi)請(qǐng)求進(jìn)行處理。這樣,能根據(jù)下游的處理能力自動(dòng)調(diào)節(jié)流量,達(dá)到“削峰填谷”的作用。


二、常見的消息隊(duì)列?

消息隊(duì)列有很多成熟的產(chǎn)品,每一個(gè)產(chǎn)品都有自己的優(yōu)勢(shì)和劣勢(shì),常見的MQ產(chǎn)品有:

(1)RocketMQ:阿里下的開源產(chǎn)品,用在電商場(chǎng)景比較多,Java開發(fā)的,低延時(shí),非常適合在線業(yè)務(wù),活躍的中文社區(qū)。

(2)ActiveMQ:老牌的開源消息隊(duì)列,目前社區(qū)不活躍,功能及性能方面比較欠缺,目前在一些遺留的系統(tǒng)比較常用。

(3)RabbitMQ:Erlang開發(fā)的,對(duì)消息堆積的支持不好,會(huì)導(dǎo)致性能急劇下降。

(4)Kafka:Scala開發(fā)的,開始用于處理海量日志,大多用于大數(shù)據(jù)和流計(jì)算領(lǐng)域,與周邊生態(tài)系統(tǒng)的兼容性最好。

在后面文章中,筆者會(huì)以RocketMQ作為例子進(jìn)行分享,掌握后看其他就很容易理解~


三、MQ的核心概念

1、Producer?

? ? ?生產(chǎn)者。負(fù)責(zé)生產(chǎn)消息,RocketMQ提供多種發(fā)送方式:同步發(fā)送、異步發(fā)送、順序發(fā)送、單向發(fā)送。

2、Comsumer?

? ? ?消費(fèi)者。負(fù)責(zé)消費(fèi)消息,從用戶應(yīng)用的角度而言提供了兩種消費(fèi)形式:拉取式消費(fèi)(pull)、推動(dòng)式消費(fèi)(push)。

3、Publish?

? ? ? 發(fā)布。指的是發(fā)布消息到MQ的,如下單的訂單服務(wù),此時(shí)訂單服務(wù)為發(fā)布者。

4、Subscribe?

? ? ? 訂閱。指例如發(fā)送短信、發(fā)送微信消息的服務(wù)訂閱MQ,此時(shí)訂閱的服務(wù)為消費(fèi)者。

5、Producer Group?

? ? ? 同一類Producer的集合。這類Producer發(fā)送同一類消息且發(fā)送邏輯一致。如果發(fā)送的是事務(wù)消息且原始生產(chǎn)者在發(fā)送之后崩潰,則Broker服務(wù)器會(huì)聯(lián)系同一生產(chǎn)者組的其他生產(chǎn)者實(shí)例以提交或回溯消費(fèi)。

6、Consumer Group?

? ? ? 同一類Consumer的集合。這類Consumer通常消費(fèi)同一類消息且消費(fèi)邏輯一致。消費(fèi)者組使得在消息消費(fèi)方面,實(shí)現(xiàn)負(fù)載均衡和容錯(cuò)的目標(biāo)變得非常容易。要注意的是,消費(fèi)者組的消費(fèi)者實(shí)例必須訂閱完全相同的Topic。RocketMQ 支持兩種消息模式:集群消費(fèi)(Clustering)和廣播消費(fèi)(Broadcasting)。

7、Topic?

? ? ?主題名稱。生產(chǎn)者發(fā)布消息到MQ,需要指定一個(gè)Topic,消費(fèi)者也需要指定具體是監(jiān)聽哪個(gè)Topic的消息,當(dāng)該topic有消息就會(huì)進(jìn)行消費(fèi)。

8、Name Server??

? ? ? ? ? 名稱服務(wù)器。用于保存 Broker 相關(guān)元信息,為Producer 和 Consumer 提供查找 Broker的信息。Producer發(fā)送消息時(shí),需先請(qǐng)求Name Server獲取Topic的路由信息,再根據(jù)Topic路由信息路由到Broker;同樣的,Consumer消費(fèi)消息時(shí),也是先請(qǐng)求Name Server獲取Topic路由信息,再根據(jù)Topic路由信息路由到Broker。

9、Broker?

? ? ? 消息存儲(chǔ)。Broker是RocketMQ的核心,提供了消息的接收、存儲(chǔ)、拉取等功能。每個(gè)broker與Name Server集群中的所有節(jié)點(diǎn)建立長(zhǎng)連接,注冊(cè)Topic等信息到所有Name Server。一般都需要保證Broker的高可用,所以會(huì)配置Broker Slave,當(dāng)Master掛掉之后,Consumer可以消費(fèi)Slave;Broker分為Master和Slave,一個(gè)Master可以對(duì)應(yīng)多個(gè)Slave,Master與Slave的對(duì)應(yīng)關(guān)系通過指定相同的BrokerName,不同的BrokerId來(lái)定義,BrokerId為0表示Master,非0表示Slave;

【Broker保存以下內(nèi)容】:

① 所有的消息;

② 所有consumer的消費(fèi)偏移量;

③ 所有consumer的訂閱關(guān)系;

④ 所有的Topic信息;

⑤ 延遲隊(duì)列的消費(fèi)進(jìn)度;

10、Queue?

? ? ? 隊(duì)列。是消息隊(duì)列RocketMQ中消息存儲(chǔ)和傳輸?shù)膶?shí)際容器,也是消息的最小存儲(chǔ)單元。消息隊(duì)列RocketMQ的所有主題都是由多個(gè)隊(duì)列組成,以此實(shí)現(xiàn)隊(duì)列數(shù)量的水平拆分和隊(duì)列內(nèi)部的流式存儲(chǔ)。隊(duì)列通過QueueId來(lái)做唯一標(biāo)識(shí)和區(qū)分。

11、Message?

? ? ?消息體。根據(jù)不同通信協(xié)議定義的固定格式進(jìn)行編碼的數(shù)據(jù)包,來(lái)封裝業(yè)務(wù)數(shù)據(jù),實(shí)現(xiàn)消息的傳輸。

---------------------------------------------------------------------------

【愛測(cè)試·愛分享】

更多內(nèi)容可關(guān)注公眾號(hào):測(cè)試專享

專注于性能、自動(dòng)化、接口測(cè)試、中間件等技術(shù),與您分享測(cè)試技術(shù)點(diǎn)滴,內(nèi)容涵蓋:Jmeter、PTS、Python、Selenium、小程序自動(dòng)化、Linux等熱門測(cè)試技術(shù),讓您在實(shí)戰(zhàn)中提升自我。在手機(jī)上閱讀所有文章,隨時(shí)隨地都能學(xué)習(xí)。

----------------------------------------------------------------------------

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容