字節(jié)跳動(dòng)3-3大牛力薦!RabbitMQ實(shí)戰(zhàn)指南:消息隊(duì)列面試必刷手冊(cè)
前言
RabbitMQ是目前非常熱門(mén)的一款消息中間件,不管是互聯(lián)網(wǎng)大廠還是中小企業(yè)都在大量使用。作為一名合格的開(kāi)發(fā)者,有必要對(duì)RabbitMQ有所了解。
以熟悉的電商場(chǎng)景為例,如果商品服務(wù)和訂單服務(wù)是兩個(gè)不同的微服務(wù),在下單的過(guò)程中訂單服務(wù)需要調(diào)用商品服務(wù)進(jìn)行扣庫(kù)存操作。按照傳統(tǒng)的方式,下單過(guò)程要等到調(diào)用完畢之后才能返回下單成功,如果網(wǎng)絡(luò)產(chǎn)生波動(dòng)等原因使得商品服務(wù)扣庫(kù)存延遲或者失敗,會(huì)帶來(lái)較差的用戶(hù)體驗(yàn),如果在高并發(fā)的場(chǎng)景下,這樣的處理顯然是不合適的,那怎么進(jìn)行優(yōu)化呢?這就需要消息隊(duì)列登場(chǎng)了。

消息隊(duì)列提供一個(gè)異步通信機(jī)制,消息的發(fā)送者不必一直等待到消息被成功處理才返回,而是立即返回。消息中間件負(fù)責(zé)處理網(wǎng)絡(luò)通信,如果網(wǎng)絡(luò)連接不可用,消息被暫存于隊(duì)列當(dāng)中,當(dāng)網(wǎng)絡(luò)暢通的時(shí)候在將消息轉(zhuǎn)發(fā)給相應(yīng)的應(yīng)用程序或者服務(wù),當(dāng)然前提是這些服務(wù)訂閱了該隊(duì)列。如果在商品服務(wù)和訂單服務(wù)之間使用消息中間件,既可以提高并發(fā)量,又降低服務(wù)之間的耦合度。
RabbitMQ就是這樣一款我們苦苦追尋的消息隊(duì)列。RabbitMQ是一個(gè)開(kāi)源的消息代理的隊(duì)列服務(wù)器,用來(lái)通過(guò)普通協(xié)議在完全不同的應(yīng)用之間共享數(shù)據(jù)。
RabbitMQ是使用Erlang語(yǔ)言來(lái)編寫(xiě)的,并且RabbitMQ是基于AMQP協(xié)議的。Erlang語(yǔ)言在數(shù)據(jù)交互方面性能優(yōu)秀,有著和原生Socket一樣的延遲,這也是RabbitMQ高性能的原因所在??芍^“人如其名”,RabbitMQ像兔子一樣迅速。
因篇幅限制,我會(huì)盡可能多地給大家展示文章內(nèi)容,完整內(nèi)容已備好,感興趣想要獲取的朋友,幫忙點(diǎn)贊轉(zhuǎn)發(fā)下,后臺(tái)私信【筆記】,獲取免費(fèi)下載方式。
第1章RabitMQ簡(jiǎn)介
本章首先針對(duì)消息中間件做了一個(gè)重要性的介紹,包括什么是消息中間件、消息中間件的作用及消息中間件的特點(diǎn)等。之后引入RabitMQ, 對(duì)其歷史做-一個(gè)簡(jiǎn)單的闡述,比如RabbitMQ具備哪些特點(diǎn)。本章后面的篇幅介紹了RabbiMQ的安裝及簡(jiǎn)單使用,通過(guò)演示生產(chǎn)者生產(chǎn)消息,以及消費(fèi)者消費(fèi)消息來(lái)給讀者一個(gè)對(duì)于RabbitMQ的最初的印象,為后面的探索過(guò)程打下基礎(chǔ)。



第2章RabbitMQ入門(mén)
本章主要講述的是RabitMQ 的入門(mén)知識(shí),首先介紹了生產(chǎn)者(Producer)、消費(fèi)者(Consumer)、隊(duì)列(Queue)、 交換器(Exchange)、 路由鍵(RoutingKey). 綁定( Binding)、連接(Connection)和信道(Channel)等基本術(shù)語(yǔ),還介紹了交換器的類(lèi)型: fanout. direct, topic和headers.之后通過(guò)介紹RabbiMQ的運(yùn)轉(zhuǎn)流程來(lái)加深對(duì)基本術(shù)語(yǔ)的理解。RabbitMQ可以看作AMQP協(xié)議的具體實(shí)現(xiàn),2.2 節(jié)還大致介紹了AMQP命令以及與RabbitMQ客戶(hù)端中方法如何- --對(duì)應(yīng), 包括對(duì)各個(gè)整個(gè)生產(chǎn)消費(fèi)消息的AMQP命令的流程介紹。最后展示了AMQP 0-9-1中常用的命令與RabbitMQ客戶(hù)端中方法的映射關(guān)系。



