Spring Boot RabbitMQ 四种交换器 fanout、direct、topic、headers

作者: Anoyi

2019.04.12 17:47*

🏷 RabbitMQ 交换器

1、fanout exchange

发送到该交换器的所有消息,会被路由到其绑定的所有队列。

如图所示,所有发送到 fanout exchange 的消息都会路由到 QUEUE-1QUEUE-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-1QUEUE-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=XXXXall2=XXXX,会路由到 QUEUE-2
  • 如果 header 信息存在 any1=XXXXany2=XXXX,会路由到 QUEUE-3

提示:header 不能以 x- 开头,参考官方文档:https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchange-headers

🏷 示例代码

🏷 参考资料

评论

评论

昵称
邮箱