🏷 RabbitMQ 交换器
1、fanout exchange
发送到该交换器的所有消息,会被路由到其绑定的所有队列。
如图所示,所有发送到 fanout exchange
的消息都会路由到 QUEUE-1
和 QUEUE-2
2、direct exchange
发送到该交换器的消息,会通过路由键完全匹配,匹配成功就会路由到指定队列
如图所示,发送到 direct exchange
的消息,会通过消息的 routing key
路由:
- 如果
routing key
值为queue.direct.key1
,会路由到QUEUE-1
- 如果
routing key
值为queue.direct.key2
,会路由到QUEUE-2
- 如果
routing key
值为其他,不会路由到任何队列
3、topic exchange
发送到该交换器的消息,会通过路由键模糊匹配,匹配成功就会路由到指定队列
路由键通过 .
来划分为多个单词, *
匹配一个单词,#
匹配零个或多个单词
如图所示,发送到 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
发送到该交换器的消息,会通过消息的 header
信息匹配,匹配成功就会路由到指定队列
消息的 header
信息是 key-value
的形式,每条消息可以包含多条 header
信息,路由规则是通过 header
信息的 key
来匹配的,Spring Boot 封装的匹配规则有三种:
- where(key).exists() :匹配单个
key
- whereAll(keys).exist() :同时匹配多个
key
- whereAny(keys).exist() :匹配多个
key
中的一个或多个
如图所示,发送到 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
网友评论