第3章客戶(hù)端開(kāi)發(fā)向?qū)?/h1>
本章主要介紹RabbitMQ客戶(hù)端開(kāi)發(fā)的簡(jiǎn)單使用,按照一個(gè)生命周期的維度對(duì)連接、創(chuàng)建、生產(chǎn)、消費(fèi)和關(guān)閉等幾個(gè)方面進(jìn)行籠統(tǒng)的介紹,讀者學(xué)習(xí)完本章的內(nèi)容之后,就能夠有效地進(jìn)行與RabbitMQ相關(guān)的開(kāi)發(fā)工作。知是行之始,行是知之成,不如現(xiàn)在動(dòng)手編寫(xiě)幾個(gè)程序來(lái)實(shí)踐一下吧。


第4章RabbitMQ進(jìn)階
提升數(shù)據(jù)可靠性有以下一些途徑:設(shè)置mandatory參數(shù)或者備份交換器(immediate參數(shù)已被淘汰):設(shè)置publisher confrm機(jī)制或者事務(wù)機(jī)制:設(shè)置交換器、隊(duì)列和消息都為持久化;設(shè)置消費(fèi)端對(duì)應(yīng)的autoAck參數(shù)為false 并在消費(fèi)完消息之后再進(jìn)行消息確認(rèn)。本章不僅介紹了數(shù)據(jù)可靠性的一些細(xì)節(jié), 還展示了RabbitMQ 的幾種已具備或者衍生的高級(jí)特性,包括TIL、死信隊(duì)列、延遲隊(duì)列、優(yōu)先級(jí)隊(duì)列、RPC功能等,這些功能在實(shí)際使用中可以讓相應(yīng)應(yīng)用的實(shí)現(xiàn)變得事半功倍。


第5章RabbitMQ管理
本章的內(nèi)容主要圍繞RabbitMQ的管理這個(gè)主題展開(kāi),包括多租戶(hù)、權(quán)限、用戶(hù)、應(yīng)用和集群管理、服務(wù)端狀態(tài)等方面,這些都可以通過(guò)rabbitmgct1 這一系列的工具來(lái)管控。.rabbitmgetl也是RabbitMQ 中最復(fù)雜的CLI管理工具,本章也基本涵蓋了大部分的rabbi tmgct1工具的使用細(xì)節(jié)。在使用相關(guān)命令時(shí),完全可以把本章的內(nèi)容作為- -個(gè)使用手冊(cè)來(lái)查閱。本章還有-一個(gè)重點(diǎn)就是rabbi tmq_ management 插件,它在提供用戶(hù)圖形化的管理理解功能之余,還提供了相應(yīng)的監(jiān)控功能。不僅如此,rabbi tmq_ management插件還提供了HTTP API接口以方便用戶(hù)調(diào)用,比如在后面7.4節(jié)和7.5節(jié)中所講到的一些功能都需要相關(guān)的HTTP API接口的協(xié)助。.


第6章RabbitMQ配置
RabbitMQ在配置這方面可謂相當(dāng)完善,在很多情況下都可以使用默認(rèn)的配置而不需要改變其中任何一個(gè)就可以讓RabbitMQ很好地提供服務(wù)。不過(guò)也有- -些特殊的情況,比如默認(rèn)的5672端口被其他的應(yīng)用程序所占用,那么就需要修改環(huán)境變量RABBITMQ_ NODE_ PORT或者改配置文件中的tcp_ listeners. 如果需要盡可能地發(fā)揮RabiMQ本身的性能,那么對(duì)于配置參數(shù)的調(diào)優(yōu)就顯得至關(guān)重要了,比如禁用Nagle算法或者增大TCP緩沖區(qū)的大小可以提高吞吐量,更多的細(xì)節(jié)等待著讀者慢慢地發(fā)掘。


第7章RabbitMQ運(yùn)維
RabbitMQ作為一個(gè)成熟的消息中間件,不僅要為應(yīng)用提供強(qiáng)大的功能支持,也要能夠維護(hù)自身狀態(tài)的穩(wěn)定,而這個(gè)維護(hù)就需要強(qiáng)大的運(yùn)維層面的支撐。運(yùn)維本身就是-一個(gè)大學(xué)間,涵蓋多方面的內(nèi)容,比如容量評(píng)估、資源分配、集群管控、系統(tǒng)調(diào)優(yōu)、升級(jí)擴(kuò)容、故障修復(fù)、控告警、負(fù)載均衡等。本章從最基本的集群搭建開(kāi)始到故障修復(fù),從集群遷移再到集群監(jiān)控井不要求能解決所有RabbitMQ 的運(yùn)維問(wèn)題,希望能夠在多個(gè)層面為讀者提供解決問(wèn)題的方法和方法思路。


