Topic和Direct、Fanout匹配解析

举报
西魏陶渊明 发表于 2022/09/25 04:41:09 2022/09/25
【摘要】 RabbitMQ详解 MQ常用概念 快速入门使用 推荐查看 <<SpringBoot集成Rabbit使用TopicRabbit指定发送集合>> 目录 交换机(Exchange) 1.Direct Exchange 根据route key 直接找到队列 2.Topic Exchange 根据ro...

RabbitMQ详解

MQ常用概念

快速入门使用

  • 推荐查看 <<SpringBoot集成Rabbit使用TopicRabbit指定发送集合>>

目录

  • 交换机(Exchange)
    • 1.Direct Exchange 根据route key 直接找到队列
    • 2.Topic Exchange 根据route key 匹配队列
    • 3.Topic Exchange 不处理route key 全网发送,所有绑定的队列都发送

交换机(Exchange)

1. Direct Exchange

Direct Exchange是RabbitMQ默认的交换机模式,也是最简单的模式,根据key全文匹配去寻找队列。

4279695-7e2d0c28791a5b14.png

Q1 绑定了一个 binding key 名字为 orange

Q2 就有 2 个 binding key,名字为blackgreen

当消息中的 路由键 和 这个 binding key 对应上的时候,那么就知道了该消息去到哪一个队列中。

  • 代码演示 A

    
        
    1. @Bean
    2. public Queue helloQueue() {
    3. return new Queue("retry_payment");
    4. }
    5. @Bean
    6. DirectExchange exchange() {
    7. return new DirectExchange("retry_payment");
    8. }
    9. //绑定一个key,当消息匹配到就会放到这个队列中
    10. @Bean
    11. Binding bindingExchangeMessage(Queue queueMessage, DirectExchange exchange) {
    12. return BindingBuilder.bind(queueMessage).to(exchange).with("retry_payment");
    13. }
    
        
    1. //向指定routingKey中推送,推送到指定队列
    2. rabbitTemplate.convertAndSend(exchange:"retry_payment", routingKey:"retry_payment", message:message);
  • 代码演示 B


  
  1. Channel channel = connection.createChannel();
  2. channel.exchangeDeclare("retry_payment", "direct"); //声明一个交换机,direct 可以换位topic或者是fannout
  3. channel.queueDeclare("retry_payment"); //声明一个队列
  4. channel.queueBind("queueName", "exchangeName", "routingKey"); //绑定路由键
  5. //需要绑定路由键,发送消息
  6. byte[] messageBodyBytes = "hello world".getBytes();
  7. channel.basicPublish("exchangeName", "routingKey", MessageProperties.PERSISTENT_TEXT_PLAIN, messageBodyBytes);

2.Topic Exchange

11171ab4-af07-3ff6-bdf6-d1febda679c3.png

Topic Exchange 转发消息主要是根据通配符。 在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发消息。

在这种交换机模式下:

  • 路由键必须是一串字符,用句号(.) 隔开,比如说 agreements.us,或者 agreements.eu.stockholm 等。
  • 路由模式必须包含一个 星号(*),主要用于匹配路由键指定位置的一个单词,比如说,一个路由模式是这样子:agreements..b.*,那么就只能匹配路由键是这样子的:第一个单词是 agreements,第四个单词是 b。 井号(#)就表示相当于一个或者多个单词,例如一个匹配模式是agreements.eu.berlin.#,那么,以agreements.eu.berlin开头的路由键都是可以的。

具体代码发送的时候还是一样,第一个参数表示交换机,第二个参数表示routing key,第三个参数即消息。如下:

rabbitTemplate.convertAndSend("testTopicExchange","key1.a.c.key2", " this is  RabbitMQ!");

 

topic 和 direct 类似, 只是匹配上支持了"模式", 在"点分"的 routing_key 形式中, 可以使用两个通配符:

  • *表示一个词.
  • #表示零个或多个词.

3.Fanout Exchange

0bbdcd3d-9fc6-3107-b7e0-db67c174d46a.png

不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。

发送消息,只需要指定交换机,route key 可以为空

给消息设置属性值


  
  1. 设置请求头或者编码
  2. MessageProperties messageProperties= message.getMessageProperties();

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/102425325

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。