0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RabbitMQ中的路由模型(direct)

科技绿洲 来源:了不起 作者:了不起 2023-09-25 11:32 次阅读

路由模型

RabbitMQ 提供了五种不同的通信模型,上一篇文章中,简单的介绍了一下RabbitMQ的发布订阅模型模型。这篇文章来学习一下RabbitMQ中的路由模型(direct)。

路由模型(direct):路由模式相当于是分布订阅模式的升级版,多了一个 路由key来约束队列与交换机的绑定。

在路由模型中,生产者将消息发送到交换机,交换机根据消息的路由键将消息转发到对应的队列中。每个队列可以绑定多个路由键,每个路由键可以绑定到多个队列中。消费者从队列中接收消息并处理。当一个路由键被多个队列绑定时,交换机会将消息发送到所有绑定的队列中。当一个队列绑定多个路由键时,该队列将能够接收到所有路由键对应的消息。

适用场景

路由模型适用于需要点对点通信的场景,例如:

  1. 系统监控告警通知;
  2. 任务分发;
  3. 用户私信系统;
  4. 订单确认通知等。

演示

  1. 生产者

    // 生产者
    public class Producer {
        private static final String EXCHANGE_NAME = "exchange_direct_1";
        // 定义路由的key,key值是可以随意定义的
        private static final String EXCHANGE_ROUTING_KEY1 = "direct_km1";
        private static final String EXCHANGE_ROUTING_KEY2 = "direct_km2";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            Connection connection = ConnectionUtils.getConnection();
            Channel channel = connection.createChannel();
            channel.exchangeDeclare(EXCHANGE_NAME, "direct");
            for (int i = 0; i < 100; i++) {
                if (i % 2 == 0) {
                    channel.basicPublish(EXCHANGE_NAME, EXCHANGE_ROUTING_KEY1, null, ("路由模型发送的第 " + i + " 条信息").getBytes());
                } else {
                    channel.basicPublish(EXCHANGE_NAME, EXCHANGE_ROUTING_KEY2, null, ("路由模型发送的第 " + i + " 条信息").getBytes());
                }
            }
            channel.close();
            connection.close();
        }
    }
    
  2. 消费者

    // 消费者1
    public class Consumer {
        private static final String QUEUE_NAME = "queue_direct_1";
        private static final String EXCHANGE_NAME = "exchange_direct_1";
        private static final String EXCHANGE_ROUTING_KEY1 = "direct_km1";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            Connection connection = ConnectionUtils.getConnection();
            Channel channel = connection.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            channel.exchangeDeclare(EXCHANGE_NAME, "direct");
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, EXCHANGE_ROUTING_KEY1);
            DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    System.out.println("消费者1接收到的消息是:" + new String(body));
                }
            };
            channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
        }
    }
    
    // 消费者2
    public class Consumer2 {
        private static final String QUEUE_NAME = "queue_direct_2";
        private static final String EXCHANGE_NAME = "exchange_direct_1";
        private static final String EXCHANGE_ROUTING_KEY2 = "direct_km2";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            Connection connection = ConnectionUtils.getConnection();
            Channel channel = connection.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            channel.exchangeDeclare(EXCHANGE_NAME, "direct");
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, EXCHANGE_ROUTING_KEY2);
            DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    System.out.println("消费者2接收到的消息是:" + new String(body));
                }
            };
            channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
        }
    }
    
  3. 测试
    先启动2个消费者,再启动生产者
    可以得到结果是消费者1得到了序号是偶数的消息
    消费者2得到了序号是奇数的消息

小结

本文介绍了 RabbitMQ 通信模型中的路由模型的使用,通过交换机和路由键实现点对点通信,适合于需要点对点通信的场景。在实际使用过程中,需要注意以下几点:

  1. 路由键必须要与消费者绑定队列时的路由键相同,否则无法接收到消息;
  2. 可以通过多个交换机和路由键来实现更灵活的消息路由。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 交换机
    +关注

    关注

    20

    文章

    2608

    浏览量

    99032
  • 路由
    +关注

    关注

    0

    文章

    275

    浏览量

    41727
  • 模型
    +关注

    关注

    1

    文章

    3098

    浏览量

    48639
  • Direct
    +关注

    关注

    0

    文章

    15

    浏览量

    11145
  • rabbitmq
    +关注

    关注

    0

    文章

    17

    浏览量

    1009
