?? RabbitMQ 交換器
1、fanout exchange
發(fā)送到該交換器的所有消息帮寻,會被路由到其綁定的所有隊列。
如圖所示,所有發(fā)送到 fanout exchange
的消息都會路由到 QUEUE-1
和 QUEUE-2
2迄本、direct exchange
發(fā)送到該交換器的消息,會通過路由鍵完全匹配课竣,匹配成功就會路由到指定隊列
如圖所示嘉赎,發(fā)送到 direct exchange
的消息,會通過消息的 routing key
路由:
- 如果
routing key
值為queue.direct.key1
于樟,會路由到QUEUE-1
- 如果
routing key
值為queue.direct.key2
公条,會路由到QUEUE-2
- 如果
routing key
值為其他,不會路由到任何隊列
3迂曲、topic exchange
發(fā)送到該交換器的消息靶橱,會通過路由鍵模糊匹配,匹配成功就會路由到指定隊列
路由鍵通過 .
來劃分為多個單詞路捧, *
匹配一個單詞关霸,#
匹配零個或多個單詞
如圖所示,發(fā)送到 topic exchange
的消息鬓长,會通過消息的 routing key
模糊匹配再路由:
- 如果
routing key
值為queue.topic.key1
谒拴,會路由到QUEUE-1
和QUEUE-2
- 如果
routing key
值為test.topic.key2
,會路由到QUEUE-1
- 如果
routing key
值為queue
涉波,會路由到QUEUE-2
- 如果
routing key
值為queue.hello
英上,會路由到QUEUE-2
- 如果
routing key
值為test.test.test
炭序,不會路由到任何隊列
4、header exchange
發(fā)送到該交換器的消息苍日,會通過消息的 header
信息匹配惭聂,匹配成功就會路由到指定隊列
消息的 header
信息是 key-value
的形式,每條消息可以包含多條 header
信息相恃,路由規(guī)則是通過 header
信息的 key
來匹配的辜纲,Spring Boot 封裝的匹配規(guī)則有三種:
- where(key).exists() :匹配單個
key
- whereAll(keys).exist() :同時匹配多個
key
- whereAny(keys).exist() :匹配多個
key
中的一個或多個
如圖所示,發(fā)送到 headers exchange
的消息拦耐,會通過消息的 header
匹配:
@Bean
Binding bindingHeadersQueue1(Queue headersQueue1, HeadersExchange headersExchange) {
return BindingBuilder.bind(headersQueue1).to(headersExchange).where("one").exists();
}
@Bean
Binding bindingHeadersQueue2(Queue headersQueue1, HeadersExchange headersExchange) {
return BindingBuilder.bind(headersQueue1).to(headersExchange).whereAll("all1", "all2").exist();
}
@Bean
Binding bindingHeadersQueue3(Queue headersQueue3, HeadersExchange headersExchange) {
return BindingBuilder.bind(headersQueue3).to(headersExchange).whereAny("any1", "any2").exist();
}
- 如果
header
信息存在one=XXXX
耕腾,會路由到QUEUE-1
- 如果
header
信息存在all1=XXXX
和all2=XXXX
,會路由到QUEUE-2
- 如果
header
信息存在any1=XXXX
或any2=XXXX
杀糯,會路由到QUEUE-3
提示:
header
不能以x-
開頭扫俺,參考官方文檔:https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchange-headers