【RabbitMQ(day3)】扇形交换机和主题交换机的应用

这篇具有很好参考价值的文章主要介绍了【RabbitMQ(day3)】扇形交换机和主题交换机的应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第三种模型(Publish/Subscribe 发布/订阅)

扇型(funout)交换机

扇型交换机将消息路由给绑定到它身上的所有队列,而不会理会绑定的路由键。如果 N 个队列绑定到某个扇型交换机上,当有消息发送给此扇型交换机时,交换机会将消息的拷贝分别发送给这所有的 N 个队列。扇型用来交换机处理消息的广播路由。

因为扇型交换机投递信息的拷贝到所有绑定到它的队列,所以它可以用来在群聊的时候,分发消息给参与群聊的用户。

扇型交换机图例:

【RabbitMQ(day3)】扇形交换机和主题交换机的应用,RabbitMQ,rabbitmq,中间件,分布式

【RabbitMQ(day3)】扇形交换机和主题交换机的应用,RabbitMQ,rabbitmq,中间件,分布式

Public/Subscribe 模型

在这种模式下,消息发送流程是这样的:

  • 可以有多个消费者;
  • 每个消费者有自己的 queue(队列)
  • 每个队列都要绑定到 Exchange(交换机)
  • 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。
  • 交换机把所有的消息发送给绑定过的所有队列。
  • 队列的消费者都能拿到消息。实现一条消息被多个消费者消费。
  1. 开发生产者
        // 将通道声明指定的交换机
        // 参数1:交换机的名称
        // 参数2:交换机的类型
        channel.exchangeDeclare("logs","fanout");

        // 发送消息
        channel.basicPublish("logs","",null,"fanout type message".getBytes());
  1. 开发消费者
        // 通道声明交换机
        channel.exchangeDeclare("logs","fanout");
        // 临时队列
        String queueName = channel.queueDeclare().getQueue();
        // 队列绑定交换机
        channel.queueBind(queueName,"logs","");

