什么是MQMQ全稱是Message Queue,,消息的隊(duì)列,因?yàn)槭顷?duì)列,,所以遵循FIFO 先進(jìn)先出的原則,,它是一種跨進(jìn)程的通信機(jī)制,用于上下游傳遞消息,。在互聯(lián)網(wǎng)架構(gòu)中,,MQ是一種非常常見的上下游“邏輯解耦+物理解耦”的消息通信服務(wù)。 為什么使用MQ①流量削峰:解決高并發(fā)問題 例如秒殺活動(dòng),,可能會(huì)在短時(shí)間內(nèi)產(chǎn)生大量請(qǐng)求同時(shí)打到服務(wù)端,,如果后端對(duì)每個(gè)請(qǐng)求都進(jìn)行數(shù)據(jù)庫(kù)讀寫操作,定會(huì)造成服務(wù)器壓力過大,,產(chǎn)生服務(wù)異常甚至不可用,。我們可以通過使用MQ實(shí)現(xiàn)流量緩沖,將所有請(qǐng)求先放入消息隊(duì)列中,,服務(wù)端每次處理業(yè)務(wù)先從消息隊(duì)列獲取,,從而實(shí)現(xiàn)流量削峰,解決高并發(fā)問題,。 ②應(yīng)用解耦:提升系統(tǒng)可用性 例如電商應(yīng)用中有訂單系統(tǒng),、庫(kù)存系統(tǒng)、物流系統(tǒng),、支付系統(tǒng),,當(dāng)用戶創(chuàng)建訂單后,先后調(diào)用庫(kù)存系統(tǒng),、物流系統(tǒng),、支付系統(tǒng),任何一個(gè)子系統(tǒng)出了故障,,都會(huì)造成下單失敗,。引入消息隊(duì)列后,系統(tǒng)間耦合調(diào)用的問題會(huì)減少,,任何一個(gè)子系統(tǒng)出現(xiàn)故障都不會(huì)影響用戶下單,,子系統(tǒng)故障恢復(fù)后,會(huì)繼續(xù)處理消息,,提升系統(tǒng)可用性,。 ③異步處理:提升響應(yīng)速度 當(dāng)用戶在客戶端提交了一個(gè)同步請(qǐng)求,,后端處理需要耗時(shí)很久才能響應(yīng),這對(duì)用戶體驗(yàn)來說無疑是致命的,。如果說用戶并不關(guān)心請(qǐng)求是否處理完成,,對(duì)于一些耗時(shí)的非事務(wù)性的業(yè)務(wù)處理,可以使用消息隊(duì)列異步請(qǐng)求的方式,,將請(qǐng)求信息放入消息隊(duì)列,,直接返回客戶端響應(yīng),后端監(jiān)聽隊(duì)列自行處理,,提升響應(yīng)速度,。 常見MQ分類①Kafka 號(hào)稱大數(shù)據(jù)的殺手锏,談到大數(shù)據(jù)領(lǐng)域內(nèi)的消息傳輸,,則繞不開Kafka,,這款為大數(shù)據(jù)而生的消息中間件,以其百萬級(jí)TPS的吞吐量名聲大噪,,迅速成為大數(shù)據(jù)領(lǐng)域的寵兒,,在數(shù)據(jù)采集、傳輸,、存儲(chǔ)的過程中發(fā)揮著舉足輕重的作用,。 優(yōu)點(diǎn):?jiǎn)螜C(jī)寫入TPS約在百萬條/秒,最大的優(yōu)點(diǎn),,就是吞吐量高,。時(shí)效性ms級(jí)可用性非常高,kafka是分布式的,,一個(gè)數(shù)據(jù)多個(gè)副本,,少數(shù)機(jī)器宕機(jī),不會(huì)丟失數(shù)據(jù),,不會(huì)導(dǎo)致不可用,,消費(fèi)者采用Pull方式獲取消息,消息有序,,通過控制能夠保證所有消息被消費(fèi)且僅被消費(fèi)一次,;有優(yōu)秀的第三方Kafka Web管理界面Kafka-Manager;在日志領(lǐng)域比較成熟,,被多家公司和多個(gè)開源項(xiàng)目使用,;主要支持簡(jiǎn)單的MQ功能,在大數(shù)據(jù)領(lǐng)域的實(shí)時(shí)計(jì)算以及日志采集場(chǎng)景中大規(guī)模使用,。 缺點(diǎn):?jiǎn)螜C(jī)超過64個(gè)隊(duì)列/分區(qū),,Load會(huì)發(fā)生明顯的飆高現(xiàn)象,隊(duì)列越多,,Load越高,,發(fā)送消息響應(yīng)時(shí)間變長(zhǎng),使用短輪詢方式,,實(shí)時(shí)性取決于輪詢間隔時(shí)間,,消費(fèi)失敗不支持重試;支持消息順序,,但是一臺(tái)代理宕機(jī)后,,就會(huì)產(chǎn)生消息亂序,社區(qū)更新較慢,。 ②ActiveMQ ActiveMQ是一款非常古老的MQ,。 優(yōu)點(diǎn):?jiǎn)螜C(jī)吞吐量萬級(jí),時(shí)效性ms級(jí),,可用性高,,基于主從架構(gòu)實(shí)現(xiàn)高可用性,消息可靠,,丟失數(shù)據(jù)的概率較低,。 缺點(diǎn):官方社區(qū)現(xiàn)在對(duì)ActiveMQ 5.x維護(hù)越來越少, 高吞吐量場(chǎng)景較少使用,。 ③RocketMQ RocketMQ是阿里巴巴開源產(chǎn)品,,用Java語言實(shí)現(xiàn),在設(shè)計(jì)時(shí)參考了Kafka,,并做出些改進(jìn),被阿里巴巴廣泛應(yīng)用,。 優(yōu)點(diǎn):單機(jī)吞吐量十萬級(jí),可用性非常高,,分布式架構(gòu),,消息可以做到0丟失,MQ功能較為完善,,擴(kuò)展性好,,支持10億級(jí)別的消息堆積,不會(huì)因?yàn)槎逊e導(dǎo)致性能下降,。 缺點(diǎn):支持的客戶端語言不多,,目前是java及C++,其中C++不成熟,;社區(qū)活躍度一般,,沒有在MQ核心中實(shí)現(xiàn)JMS等接口,有些系統(tǒng)要遷移需要修改大量代碼,。 ④RabbitMQ 2007年發(fā)布,,是一個(gè)在AMQP(高級(jí)消息隊(duì)列協(xié)議)基礎(chǔ)上完成的,可復(fù)用的企業(yè)消息系統(tǒng),,是當(dāng)前最主流的消息中間件之一,。 優(yōu)點(diǎn):由于erlang語言的高并發(fā)特性,,性能較好;吞吐量到萬級(jí),,MQ功能比較完備,、健壯、穩(wěn)定,、易用,、跨平臺(tái)、支持多種語言,,如:Python,、Ruby、.NET,、Java,、JMS、C,、PHP,、ActionScript、XMPP,、STOMP等,,支持AJAX文檔齊全;開源提供的管理界面非常棒,,用起來很好用,,社區(qū)活躍度高,更新頻率相當(dāng)高,。 缺點(diǎn):商業(yè)版需要收費(fèi),,學(xué)習(xí)成本較高
RabbitMQ工作原理
RabbitMQ核心概念
RabbitMQ的高級(jí)應(yīng)用①死信隊(duì)列 死信隊(duì)列(DLX,,Dead-Letter-Exchange),利用DLX,,當(dāng)消息在一個(gè)隊(duì)列中變成無法被消費(fèi)的消息(dead message)之后,,它能被重新publish到另一個(gè)Exchange,這個(gè)Exchange就是DLX,。 消息變成死信的幾種情況: 1,、 消息被拒絕( 2,、 消息在隊(duì)列的存活時(shí)間超過設(shè)置的生存時(shí)間(TTL)時(shí)間,; 3、 隊(duì)列達(dá)到最大長(zhǎng)度(隊(duì)列滿了,,無法再添加數(shù)據(jù)到隊(duì)列中),。 DLX也是一個(gè)正常的Exchange,和一般的Exchange沒有區(qū)別,,它能在任何的隊(duì)列上被指定,,實(shí)際上就是設(shè)置某個(gè)隊(duì)列的屬性。 死信隊(duì)列的設(shè)置: 1,、首先,,需要設(shè)置死信隊(duì)列的Exchange和queue,然后進(jìn)行綁定,; 2,、然后,我們進(jìn)行正常聲明交換機(jī),、隊(duì)列,、綁定,,只不過我們需要在隊(duì)列機(jī)上一個(gè)參數(shù)即可:arguments.put(“x-dead-letter-exchange”,”dlx.exchange”);這樣消息在過期,、被拒絕,、隊(duì)列在達(dá)到最大長(zhǎng)度時(shí),消息就可以直接路由到死信隊(duì)列,。 ②延遲隊(duì)列 基于 應(yīng)用場(chǎng)景:
③隊(duì)列冪等性 冪等性的實(shí)質(zhì)是:對(duì)于一個(gè)資源,不管你請(qǐng)求一次還是請(qǐng)求多次,,對(duì)該資源本身造成的影響應(yīng)該是相同的,,不能因?yàn)橹貜?fù)相同的請(qǐng)求而對(duì)該資源重復(fù)造成影響。注意關(guān)注的是請(qǐng)求操作對(duì)資源本身造成的影響,,而不是請(qǐng)求資源返回的結(jié)果,。 MQ消費(fèi)者的冪等性一般使用全局ID或者寫個(gè)唯一標(biāo)識(shí)(比如流水號(hào)/時(shí)間戳/UUID/訂單號(hào))來判斷該消息是否已消費(fèi)過,也可以利用redis執(zhí)行setnx命令,,天然具有冪等性,,從而實(shí)現(xiàn)不重復(fù)消費(fèi)(推薦使用redis)。 ④優(yōu)先級(jí)隊(duì)列 優(yōu)先級(jí)隊(duì)列,,也就是具有高優(yōu)先級(jí)的隊(duì)列,,優(yōu)先級(jí)高的消息具備優(yōu)先被消費(fèi)的特權(quán)。通過隊(duì)列的 x-max-priority 參數(shù)設(shè)置隊(duì)列的最大優(yōu)先級(jí),,之后在發(fā)送消息時(shí)通過 priority 屬性再設(shè)置當(dāng)前消息的優(yōu)先級(jí),。優(yōu)先級(jí)應(yīng)在 0 和 255 之間,推薦1 ~ 10,。
⑤惰性隊(duì)列 惰性隊(duì)列會(huì)盡可能地將消息存入磁盤中,,而在消費(fèi)者消費(fèi)消息時(shí)才會(huì)被加載到內(nèi)存中,它支持更多的消息存儲(chǔ),。 隊(duì)列具備兩種模式:default 和 lazy,。默認(rèn)的為 default 模式,在隊(duì)列聲明的時(shí)候可以通過“x-queue-mode”參數(shù)來設(shè)置隊(duì)列的模式,,取值為“default”和“l(fā)azy”,。 |
|