收藏 人收藏

    评论

    相关推荐

    RabbitMQ的发布订阅模型

    上一篇文章,简单的介绍了一下RabbitMQ的work模型。这篇文章来学习一下RabbitMQ的发布订阅
    的头像 发表于 09-25 14:30 485次阅读
    <b class='flag-5'>RabbitMQ</b><b class='flag-5'>中</b>的发布订阅<b class='flag-5'>模型</b>

    RabbitMQ通信模型的work模型

    上一篇文章,简单的介绍了一下RabbitMQ,以及安装和hello world。 有的小伙伴留言说看不懂其中的方法参数,这里先解释一下几个基本的方法参数。 // 声明队列方法
    的头像 发表于 09-25 14:34 488次阅读
    <b class='flag-5'>RabbitMQ</b>通信<b class='flag-5'>模型</b><b class='flag-5'>中</b>的work<b class='flag-5'>模型</b>

    RabbitMQ是什么

    在工作中经常会用到消息队列处理各种问题,今天指北君带领大家来学一个很常用到的技术-RabbitMQ;接下来还会有关于RabbitMQ的系列教程,对你有帮助的话记得关注哦~ RabbitMQ
    的头像 发表于 09-25 14:36 801次阅读
    <b class='flag-5'>RabbitMQ</b>是什么

    RabbitMq入门教程

    RabbitMQ是一个开源的,在AMQP基础上完整的,可复用的企业消息系统。
    的头像 发表于 12-04 11:10 459次阅读
    <b class='flag-5'>RabbitMq</b>入门教程

    基于Docker Compose部署RabbitMQ的经验分享

    RabbitMQ 是一个功能强大的开源消息队列系统,它实现了高效的消息通信和异步处理。
    的头像 发表于 01-03 10:22 1664次阅读
    基于Docker Compose部署<b class='flag-5'>RabbitMQ</b>的经验分享

    Rabbitmq与esp-open-rtos集成失败了怎么解决?

    我尝试将 Rabbitmq 与 esp-open-rtos 集成,但失败了。 谁能帮忙?
    发表于 05-10 11:45

    多态路由承载的内容分发模型

    针对命名数据网络( NDN)难以保障多样化业务服务需求问题,提出了多态路由承载的内容分发模型( CDMPR)。该模型通过内容请求、路由计算、内容查表和内容缓存四种类型的重构模块组合来承
    发表于 12-06 17:04 0次下载
    多态<b class='flag-5'>路由</b>承载的内容分发<b class='flag-5'>模型</b>

    RabbitMQ-CN RabbitMQ中文文档

    RabbitMQ_into_Chinese.zip
    发表于 04-19 10:51 0次下载
    <b class='flag-5'>RabbitMQ</b>-CN <b class='flag-5'>RabbitMQ</b>中文文档

    什么情况下使用RabbitMQ或 Kafka

    如果你问自己是否Apache Kafka比RabbitMQ更好或RabbitMQ是否比Apache Kafka更可靠,我想在这里阻止你。本文将从更广泛的角度讨论这两种情况。它关注的是这两个系统提供的功能,并将指导您做出正确的决定,决定何时使用哪个系统。
    的头像 发表于 02-22 10:35 542次阅读
    什么情况下使用<b class='flag-5'>RabbitMQ</b>或 Kafka

    什么情况下使用RabbitMQ或 Kafka

    如果你问自己是否Apache Kafka比RabbitMQ更好或RabbitMQ是否比Apache Kafka更可靠,我想在这里阻止你。本文将从更广泛的角度讨论这两种情况。它关注的是这两个系统提供的功能,并将指导您做出正确的决定,决定何时使用哪个系统。
    的头像 发表于 02-24 11:12 573次阅读
    什么情况下使用<b class='flag-5'>RabbitMQ</b>或 Kafka

    RabbitMQ:消息传递的中介

    电子发烧友网站提供《RabbitMQ:消息传递的中介.zip》资料免费下载
    发表于 06-14 16:08 0次下载
    <b class='flag-5'>RabbitMQ</b>:消息传递的中介

    rabbitmq是什么?rabbitmq安装、原理、部署

    rabbitmq是什么? MQ的全称是Messagee Queue,因为消息的队列是队列,所以遵循FIFO 先进先出的原则是上下游传递信息的跨过程通信机制。 RabbitMQ是一套开源(MPL
    的头像 发表于 07-19 13:50 986次阅读

    RocketMQ和RabbitMQ的区别

    化:RocketMQ将消息存储在磁盘上,保证消息的可靠性;RabbitMQ默认将消息保存在内存,可以通过插件进行持久化。 可用性:RocketMQ具备分布
    的头像 发表于 07-24 13:39 1.4w次阅读

    Topic 模型的使用

    RabbitMQ 是一个流行的开源消息队列软件,它提供了多种通信模型,例如发布/订阅模型路由模型、work
    的头像 发表于 09-25 11:30 613次阅读

    redis和rabbitMQ的区别

    Redis和RabbitMQ之间的区别。 架构设计: Redis是一个内存存储系统,它将数据存储在内存,以提供快速的读写访问。因此,Redis的存储能力受到内存大小的限制。它使用发布/订阅模式来处理消息队列,发布者将消息发送到频道,订阅者从频道接收消息。
    的头像 发表于 12-04 14:48 1239次阅读