特點
RabbitMQ是一款使用Erlang語言開發的,實現AMQP(高級消息隊列協議)的開源消息中間件,特點如下:
- 可靠性:支持持久化,傳輸確認,發布確認等保證了MQ的可靠性
- 靈活的分發消息策略:RabbitMQ的一大特點,在消息進入MQ前由Exchange(交換機)進行路由消息(分發消息策略有:簡單模式、工作隊列模式、發布訂閱模式、路由模式、通配符模式)
- 支持集群:多臺RabbitMQ服務器可以組成一個集群,形成一個邏輯Broker。
- 多種協議:RabbitMQ支持多種消息隊列協議,比如 STOMP、MQTT 等等。
- 支持多種語言客戶端:RabbitMQ幾乎支持所有常用編程語言,包括 Java、.NET、Ruby 等等。
- 可視化管理界面:RabbitMQ提供了一個易用的用戶界面,使得用戶可以監控和管理消息 Broker。
-
插件機制:RabbitMQ提供了許多插件,可以通過插件進行擴展,也可以編寫自己的插件。
簡介
組件
- 生產者(Producer):發送消息的應用。
- 消費者(Consumer):接收消息的應用。
- 隊列(Queue):存儲消息的緩存。
- 消息(Message):由生產者通過RabbitMQ發送給消費者的信息。
- 連接(Connection):連接RabbitMQ和應用服務器的TCP連接。
- 通道(Channel):連接里的一個虛擬通道。當你通過消息隊列發送或者接收消息時,這個操作都是通過通道進行的。
- 交換機(Exchange):交換機負責從生產者那里接收消息,并根據交換類型分發到對應的消息列隊里。要實現消息的接收,一個隊列必須到綁定一個交換機。
- 綁定(Binding):綁定是隊列和交換機的一個關聯連接。
- 路由鍵(Routing Key):路由鍵是供交換機查看并根據鍵來決定如何分發消息到列隊的一個鍵。路由鍵可以說是消息的目的地址。
消息六種發送模式
生產者(Producer)發送->中間件->消費者(Consumer)接收消息。
1、簡單隊列
1)生產者將消息發送到隊列,消費者從隊列獲取消息。
2)一個隊列對應一個消費者。
2、工作隊列
1)一個生產者,多個消費者
2)一個消息發送到隊列時,只能被一個消費者消費
3)多個消費者并行處理消息,提升消息處理數據
3、發布/訂閱模式(Publish/Subcribe)
將消息發送到交換機,隊列從交換機獲取消息,隊列需要綁定到交換機。
1)一個生產者,多個消費者
2)每個消費者都有自己的隊列
3)生產者把消息發送到交換機(exchange),由交換機分發到隊列
4)交換機類型為“fanout”
4、路由模式(Routing)
路由模式是發布/訂閱模式的一種特殊情況
1)路由模式的交換機類型為“direct”
2)綁定隊列到交換機時指定 key,即路由鍵,一個隊列可以指定多個路由鍵
3)生產者發送消息時指定路由鍵,消息只會發送到綁定的key的對應隊列中
5、主題模式(Topic)
1)將路由鍵和某模式進行匹配
2)符號“#”匹配一個或多個詞,“*”匹配不多不少一個詞
3)綁定隊列到交換機指定key時,進行通配符模式匹配
6、RPC模式
1)對于RPC請求,客戶端發送一條帶有兩個屬性的消息:replyTo--設置為僅為請求創建的匿名獨占隊列;correlationId--設置為每個請求的唯一id值
2)請求被發送到rpc_queue隊列
3)RPC工作進程(即:服務器)在隊列上等待請求。當一個請求出現時,它執行任務,并使用replyTo字段中的隊列將結果發回客戶機
4)客戶機在回應消息隊列上等待數據。當消息出現時,它檢查correlationId屬性。如果匹配請求中的值,則向程序返回該響應數據
rabbitmq的四種交換機
有4種不同的交換機類型:
- 直連交換機:Direct exchange
- 扇形交換機:Fanout exchange
- 主題交換機:Topic exchange
- 首部交換機:Headers exchange
1、扇形交換機
- 扇形交換機是最基本的交換機類型,它所能做的事情非常簡單———廣播消息。
- 扇形交換機會把能接收到的消息全部發送給綁定在自己身上的隊列。
2、直連交換機
直連交換機是一種帶路由功能的交換機,一個隊列會和一個交換機綁定,除此之外再綁定一個routing_key,當消息被發送的時候,需要指定一個binding_key,這個消息被送達交換機的時候,就會被這個交換機送到指定的隊列里面去。同樣的一個binding_key也是支持應用到多個隊列中的。
3、主題交換機
- 發送到主題交換機上的消息需要攜帶指定規則的routing_key,主題交換機會根據這個規則將數據發送到對應的(多個)隊列上。
- 主題交換機的routing_key需要有一定的規則,交換機和隊列的binding_key需要采用.#......的格式,每個部分用.分開,其中:
"*"表示一個單詞
"#"表示任意數量(零個或多個)單詞
4、首部交換機
- 定義一個Hash的數據結構,消息發送的時候,會攜帶一組hash數據結構的信息,當Hash的內容匹配上的時候,消息就會被寫入隊列
- 綁定交換機和隊列的時候,Hash結構中要求攜帶一個鍵“x-match”,這個鍵的Value可以是any或者all,這代表消息攜帶的Hash是需要全部匹配(all),還是僅匹配一個鍵(any)就可以了。相比直連交換機,首部交換機的優勢是匹配的規則不被限定為字符串(string)
rabbitmq四種集群部署架構
1、主備模式
一個主/備方案,主節點提供讀寫,備用節點不提供讀寫。如果主節點掛了,就切換到備用節點,原來的備用節點升級為主節點提供讀寫服務,當原來的主節點恢復運行后,原來的主節點就變成備用節點,和 activeMQ 利用 zookeeper 做主/備一樣,也可以一主多備。
Warren (兔子窩) 模式。實現 rabbitMQ 的高可用集群,一般在并發和數據量不高的情況下,這種模式非常的好用且簡單
2、遠程模式
遠程模式可以實現雙活的一種模式,簡稱 shovel 模式,所謂的 shovel 就是把消息進行不同數據中心的復制工作,可以跨地域的讓兩個 MQ 集群互聯,遠距離通信和復制。
3、鏡像模式(常用)
- 集群模式非常經典的就是Mirror鏡像模式,保證100%數據不丟失,在實際工作中用的最多的
-
Mirror鏡像隊列,目的是為了保證rabbitmq數據的高可靠性解決方案,主要就是實現數據的同步,一般來講是2-3個實現數據同步(對于100%數據可靠性解決方案一般是3個節點)集群架構如下:
鏡像模式
4、多活模式
這種模式也是實現異地數據復制的主流模式,因為Shovel模式配置比較復雜,所以一般來說實現異地集群都是使用雙活或者多活模式來實現的。這種模式需要依賴rabbitmq的federation插件,可以實現繼續的可靠AMQP數據通信,多活模式在實際配置與應用非常的簡單。
主備模式和主從模式的區別:
主備模式:主節點提供讀寫,從節點不提供讀寫服務,只是負責提供備份服務,備份節點的主要功能是在主節點宕機時,完成自動切換 從-->主
主從模式:主節點提供讀寫,從節點只讀
消息冪等性(重復消費)
同kafka一樣,消息隊列本身無法保證冪等性,以下是解決思路:
1)redis:消費數據后把消息的唯一鍵存到redis中,每次消費的時候去redis查一下key是否存在
2)mysql:消費數據后把消息的唯一鍵存到mysql中,每次消費的時候查mysql
數據丟失
- 生產者:可通過開啟事務解決數據丟失問題
1)事務模式txSelect()、txCommit()與txRollback()
2)confirm模式 - rabbitmq:消息持久化
- 消費者:手動ack
順序性
當一個queue對應多個消費者時才會順序錯亂,只要保證一個queue對應一個consumer即可保證順序性