实例代码:

        Runnable myRunnable = () -> {
            try {
                Connection conn = RabbitMQUtils.getConnection();
                Channel channel = conn.createChannel();

                // 通道声明交换机
                channel.exchangeDeclare("logs", "fanout");
                // 临时队列
                String queueName = channel.queueDeclare().getQueue();
                // 队列绑定交换机
                channel.queueBind(queueName, "logs", "");

                // 消费消息
                channel.basicConsume(queueName, true, new DefaultConsumer(channel) {
                    @Override
                    public void handleDelivery(String consumerTag,
                                               Envelope envelope,
                                               AMQP.BasicProperties properties, byte[] body) throws IOException {
                        System.out.println("消费者" + consumerTag + ":" + new String(body));
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        };
        Thread t1 = new Thread(myRunnable);
        Thread t2 = new Thread(myRunnable);
        Thread t3 = new Thread(myRunnable);

        t1.start();
        t2.start();
        t3.start();

结果(有群发那味了):

【RabbitMQ(day3)】扇形交换机和主题交换机的应用,RabbitMQ,rabbitmq,中间件,分布式

绑定

  • 绑定是交换机将消息路由给队列所需遵循的规则。如果要制定交换机“E”将消息路由给队列“Q”,那么“Q”就需要与“E”进行绑定。绑定操作需要定义一个可选的路由键(routing key)属性给某些类型的交换机(当然像这第三种模型这样的,路由键有没有无所谓的,则不需声明路由键,而前两种模型下,是自动绑定的,交换机则为默认交换机,路由键和队列名一致的。)。路由键的意义在于从发送给交换机的众多消息中选择出某些消息,将其路由给绑定的队列,然后消费者再从队列中消费消息。

第四、第五种模型(Routing、Topics)

第四种模型(Routing)

在第三种模型中,一条消息会被所有订阅的队列都消费。但是,在某些场景下,希望不同的消息被不同的队列消费。这时候就需要用直连交换机构建的路由routing模型了

【RabbitMQ(day3)】扇形交换机和主题交换机的应用,RabbitMQ,rabbitmq,中间件,分布式

图解:

  • P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。
  • X:Exchange(交换机),接收生产者的消息,然后把消息递交给与routing key完全匹配的队列。
  • C1:消费者,其所在队列指定了需要routing key 为error的消息。
  • C2:消费者,其所在队列指定了需要routing key 为 info、error、warning的消息。
  1. 开发生产者
		// 通过通道声明交换机
        channel.exchangeDeclare("logs_routing", "direct");

        // 发送消息
        String routingKey = "info";
        channel.basicPublish("logs_routing", routingKey, null, ("这是direct模型发布的基于route key:" + routingKey).getBytes());
  1. 开发消费者
        // 通道声明交换机以及交换的类型
        channel.exchangeDeclare("logs_routing", "direct");
        // 创建一个临时队列
        String queueName = channel.queueDeclare().getQueue();
        // 基于route key 绑定队列和交换机
        channel.queueBind(queueName, "logs_routing", "error");

主题交换机(Topic Exchange)

主题交换机通过对消息的路由键和队列到交换机的绑定模式之间的匹配,将消息路由给一个或多个队列(注意这是消息给一个或多个队列,和直连交换机可不同,直连是路由键和队列同名,一个消息对应一个队列这种才是直连)。主题交换机经常用来实现各种分发/订阅模式及其变种。主题交换机通常用来实现消息的多播路由(与第三种模型的广播路由不同)。

主题交换机拥有非常广泛的用户案例。当一个问题涉及到那些想要有针对性的选择需要接收消息的多消费/多应用的时候,主题交换机都可以被列入考虑范围。

第五种模型(Topics)

主题交换机和直连交换机相比,都是可以根据 routingkey 把消息路由到不同的队列。只不过主题交换机可以让队列在绑定 routingkey 的时候使用通配符。这种模型 routingkey 一般都是由一个或者多个单词组成,多个单词之间以.分割,例如:item.insert

【RabbitMQ(day3)】扇形交换机和主题交换机的应用,RabbitMQ,rabbitmq,中间件,分布式

通配符
* (star) can substitute for exactly one word. 匹配一个单词
# (hash) can substitute for zero or more words. 匹配一个或多个单词

如:
audit.# 匹配audit.irs.corporate 或者 audit.irs 等
audit.* 只能匹配audit.irs

  1. 生产者
		 // 声明交换机以及交换机类型
        channel.exchangeDeclare("topics", "topic");
        // 发布消息
        String routeKey = "user.delete";
        channel.basicPublish("topics", routeKey, null, ("这里是topic动态路由模型,route key:" + routeKey).getBytes());
  1. 消费者
		// 生命交换机以及交换机类型
        channel.exchangeDeclare("topics", "topic");
        // 创建一个临时队列
        String queueName = channel.queueDeclare().getQueue();
        // 绑定队列和交换机 动态通配符形式 route key
        channel.queueBind(queueName, "topics", "use.*");	

案例结果

【RabbitMQ(day3)】扇形交换机和主题交换机的应用,RabbitMQ,rabbitmq,中间件,分布式文章来源地址https://www.toymoban.com/news/detail-621813.html

到了这里,关于【RabbitMQ(day3)】扇形交换机和主题交换机的应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RabbitMQ中交换机的应用 ,原理 ,案例的实现

                                    🎉🎉欢迎来到我的CSDN主页!🎉🎉                     🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚     🌟推荐给大家我的博客专栏《RabbitMQ中交换机的应用及原理,案例的实现》。🎯🎯                    

    2024年01月24日
    浏览(56)
  • RabbitMQ中交换机的应用及原理,案例的实现

    目录 一、介绍 1. 概述 2. 作用及优势 3. 工作原理 二、交换机Exchange 1. Direct 2. Topic 3. Fanout 三、代码案例 消费者代码   1. 直连direct  生产者代码 测试 2. 主题topic  生产者代码 测试 3. 扇形fanout  生产者代码 测试 每篇一获 RabbitMQ中的交换机(exchange)是消息的分发中心,它

    2024年01月24日
    浏览(37)
  • 利用消息中间件RabbitMQ创建队列以及扇出(Fanout)、订阅(Direct)、主题(Topic)交换机来完成消息的发送和监听接收(完整版)

    目录 一、前期项目环境准备 1.1父项目以及子项目 1.2配置pom.xml 1.3配置application.yml 二、扇出(Fanout) 交换机实现消息的发送和接收 2.1编写子项目consumer(消费者,接收消息)的代码实现扇出(Fanout)交换机接收消息 2.1.1consumer子项目结构 2.1.2FanoutConfig类的实现扇出(Fanout)交

    2024年02月05日
    浏览(61)
  • RabbitMQ 备份交换机和死信交换机

      为处理生产者将消息推送到交换机中,交换机按照消息中的路由键及自身策略无法将消息投递到指定队列中造成消息丢失的问题,可以使用备份交换机。   为处理在消息队列中到达TTL的过期消息,可采用死信交换机进行消息转存。可以通过死信交换机的方式实现延迟队

    2024年02月14日
    浏览(52)
  • RabbitMQ之Exchange(交换机)属性及备用交换机解读

    目录 基本介绍 主要结论 备用交换机  springboot代码实战(备用交换机) 实战架构 工程概述 RabbitConfigDeal 配置类:创建队列及交换机并进行绑定  MessageService业务类:发送消息及接收消息 主启动类RabbitMq01Application:实现ApplicationRunner接口 在 RabbitMQ 中,交换机主要用来将生产

    2024年02月02日
    浏览(51)
  • 【RabbitMQ】RabbitMQ的交换机

    在上文中, 都没有交换机,生产者直接发送消息到队列。 而一旦引入交换机,消息发送的模式会有很大变化:可以看到,在订阅模型中,多了一个exchange角色,而且过程略有变化: Publisher:生产者,不再发送消息到队列中,而是发给交换机 Exchange:交换机,一方面,接收生

    2024年03月12日
    浏览(56)
  • RabbitMQ交换机(1)

    RabbitMQ消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列 。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。 相反,生产者只能将消息发送到交换机(exchange), 交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将

    2024年01月17日
    浏览(44)
  • 02、RabbitMQ交换机

    目录 1.、Exchange(交换机)的作用  2、Exchange(交换机)的类型 2.1.直连交换机:Direct Exchange 2.2.主题交换机:Topic Exchange 2.3.扇形交换机:Fanout Exchange 2.4.首部交换机:Headers exchange 2.5.默认交换机 2.6.Dead Letter Exchange(死信交换机) 3、交换机的属性 4、综合案例:交换机的使用 给子模

    2024年02月04日
    浏览(59)
  • RabbitMQ交换机

    (1)接收publisher发送消息 (2)将消息按照规则路由到与之绑定的队列 (1)Fanout(广播) Fanout Exchange会将接受到的消息广播到每一个跟其绑定的queue,所以也叫广播模式 (2)Direct(定向) Direct Exchange会将接收到的消息根据规则路由到指定的Queue,因此称为定向路由 每一个

    2024年01月19日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包