1柴罐、什么是RabbitMQ?為什么使用RabbitMQ憨奸?
答:RabbitMQ是一款開源的革屠,Erlang編寫的,基于AMQP協(xié)議的排宰,消息中間件似芝;
可以用它來:解耦、異步板甘、削峰党瓮。
2、RabbitMQ有什么優(yōu)缺點(diǎn)虾啦?
答:優(yōu)點(diǎn):解耦麻诀、異步、削峰傲醉;
缺點(diǎn):降低了系統(tǒng)的穩(wěn)定性:本來系統(tǒng)運(yùn)行好好的,現(xiàn)在你非要加入個(gè)消息隊(duì)列進(jìn)去呻率,那消息隊(duì)列掛了硬毕,你的系統(tǒng)不是呵呵了。因此礼仗,系統(tǒng)可用性會降低吐咳;
增加了系統(tǒng)的復(fù)雜性:加入了消息隊(duì)列逻悠,要多考慮很多方面的問題,比如:一致性問題韭脊、如何保證消息不被重復(fù)消費(fèi)童谒、如何保證消息可靠性傳輸?shù)取R虼思⒁粒枰紤]的東西更多,復(fù)雜性增大蔫饰。
3琅豆、如何保證RabbitMQ的高可用?
答:沒有哪個(gè)項(xiàng)目會只用一搭建一臺RabbitMQ服務(wù)器提供服務(wù)篓吁,風(fēng)險(xiǎn)太大茫因;
4、如何保證RabbitMQ不被重復(fù)消費(fèi)杖剪?
答:先說為什么會重復(fù)消費(fèi):正常情況下冻押,消費(fèi)者在消費(fèi)消息的時(shí)候,消費(fèi)完畢后盛嘿,會發(fā)送一個(gè)確認(rèn)消息給消息隊(duì)列洛巢,消息隊(duì)列就知道該消息被消費(fèi)了,就會將該消息從消息隊(duì)列中刪除孩擂;
但是因?yàn)榫W(wǎng)絡(luò)傳輸?shù)鹊裙收侠窃ǎ_認(rèn)信息沒有傳送到消息隊(duì)列,導(dǎo)致消息隊(duì)列不知道自己已經(jīng)消費(fèi)過該消息了类垦,再次將消息分發(fā)給其他的消費(fèi)者狈邑。
針對以上問題,一個(gè)解決思路是:保證消息的唯一性蚤认,就算是多次傳輸米苹,不要讓消息的多次消費(fèi)帶來影響;保證消息等冪性砰琢;
比如:在寫入消息隊(duì)列的數(shù)據(jù)做唯一標(biāo)示蘸嘶,消費(fèi)消息時(shí),根據(jù)唯一標(biāo)識判斷是否消費(fèi)過陪汽;
5训唱、如何保證RabbitMQ消息的可靠傳輸?
答:消息不可靠的情況可能是消息丟失挚冤,劫持等原因况增;
丟失又分為:生產(chǎn)者丟失消息、消息列表丟失消息训挡、消費(fèi)者丟失消息澳骤;
生產(chǎn)者丟失消息:從生產(chǎn)者弄丟數(shù)據(jù)這個(gè)角度來看歧强,RabbitMQ提供transaction和confirm模式來確保生產(chǎn)者不丟消息;
transaction機(jī)制就是說:發(fā)送消息前为肮,開啟事務(wù)(channel.txSelect()),然后發(fā)送消息摊册,如果發(fā)送過程中出現(xiàn)什么異常,事務(wù)就會回滾(channel.txRollback()),如果發(fā)送成功則提交事務(wù)(channel.txCommit())颊艳。然而茅特,這種方式有個(gè)缺點(diǎn):吞吐量下降;
confirm模式用的居多:一旦channel進(jìn)入confirm模式籽暇,所有在該信道上發(fā)布的消息都將會被指派一個(gè)唯一的ID(從1開始)温治,一旦消息被投遞到所有匹配的隊(duì)列之后;
rabbitMQ就會發(fā)送一個(gè)ACK給生產(chǎn)者(包含消息的唯一ID)戒悠,這就使得生產(chǎn)者知道消息已經(jīng)正確到達(dá)目的隊(duì)列了熬荆;
如果rabbitMQ沒能處理該消息,則會發(fā)送一個(gè)Nack消息給你绸狐,你可以進(jìn)行重試操作卤恳。
消息隊(duì)列丟數(shù)據(jù):消息持久化。
處理消息隊(duì)列丟數(shù)據(jù)的情況寒矿,一般是開啟持久化磁盤的配置突琳。
這個(gè)持久化配置可以和confirm機(jī)制配合使用,你可以在消息持久化磁盤后符相,再給生產(chǎn)者發(fā)送一個(gè)Ack信號拆融。
這樣,如果消息持久化磁盤之前啊终,rabbitMQ陣亡了镜豹,那么生產(chǎn)者收不到Ack信號,生產(chǎn)者會自動重發(fā)蓝牲。
那么如何持久化呢趟脂?
這里順便說一下吧,其實(shí)也很容易例衍,就下面兩步
將queue的持久化標(biāo)識durable設(shè)置為true,則代表是一個(gè)持久的隊(duì)列
發(fā)送消息的時(shí)候?qū)eliveryMode=2
這樣設(shè)置以后昔期,即使rabbitMQ掛了,重啟后也能恢復(fù)數(shù)據(jù)
消費(fèi)者丟失消息:消費(fèi)者丟數(shù)據(jù)一般是因?yàn)椴捎昧俗詣哟_認(rèn)消息模式佛玄,改為手動確認(rèn)消息即可硼一!
消費(fèi)者在收到消息之后,處理消息之前梦抢,會自動回復(fù)RabbitMQ已收到消息欠动;
如果這時(shí)處理消息失敗,就會丟失該消息惑申;
解決方案:處理消息成功后具伍,手動回復(fù)確認(rèn)消息。
6圈驼、如何保證RabbitMQ消息的順序性人芽?
答:單線程消費(fèi)保證消息的順序性;對消息進(jìn)行編號绩脆,消費(fèi)者處理消息是根據(jù)編號處理消息萤厅;
rabbitmq 的使用場景有哪些?
①. 跨系統(tǒng)的異步通信靴迫,所有需要異步交互的地方都可以使用消息隊(duì)列惕味。就像我們除了打電話(同步)以外,還需要發(fā)短信玉锌,發(fā)電子郵件(異步)的通訊方式名挥。
②. 多個(gè)應(yīng)用之間的耦合,由于消息是平臺無關(guān)和語言無關(guān)的主守,而且語義上也不再是函數(shù)調(diào)用禀倔,因此更適合作為多個(gè)應(yīng)用之間的松耦合的接口〔我基于消息隊(duì)列的耦合救湖,不需要發(fā)送方和接收方同時(shí)在線。在企業(yè)應(yīng)用集成(EAI)中涎才,文件傳輸鞋既,共享數(shù)據(jù)庫,消息隊(duì)列耍铜,遠(yuǎn)程過程調(diào)用都可以作為集成的方法邑闺。
③. 應(yīng)用內(nèi)的同步變異步,比如訂單處理业扒,就可以由前端應(yīng)用將訂單信息放到隊(duì)列检吆,后端應(yīng)用從隊(duì)列里依次獲得消息處理,高峰時(shí)的大量訂單可以積壓在隊(duì)列里慢慢處理掉程储。由于同步通常意味著阻塞蹭沛,而大量線程的阻塞會降低計(jì)算機(jī)的性能。
④. 消息驅(qū)動的架構(gòu)(EDA)章鲤,系統(tǒng)分解為消息隊(duì)列摊灭,和消息制造者和消息消費(fèi)者,一個(gè)處理流程可以根據(jù)需要拆成多個(gè)階段(Stage)败徊,階段之間用隊(duì)列連接起來帚呼,前一個(gè)階段處理的結(jié)果放入隊(duì)列,后一個(gè)階段從隊(duì)列中獲取消息繼續(xù)處理。
⑤. 應(yīng)用需要更靈活的耦合方式煤杀,如發(fā)布訂閱吃粒,比如可以指定路由規(guī)則。
⑥. 跨局域網(wǎng)牙瓢,甚至跨城市的通訊(CDN行業(yè))笤喳,比如北京機(jī)房與廣州機(jī)房的應(yīng)用程序的通信。
rabbitmq 有哪些重要的角色枯途?
RabbitMQ 中重要的角色有:生產(chǎn)者忌怎、消費(fèi)者和代理:生產(chǎn)者:消息的創(chuàng)建者,負(fù)責(zé)創(chuàng)建和推送數(shù)據(jù)到消息服務(wù)器酪夷;消費(fèi)者:消息的接收方榴啸,用于處理數(shù)據(jù)和確認(rèn)消息;代理:就是 RabbitMQ 本身晚岭,用于扮演“快遞”的角色鸥印,本身不生產(chǎn)消息,只是扮演“快遞”的角色腥例。
rabbitmq 有哪些重要的組件辅甥?
ConnectionFactory(連接管理器):應(yīng)用程序與Rabbit之間建立連接的管理器,程序代碼中使用燎竖。Channel(信道):消息推送使用的通道璃弄。
Exchange(交換器):用于接受、分配消息构回。
Queue(隊(duì)列):用于存儲生產(chǎn)者的消息夏块。
RoutingKey(路由鍵):用于把生成者的數(shù)據(jù)分配到交換器上。
BindingKey(綁定鍵):用于把交換器的消息綁定到隊(duì)列上纤掸。
rabbitmq 中 vhost 的作用是什么脐供?vhost 可以理解為虛擬 broker ,即 mini-RabbitMQ server借跪。其內(nèi)部均含有獨(dú)立的 queue政己、exchange 和 binding 等,但最最重要的是掏愁,其擁有獨(dú)立的權(quán)限系統(tǒng)歇由,可以做到 vhost 范圍的用戶控制。當(dāng)然果港,從 RabbitMQ 的全局角度沦泌,vhost 可以作為不同權(quán)限隔離的手段(一個(gè)典型的例子就是不同的應(yīng)用可以跑在不同的 vhost 中)。
rabbitmq 的消息是怎么發(fā)送的辛掠?
首先客戶端必須連接到 RabbitMQ 服務(wù)器才能發(fā)布和消費(fèi)消息谢谦,客戶端和 rabbit server 之間會創(chuàng)建一個(gè) tcp 連接释牺,一旦 tcp 打開并通過了認(rèn)證(認(rèn)證就是你發(fā)送給 rabbit 服務(wù)器的用戶名和密碼),你的客戶端和 RabbitMQ 就創(chuàng)建了一條 amqp 信道(channel)回挽,信道是創(chuàng)建在“真實(shí)” tcp 上的虛擬連接没咙,amqp 命令都是通過信道發(fā)送出去的,每個(gè)信道都會有一個(gè)唯一的 id厅各,不論是發(fā)布消息镜撩,訂閱隊(duì)列都是通過這個(gè)信道完成的。
rabbitmq 怎么保證消息的穩(wěn)定性队塘?提供了事務(wù)的功能。
通過將 channel 設(shè)置為 confirm(確認(rèn))模式宜鸯。
rabbitmq 怎么避免消息丟失憔古?
消息持久化
ACK確認(rèn)機(jī)制
設(shè)置集群鏡像模式
消息補(bǔ)償機(jī)制
要保證消息持久化成功的條件有哪些?
聲明隊(duì)列必須設(shè)置持久化 durable 設(shè)置為 true.
消息推送投遞模式必須設(shè)置持久化淋袖,deliveryMode 設(shè)置為 2(持久)鸿市。
消息已經(jīng)到達(dá)持久化交換器。
消息已經(jīng)到達(dá)持久化隊(duì)列即碗。
以上四個(gè)條件都滿足才能保證消息持久化成功焰情。
rabbitmq 持久化有什么缺點(diǎn)?
持久化的缺地就是降低了服務(wù)器的吞吐量剥懒,因?yàn)槭褂玫氖谴疟P而非內(nèi)存存儲内舟,從而降低了吞吐量〕蹰伲可盡量使用 ssd 硬盤來緩解吞吐量的問題验游。
rabbitmq 有幾種廣播類型?
三種廣播模式:fanout: 所有bind到此exchange的queue都可以接收消息(純廣播保檐,綁定到RabbitMQ的接受者都能收到消息)耕蝉;
direct: 通過routingKey和exchange決定的那個(gè)唯一的queue可以接收消息;
topic:所有符合routingKey(此時(shí)可以是一個(gè)表達(dá)式)的routingKey所bind的queue可以接收消息夜只;
rabbitmq 怎么實(shí)現(xiàn)延遲消息隊(duì)列垒在?
通過消息過期后進(jìn)入死信交換器,再由交換器轉(zhuǎn)發(fā)到延遲消費(fèi)隊(duì)列扔亥,實(shí)現(xiàn)延遲功能场躯;使用 RabbitMQ-delayed-message-exchange 插件實(shí)現(xiàn)延遲功能。
rabbitmq 集群有什么用砸王?
集群主要有以下兩個(gè)用途:高可用:某個(gè)服務(wù)器出現(xiàn)問題推盛,整個(gè) RabbitMQ 還可以繼續(xù)使用;
高容量:集群可以承載更多的消息量谦铃。
rabbitmq 節(jié)點(diǎn)的類型有哪些耘成?磁盤節(jié)點(diǎn):消息會存儲到磁盤。內(nèi)存節(jié)點(diǎn):消息都存儲在內(nèi)存中,重啟服務(wù)器消息丟失瘪菌,性能高于磁盤類型撒会。
rabbitmq 集群搭建需要注意哪些問題?
各節(jié)點(diǎn)之間使用“--link”連接师妙,此屬性不能忽略诵肛。各節(jié)點(diǎn)使用的 erlang cookie 值必須相同,此值相當(dāng)于“秘鑰”的功能默穴,用于各節(jié)點(diǎn)的認(rèn)證怔檩。整個(gè)集群中必須包含一個(gè)磁盤節(jié)點(diǎn)。
rabbitmq 每個(gè)節(jié)點(diǎn)是其他節(jié)點(diǎn)的完整拷貝嗎蓄诽?為什么薛训?
不是,原因有以下兩個(gè):存儲空間的考慮:如果每個(gè)節(jié)點(diǎn)都擁有所有隊(duì)列的完全拷貝仑氛,這樣新增節(jié)點(diǎn)不但沒有新增存儲空間乙埃,反而增加了更多的冗余數(shù)據(jù);性能的考慮:如果每條消息都需要完整拷貝到每一個(gè)集群節(jié)點(diǎn)锯岖,那新增節(jié)點(diǎn)并沒有提升處理消息的能力介袜,最多是保持和單節(jié)點(diǎn)相同的性能甚至是更糟。
rabbitmq 集群中唯一一個(gè)磁盤節(jié)點(diǎn)崩潰了會發(fā)生什么情況出吹?
如果唯一磁盤的磁盤節(jié)點(diǎn)崩潰了遇伞,不能進(jìn)行以下操作:不能創(chuàng)建隊(duì)列不能創(chuàng)建交換器不能創(chuàng)建綁定不能添加用戶不能更改權(quán)限不能添加和刪除集群節(jié)點(diǎn)唯一磁盤節(jié)點(diǎn)崩潰了,集群是可以保持運(yùn)行的趋箩,但你不能更改任何東西赃额。
rabbitmq 對集群節(jié)點(diǎn)停止順序有要求嗎?RabbitMQ 對集群的停止的順序是有要求的叫确,應(yīng)該先關(guān)閉內(nèi)存節(jié)點(diǎn)跳芳,最后再關(guān)閉磁盤節(jié)點(diǎn)。如果順序恰好相反的話竹勉,可能會造成消息的丟失飞盆。