特點(diǎn)
RabbitMQ是一款使用Erlang語(yǔ)言開(kāi)發(fā)的柠座,實(shí)現(xiàn)AMQP(高級(jí)消息隊(duì)列協(xié)議)的開(kāi)源消息中間件,特點(diǎn)如下:
- 可靠性:支持持久化,傳輸確認(rèn)浩销,發(fā)布確認(rèn)等保證了MQ的可靠性
- 靈活的分發(fā)消息策略:RabbitMQ的一大特點(diǎn),在消息進(jìn)入MQ前由Exchange(交換機(jī))進(jìn)行路由消息(分發(fā)消息策略有:簡(jiǎn)單模式听哭、工作隊(duì)列模式慢洋、發(fā)布訂閱模式、路由模式陆盘、通配符模式)
- 支持集群:多臺(tái)RabbitMQ服務(wù)器可以組成一個(gè)集群普筹,形成一個(gè)邏輯Broker。
- 多種協(xié)議:RabbitMQ支持多種消息隊(duì)列協(xié)議隘马,比如 STOMP太防、MQTT 等等。
- 支持多種語(yǔ)言客戶端:RabbitMQ幾乎支持所有常用編程語(yǔ)言酸员,包括 Java蜒车、.NET、Ruby 等等幔嗦。
- 可視化管理界面:RabbitMQ提供了一個(gè)易用的用戶界面酿愧,使得用戶可以監(jiān)控和管理消息 Broker。
-
插件機(jī)制:RabbitMQ提供了許多插件崭添,可以通過(guò)插件進(jìn)行擴(kuò)展寓娩,也可以編寫自己的插件。
簡(jiǎn)介
組件
- 生產(chǎn)者(Producer):發(fā)送消息的應(yīng)用呼渣。
- 消費(fèi)者(Consumer):接收消息的應(yīng)用棘伴。
- 隊(duì)列(Queue):存儲(chǔ)消息的緩存。
- 消息(Message):由生產(chǎn)者通過(guò)RabbitMQ發(fā)送給消費(fèi)者的信息屁置。
- 連接(Connection):連接RabbitMQ和應(yīng)用服務(wù)器的TCP連接焊夸。
- 通道(Channel):連接里的一個(gè)虛擬通道。當(dāng)你通過(guò)消息隊(duì)列發(fā)送或者接收消息時(shí)蓝角,這個(gè)操作都是通過(guò)通道進(jìn)行的阱穗。
- 交換機(jī)(Exchange):交換機(jī)負(fù)責(zé)從生產(chǎn)者那里接收消息,并根據(jù)交換類型分發(fā)到對(duì)應(yīng)的消息列隊(duì)里使鹅。要實(shí)現(xiàn)消息的接收揪阶,一個(gè)隊(duì)列必須到綁定一個(gè)交換機(jī)。
- 綁定(Binding):綁定是隊(duì)列和交換機(jī)的一個(gè)關(guān)聯(lián)連接患朱。
- 路由鍵(Routing Key):路由鍵是供交換機(jī)查看并根據(jù)鍵來(lái)決定如何分發(fā)消息到列隊(duì)的一個(gè)鍵鲁僚。路由鍵可以說(shuō)是消息的目的地址。
消息六種發(fā)送模式
生產(chǎn)者(Producer)發(fā)送->中間件->消費(fèi)者(Consumer)接收消息。
1冰沙、簡(jiǎn)單隊(duì)列
1)生產(chǎn)者將消息發(fā)送到隊(duì)列侨艾,消費(fèi)者從隊(duì)列獲取消息。
2)一個(gè)隊(duì)列對(duì)應(yīng)一個(gè)消費(fèi)者拓挥。
2唠梨、工作隊(duì)列
1)一個(gè)生產(chǎn)者,多個(gè)消費(fèi)者
2)一個(gè)消息發(fā)送到隊(duì)列時(shí)侥啤,只能被一個(gè)消費(fèi)者消費(fèi)
3)多個(gè)消費(fèi)者并行處理消息当叭,提升消息處理數(shù)據(jù)
3、發(fā)布/訂閱模式(Publish/Subcribe)
將消息發(fā)送到交換機(jī)愿棋,隊(duì)列從交換機(jī)獲取消息科展,隊(duì)列需要綁定到交換機(jī)。
1)一個(gè)生產(chǎn)者糠雨,多個(gè)消費(fèi)者
2)每個(gè)消費(fèi)者都有自己的隊(duì)列
3)生產(chǎn)者把消息發(fā)送到交換機(jī)(exchange)才睹,由交換機(jī)分發(fā)到隊(duì)列
4)交換機(jī)類型為“fanout”
4、路由模式(Routing)
路由模式是發(fā)布/訂閱模式的一種特殊情況
1)路由模式的交換機(jī)類型為“direct”
2)綁定隊(duì)列到交換機(jī)時(shí)指定 key甘邀,即路由鍵琅攘,一個(gè)隊(duì)列可以指定多個(gè)路由鍵
3)生產(chǎn)者發(fā)送消息時(shí)指定路由鍵,消息只會(huì)發(fā)送到綁定的key的對(duì)應(yīng)隊(duì)列中
5松邪、主題模式(Topic)
1)將路由鍵和某模式進(jìn)行匹配
2)符號(hào)“#”匹配一個(gè)或多個(gè)詞坞琴,“*”匹配不多不少一個(gè)詞
3)綁定隊(duì)列到交換機(jī)指定key時(shí),進(jìn)行通配符模式匹配
6逗抑、RPC模式
1)對(duì)于RPC請(qǐng)求剧辐,客戶端發(fā)送一條帶有兩個(gè)屬性的消息:replyTo--設(shè)置為僅為請(qǐng)求創(chuàng)建的匿名獨(dú)占隊(duì)列;correlationId--設(shè)置為每個(gè)請(qǐng)求的唯一id值
2)請(qǐng)求被發(fā)送到rpc_queue隊(duì)列
3)RPC工作進(jìn)程(即:服務(wù)器)在隊(duì)列上等待請(qǐng)求邮府。當(dāng)一個(gè)請(qǐng)求出現(xiàn)時(shí)荧关,它執(zhí)行任務(wù),并使用replyTo字段中的隊(duì)列將結(jié)果發(fā)回客戶機(jī)
4)客戶機(jī)在回應(yīng)消息隊(duì)列上等待數(shù)據(jù)。當(dāng)消息出現(xiàn)時(shí)褂傀,它檢查correlationId屬性忍啤。如果匹配請(qǐng)求中的值,則向程序返回該響應(yīng)數(shù)據(jù)
rabbitmq的四種交換機(jī)
有4種不同的交換機(jī)類型:
- 直連交換機(jī):Direct exchange
- 扇形交換機(jī):Fanout exchange
- 主題交換機(jī):Topic exchange
- 首部交換機(jī):Headers exchange
1仙辟、扇形交換機(jī)
- 扇形交換機(jī)是最基本的交換機(jī)類型同波,它所能做的事情非常簡(jiǎn)單———廣播消息。
- 扇形交換機(jī)會(huì)把能接收到的消息全部發(fā)送給綁定在自己身上的隊(duì)列叠国。
2未檩、直連交換機(jī)
直連交換機(jī)是一種帶路由功能的交換機(jī),一個(gè)隊(duì)列會(huì)和一個(gè)交換機(jī)綁定粟焊,除此之外再綁定一個(gè)routing_key冤狡,當(dāng)消息被發(fā)送的時(shí)候校赤,需要指定一個(gè)binding_key,這個(gè)消息被送達(dá)交換機(jī)的時(shí)候筒溃,就會(huì)被這個(gè)交換機(jī)送到指定的隊(duì)列里面去。同樣的一個(gè)binding_key也是支持應(yīng)用到多個(gè)隊(duì)列中的沾乘。
3怜奖、主題交換機(jī)
- 發(fā)送到主題交換機(jī)上的消息需要攜帶指定規(guī)則的routing_key,主題交換機(jī)會(huì)根據(jù)這個(gè)規(guī)則將數(shù)據(jù)發(fā)送到對(duì)應(yīng)的(多個(gè))隊(duì)列上翅阵。
- 主題交換機(jī)的routing_key需要有一定的規(guī)則歪玲,交換機(jī)和隊(duì)列的binding_key需要采用.#......的格式,每個(gè)部分用.分開(kāi)掷匠,其中:
"*"表示一個(gè)單詞
"#"表示任意數(shù)量(零個(gè)或多個(gè))單詞
4滥崩、首部交換機(jī)
- 定義一個(gè)Hash的數(shù)據(jù)結(jié)構(gòu),消息發(fā)送的時(shí)候讹语,會(huì)攜帶一組hash數(shù)據(jù)結(jié)構(gòu)的信息钙皮,當(dāng)Hash的內(nèi)容匹配上的時(shí)候,消息就會(huì)被寫入隊(duì)列
- 綁定交換機(jī)和隊(duì)列的時(shí)候顽决,Hash結(jié)構(gòu)中要求攜帶一個(gè)鍵“x-match”短条,這個(gè)鍵的Value可以是any或者all,這代表消息攜帶的Hash是需要全部匹配(all)才菠,還是僅匹配一個(gè)鍵(any)就可以了茸时。相比直連交換機(jī),首部交換機(jī)的優(yōu)勢(shì)是匹配的規(guī)則不被限定為字符串(string)
rabbitmq四種集群部署架構(gòu)
1赋访、主備模式
一個(gè)主/備方案可都,主節(jié)點(diǎn)提供讀寫,備用節(jié)點(diǎn)不提供讀寫蚓耽。如果主節(jié)點(diǎn)掛了渠牲,就切換到備用節(jié)點(diǎn),原來(lái)的備用節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn)提供讀寫服務(wù)田晚,當(dāng)原來(lái)的主節(jié)點(diǎn)恢復(fù)運(yùn)行后嘱兼,原來(lái)的主節(jié)點(diǎn)就變成備用節(jié)點(diǎn),和 activeMQ 利用 zookeeper 做主/備一樣贤徒,也可以一主多備芹壕。
Warren (兔子窩) 模式。實(shí)現(xiàn) rabbitMQ 的高可用集群接奈,一般在并發(fā)和數(shù)據(jù)量不高的情況下踢涌,這種模式非常的好用且簡(jiǎn)單
2、遠(yuǎn)程模式
遠(yuǎn)程模式可以實(shí)現(xiàn)雙活的一種模式序宦,簡(jiǎn)稱 shovel 模式睁壁,所謂的 shovel 就是把消息進(jìn)行不同數(shù)據(jù)中心的復(fù)制工作,可以跨地域的讓兩個(gè) MQ 集群互聯(lián),遠(yuǎn)距離通信和復(fù)制潘明。
3行剂、鏡像模式(常用)
- 集群模式非常經(jīng)典的就是Mirror鏡像模式,保證100%數(shù)據(jù)不丟失钳降,在實(shí)際工作中用的最多的
-
Mirror鏡像隊(duì)列厚宰,目的是為了保證rabbitmq數(shù)據(jù)的高可靠性解決方案,主要就是實(shí)現(xiàn)數(shù)據(jù)的同步遂填,一般來(lái)講是2-3個(gè)實(shí)現(xiàn)數(shù)據(jù)同步(對(duì)于100%數(shù)據(jù)可靠性解決方案一般是3個(gè)節(jié)點(diǎn))集群架構(gòu)如下:
鏡像模式
4铲觉、多活模式
這種模式也是實(shí)現(xiàn)異地?cái)?shù)據(jù)復(fù)制的主流模式,因?yàn)镾hovel模式配置比較復(fù)雜吓坚,所以一般來(lái)說(shuō)實(shí)現(xiàn)異地集群都是使用雙活或者多活模式來(lái)實(shí)現(xiàn)的撵幽。這種模式需要依賴rabbitmq的federation插件,可以實(shí)現(xiàn)繼續(xù)的可靠AMQP數(shù)據(jù)通信礁击,多活模式在實(shí)際配置與應(yīng)用非常的簡(jiǎn)單盐杂。
主備模式和主從模式的區(qū)別:
主備模式:主節(jié)點(diǎn)提供讀寫,從節(jié)點(diǎn)不提供讀寫服務(wù)哆窿,只是負(fù)責(zé)提供備份服務(wù),備份節(jié)點(diǎn)的主要功能是在主節(jié)點(diǎn)宕機(jī)時(shí)况褪,完成自動(dòng)切換 從-->主
主從模式:主節(jié)點(diǎn)提供讀寫,從節(jié)點(diǎn)只讀
消息冪等性(重復(fù)消費(fèi))
同kafka一樣更耻,消息隊(duì)列本身無(wú)法保證冪等性测垛,以下是解決思路:
1)redis:消費(fèi)數(shù)據(jù)后把消息的唯一鍵存到redis中嫉到,每次消費(fèi)的時(shí)候去redis查一下key是否存在
2)mysql:消費(fèi)數(shù)據(jù)后把消息的唯一鍵存到mysql中鸯绿,每次消費(fèi)的時(shí)候查mysql
數(shù)據(jù)丟失
- 生產(chǎn)者:可通過(guò)開(kāi)啟事務(wù)解決數(shù)據(jù)丟失問(wèn)題
1)事務(wù)模式txSelect()、txCommit()與txRollback()
2)confirm模式 - rabbitmq:消息持久化
- 消費(fèi)者:手動(dòng)ack
順序性
當(dāng)一個(gè)queue對(duì)應(yīng)多個(gè)消費(fèi)者時(shí)才會(huì)順序錯(cuò)亂合砂,只要保證一個(gè)queue對(duì)應(yīng)一個(gè)consumer即可保證順序性