RabbitMQ通讯方式第四讲:Routing 和Topic

Routing方式和Topic方式两种方式的区别只是在routingKey的上,所以我们的第四讲将讲解着两个内容;

一.routing 方式的交换机:

1.1交换机的类型

    为了便于大家的学习,小编还是将我们学过的交换金机进行比较,便于大家理解和使用RabbtiMQ.在Hello World 和Work Queues里我们使用的是默认的交换机,在写代码的时候,我们在绑定的时,绑定的是"",在Publish/Subscribe方法是我们的交换机类型是fanout。

    而在Routing的方式下,使用的交换机类型是Direct,小编为大家带来了官网里面对于Dicert类型交换机的介绍:

    Our logging system from the previous tutorial broadcasts all messages to all consumers. We want to extend that to allow filtering messages based on their severity. For example we may want a program which writes log messages to the disk to only receive critical errors, and not waste disk space on warning or info log messages.

    在官网的解释里面我们可以清晰地看见,这个交换机对于消息可以进行过滤,不是无脑的发布消息。

1.2 从交换机类型到RoutingKey

     1.2.1默认交换机类型下的RoutingKey

             在这个方式下,RoutingKey的值必须是与Queue的名字一样才可以进行传输,不然的话就会报错。使用默认交换机的方式是Hello World 和Work Queues。

     1.2.2Fanout 交换机下的RoutingKey

              这种方式下是直接连接,;不需要RoutingKey。

      1.2.3Direct 交换机下的RoutingKey

We will use a direct exchange instead. The routing algorithm behind a direct exchange is simple - a message goes to the queues whose binding key exactly matches the routing key of the message. 

              以上是官网里的解释,注意是完全匹配。也就是说,我们的RoutingKey必须是完全匹配才可以发送成功。 

1.3 直观的流程图

 二. Topic方式的交换机:

    2.1:交换机的类型:

    交换机的类型是:Topic exchange:

    官网的解释如下:

Messages sent to a topic exchange can't have an arbitrary routing_key - it must be a list of words, delimited by dots. The words can be anything, but usually they specify some features connected to the message. A few valid routing key examples: stock.usd.nysenyse.vmwquick.orange.rabbit. There can be as many words in the routing key as you like, up to the limit of 255 bytes.

特备注意的是:再绑定的规则上有两个特殊的符号:

  • * (star) can substitute for exactly one word.  这个是占位符
  • # (hash) can substitute for zero or more words.  这个是通配符

* 代标占位符:例如*.red.*  和他匹配的必须是中间带有red的  举例:aaa.red.bbb;das.red.dfs

#代表通配符:例如“red.# "  只要是red开头的就都可以匹配。 

    2.2:直观的流程图

三.routing(路由)和topic(主题的不同

   3.1Routing(路由模式)

  • 在Direct Exchange中使用,要求交换机和队列绑定时设置一个路由键(routing key)。
  • 生产者发送消息时也会发送一个路由键,只有当这两个路由键相同时,交换机才会把消息发送给队列。
  • 它是精确匹配模式,不会使用通配符进行匹配。
  • 适用于需要将消息发送到特定队列的场景,例如错误消息传递给不同的消费者
  • 3.2Topic(主题模式)

    • 在Topic Exchange中使用,类似于Direct模式,但是支持通配符匹配。
    • 路由键可以包含通配符,如*代表匹配一个单词,#代表匹配多个单词。
    • 可以匹配多个队列,只要它们的绑定模式与消息的路由键模式相匹配。
    • 适合需要广播到多个关心同一主题的不同队列的场景,例如日志消息的分发

总结就是: routing模式是精确匹配,而topic模式是模式匹配,使用通配符来匹配路由键,从而可以路由到多个队列。

四.Routing代码:

public class Provider {
    public static final String QUEUE_NAME1="routing_queue1";
    public static final String QUEUE_NAME2="routing_queue2";
    public static final String EXCHANGE_NAME="rout";
    @Test
    public void p() throws IOException, TimeoutException {
        Connection connection = RabbitMQConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
        channel.queueDeclare(QUEUE_NAME1,false,false,false,null);
        channel.queueDeclare(QUEUE_NAME2,false,false,false,null);
        channel.queueBind(QUEUE_NAME1,EXCHANGE_NAME,"red");
        channel.queueBind(QUEUE_NAME2,EXCHANGE_NAME,"blake");
        channel.queueBind(QUEUE_NAME2,EXCHANGE_NAME,"white");
        channel.basicPublish(EXCHANGE_NAME,"red",null,"我是大笨蛋".getBytes());
        channel.basicPublish(EXCHANGE_NAME,"blake",null,"hhh".getBytes());
        channel.basicPublish(EXCHANGE_NAME,"white",null,"大白".getBytes());
        channel.basicPublish(EXCHANGE_NAME,"whit",null,"大白".getBytes());
    }
}

 消费者的代码与Work Queues相同  在小编的文章:RabbitMQ通讯方式第二讲:Work Queues-CSDN博客里面进行了详细的讲解

获取Connection的代码在小编的文章:RabbitMQ通讯方式第一讲:Hello World-CSDN博客里面进行了详细的讲解

五.Topic代码:

public class Provider {
    public static final String QUEUE_NAME1="que1";
    public static final String QUEUE_NAME2="que2";
    public static final String EXCHANGE_NAME="exchange";
    @Test
    public void p() throws IOException, TimeoutException {
        Connection connection = RabbitMQConnectionUtil.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME1,false,false,false,null);
        channel.queueDeclare(QUEUE_NAME2,false,false,false,null);
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
        channel.queueBind(QUEUE_NAME1,EXCHANGE_NAME,"*.red.*");
        channel.queueBind(QUEUE_NAME2,EXCHANGE_NAME,"*.*.rabbit");
        channel.queueBind(QUEUE_NAME2,EXCHANGE_NAME,"lazy.#");
        channel.basicPublish(EXCHANGE_NAME,"aaa.red.rabbit",null,"this is to queue".getBytes());
    }
}

 消费者的代码与Work Queues相同  在小编的文章:RabbitMQ通讯方式第二讲:Work Queues-CSDN博客里面进行了详细的讲解

获取Connection的代码在小编的文章:RabbitMQ通讯方式第一讲:Hello World-CSDN博客里面进行了详细的讲解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值