RabbitMQ 是現在很常用的一個消息服務中間件, 通過不同類型的交換機(Exchange) 和不同的路由鍵(RoutingKey) , 可以實現不同分發策略, 靈活地將消息分發到不同的隊列中去.
生產者(Producer)先將消息發送到交換機, 交換機根據事先設置好的分發策略, 將消息分發到不同的隊列中, 消費者從指定隊列中獲取消息.
生產者需要關注交換機(名稱和類型), 路由鍵, 而消費者只需要關注隊列.
在 RabbitMQ 中, 每個隊列中的消息都只會被消費一次, 如果需要將同一條消息被多個消費者消費多次, 可以通過合適的交換機, 將同一條消息投遞到多個不同的隊列中, 形成多個消息副本提供給不同的消費者.
1. 簡單模式 Simple
不需要指定交換機, 生產者直接通過隊列名發送消息, 消費者也直接通過隊列名獲取消息.
2. 路由模式 Routing
需要聲明一個直連交換機(Direct Exchange), 並通過路由鍵(RoutingKey)將一個隊列綁定到直連交換機.
- 允許多重綁定: 將同一隊列以不同的路由鍵與交換機綁定
- 允許重複綁定: 將多個隊列以相同的路由鍵與交換機綁定, 會創建多個消息副本
當消息到達直連交換機時, 會根據消息中攜帶的路由鍵, 查找綁定的隊列:
- 若交換機上有通過該路由鍵綁定的隊列, 將消息投遞到該隊列
- 若交換機上沒有通過該路由鍵綁定的隊列, 則消息會被丟棄
3. 發佈/訂閱 Pub/Sub
需要聲明一個扇形交換機(Fanout Exchange), 並將多個隊列綁定到該交換機上.
扇形交換機上綁定隊列時不需要指定路由鍵(指定了也會被忽略), 到達扇形交換機的消息將會被投遞到該交換機的所有隊列中.
4. 主題模式 Topics
主題交換機與直連交換機類似, 都需要在綁定隊列時指定路由鍵, 到達交換機的消息會根據路由鍵投遞到不同的隊列.
但區別在於直連交換機使用的是精確匹配的路由鍵, 而主題交換機則允許使用通配符進行模糊匹配.
主題交換機綁定隊列的key是一個匹配表達式, 以句點.
爲分隔符, *
匹配一個詞, #
匹配任意多個詞, 如
usa.*
: 僅匹配形如usa.x
的key, 忽略usa.x.y
,usa.x.y.z
等keychina.#
: 匹配形如china.x
,china.x.y
,china.x.y.z
等key*.news
: 僅匹配形如x.news
的key, 忽略x.y.news
,x.y.z.news
等key#.weather
: 匹配形如x.weather
,x.y.weather
,x.y.z.weather
等key
比如一個生產者以usa.news
爲路由鍵發送消息到主題交換機, 則該消息會被投遞到 usa.*
和#.news
兩個隊列