RabbitMQ是Erlang語言開發的基於AMQP的一款訊息中介軟體,核心思想是生產者不會將訊息直接發送給佇列,訊息在發送給用戶端時先發送給交換機,然後由交換機轉發給對應的佇列。對路由(Routing),負載均衡(Load balance)、數據持久化都有很好的支援。
它裏邊有5種數據傳遞方式
第一種是簡單模型,一個生產者,一個佇列,一個消費者,佇列只能被一個消費者監聽,所以生產者將訊息發給佇列之後,只能有一個消費者收到訊息
第二種是工作模型,一個生產者,一個佇列,多個消費者,佇列可以被多個消費者監聽,但是生產者將訊息發給佇列之後,還是隻能有一個消費者接收到訊息
後邊三種都叫訂閱模型,這三種裏邊引入了交換機的概念,具體的區分是根據交換機的型別區分的,在這三種模式種,生產者把訊息發送給交換機,交換機不負責儲存訊息,由交換機發送給指定的佇列,消費者監聽佇列消費訊息。
首先是fanout型別,這種叫廣播模式,生產者將訊息發送給交換機,交換機會將訊息轉發給所有系結到到當前交換機的佇列中,對應監聽佇列的消費者都能收到訊息,但是,如果沒有佇列系結到這個交換機,訊息會被mq丟棄。
接着是direct型別,這種叫定向模式,也叫路由模式,這種模式中,佇列在系結交換機的時候,同時指定了自己的routing key
,可以理解爲一個路由標示,生產者在發送訊息給交換機的時候,同時指定要發送給的routing key
,這時候,交換機就會根據這個routing key
來定向的發送給對應的佇列,對應監聽該routing key
的佇列的消費者就能收到訊息,但是如果交換機沒有找到對應的routing key
,訊息會被丟棄。
最後是topic模式,這種叫萬用字元模式,佇列在系結交換機的時候,同時指定了自己的routing key
,生產者在發送訊息給交換機的時候,同時指定要發送給的routing key
的萬用字元,一般這個routing key
是由多個單詞用.
的方式隔開的,萬用字元中,#
號可以匹配一個或者多個單詞,*
號只能匹配一個單詞,例如生產者指定的萬用字元爲a.#
,可以匹配到的routing key
有:a.b
、a.b.c
等,如果是a.*
的話,只能匹配a.b
或者是a.c
這樣的routing key
。每個佇列系結到交換機的時候可以定義多個routing key
,交換機會跟據指定的萬用字元,發送到匹配萬用字元的routing key
對應的佇列中,對應的消費者就可以收到訊息了,但是,如果沒有符合萬用字元的routing key
,訊息會被丟棄
當然,在生產中使用的時候,爲了避免mq宕掉等造成訊息丟失的問題,我們都會設定持久化措施,在rabbitmq裡,需要將交換機持和佇列和訊息持久化,這樣訊息就會被持久化到磁碟中,不會因爲突發的斷電等情況導致訊息丟失