第8章跨越集群的界限
RabbitMQ可以通過(guò)3種方式實(shí)現(xiàn)分布式部署:集群、Federation 和Shovel.這3種方式不是互斥的,可以根據(jù)需要選擇其中的一種或者以幾種方式的組合來(lái)達(dá)到分布式部署的目的。Federation和Shovel可以為RabitMQ的分布式部署提供更高的靈活性,但同時(shí)也提高了部署的復(fù)雜性。
本章主要闡述Federation與Shovel 的相關(guān)的原理、用途及使用方式等。最后在小結(jié)部分中將集群與Federation/Shovel的部署方式進(jìn)行對(duì)比區(qū)分,以加深對(duì)相關(guān)知識(shí)點(diǎn)的理解。


第9章RabbitMQ高階
本章首先講述了RabitMQ 的存儲(chǔ)機(jī)制,進(jìn)而對(duì)隊(duì)列的結(jié)構(gòu)展開(kāi)討論,隊(duì)列中的消息有alpha、beta. gamma. delta 這4種狀態(tài),內(nèi)部存儲(chǔ)又可以分為Q1、Q2. Delta、 Q3. Q4這5個(gè)子隊(duì)列。消息會(huì)在這5個(gè)子隊(duì)列中流轉(zhuǎn),因?yàn)樾阅艿奶嵘枰M可能地避免消息過(guò)量堆積。如果消息是持久化的,建立搭配惰性隊(duì)列使用,這樣在提升性能的同時(shí)還可以降低內(nèi)存的損耗。內(nèi)存、磁盤(pán)和流控都是用來(lái)限制消息流入得過(guò)快以避免相應(yīng)的服務(wù)進(jìn)程來(lái)不及處理而崩潰。鏡像隊(duì)列的引入可以極大地提升RabbitMQ的可用性及可靠性,提供了數(shù)據(jù)冗余備份、避免單點(diǎn)故障的功能,強(qiáng)烈建議在實(shí)際應(yīng)用中為每個(gè)重要的隊(duì)列都配置鏡像。


第10章網(wǎng)絡(luò)分區(qū)
網(wǎng)絡(luò)分區(qū)是在使用RabiMQ時(shí)所不得不面對(duì)的一個(gè)問(wèn)題,網(wǎng)絡(luò)分區(qū)的發(fā)生可能會(huì)引起消息丟失或者服務(wù)不可用等??梢院?jiǎn)單地通過(guò)重啟的方式或者配置自動(dòng)化處理的方式來(lái)處理這個(gè)問(wèn)題,但深究其里會(huì)發(fā)現(xiàn)網(wǎng)絡(luò)分區(qū)不是想象中的那么簡(jiǎn)單。本章通過(guò)網(wǎng)絡(luò)分區(qū)的意義、影響、處理及案例分析等多個(gè)維度來(lái)一一剖析其中的奧秘。


第11章RabbitMQ擴(kuò)展
有關(guān)RabbitMQ的概念介紹、結(jié)構(gòu)模型、客戶(hù)端應(yīng)用等可以看作基礎(chǔ)篇,有關(guān)RabitMQ的管理、配置、運(yùn)維等可以看作中級(jí)篇,而RabbitMQ的原理及網(wǎng)絡(luò)分區(qū)的介紹可以看作高級(jí)篇,所陳述的都是RabbitMQ在運(yùn)行時(shí)使用到的一些本體知識(shí)。而本章內(nèi)容作為一個(gè)拾遭擴(kuò)展,主要介紹RabbiMQ的消息追蹤和服務(wù)端入站連接的負(fù)裁均衡。


領(lǐng)取方式
這份經(jīng)典的rabbitMQ學(xué)習(xí)寶典怎么領(lǐng)取呢?
1.請(qǐng)?jiān)谠u(píng)論區(qū)評(píng)論+點(diǎn)贊+轉(zhuǎn)發(fā)
2.進(jìn)入頭條號(hào)主頁(yè)面,右上角有私信功能,私信小編:筆記
同時(shí)希望大家多多轉(zhuǎn)發(fā)分享給更多的朋友哦!
本文就是愿天堂沒(méi)有BUG給大家分享的內(nèi)容,大家有收獲的話(huà)可以分享下,想學(xué)習(xí)更多的話(huà)可以到微信公眾號(hào)里找我,我等你哦。
?
