RabbitMQ之交换机

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

目录

前言

一.关于交换机

1.交换机工作原理

2.交换机类型及路由规则

二.交换机实战讲解

1.直连交换机

2.主题交换机

3.扇形交换机

总结


前言

RabbitMQ 中的交换机(Exchange)是消息的分发中心,负责将消息发送到一个或多个队列。它接收生产者发送的消息并将这些消息路由到消息队列中

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

一.关于交换机

1.交换机工作原理

在RabbitMQ中生产者发送消息不会直接将消息投递到队列中,而是先将消息投递到交换机中,在由交换机转发到具体的队列,队列再将消息以推送或者拉取的方式给消费者

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

在交换机接收到生产者发送的消息时,交换机会根据消息的路由键和交换机类型,决定将消息路由到哪个队列,而不同类型的交换机也有不同的路由规则

2.交换机类型及路由规则

1.Direct Exchange(直接交换机):

路由规则:消息的路由键与队列绑定时指定的路由键完全匹配。

行为:消息将被路由到与其路由键完全匹配的队列。

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

2.Topic Exchange(主题交换机):

路由规则:使用通配符进行模糊匹配。

通配符:

* 匹配一个单词。

# 匹配零个或多个单词。

行为:消息将被路由到与路由键匹配的队列。

对比直连交换机

我们知道,直连交换机的路由方案非常简单,但是当我们在希望将一条消息发送给多个队列时,那么这个交换机就需要绑定非常多的路由规则(routing_key),交换机绑定的路由规则(routing_key)越多,管理就越复杂,相对于直连交换机,主题交换机可以通过通配符进行模糊匹配多条消息进行筛选进入队列

拓展:当一个队列的绑定键是"#",它将会接收所有的消息,而不再考虑所接收消息的路由键,当一个队列的绑定键没有用到"#"和"*"时,它又像direct交换一样工作

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器 

3.Fanout Exchange(扇出交换机):

路由规则:路由键被忽略。

行为:消息将广播到所有与交换机绑定的队列。

4.Headers Exchange(头部交换机):

路由规则:使用消息的头部信息进行匹配。

行为:消息头部信息与队列绑定规则匹配时,消息将被路由到相应队列。

5.Dead Letter Exchange(死信交换机 ):

RabbitMQ作为一个高级消息中间件,提出了死信交换器的概念这种交换器专门处理死了的信息(被拒绝可以重新投递的信息不能算死的)。消息变成死信一般是以下三种情况:
消息被拒绝,并且设置requeue 参数为 false
消息过期(默认情况下 Rabbit 中的消息不过期,但是可以设置队列的过期时间和消息的过期时间以达到消息过期的效果)队列达到最大长度(一般当设置了最大队列长度或大小并达到最大值时)当满足上面三种情况时,消息会变成死信消息,并通过死信交换机投递到相应的队列中我们只需要监听相应队列,就可以对死信消息进行最后的处理。

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

二.交换机实战讲解

1.直连交换机

先在RabbitMQ配置类中创建一个直连交换机和两个队列做测试用

package com.yu.publisher;

import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@SuppressWarnings("all")
public class RabbitConfig {
    @Bean
    public Queue queue1() {
        return new Queue("queue1");
    }
    @Bean
    public Queue queue2() {
        return new Queue("queue2");
    }

    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange("directExchange");
    }

}

将队列与交换机进行绑定并配置路由键(BindingKey)

@Bean
public Binding binding1(){
        return BindingBuilder.bind(queue1()).to(directExchange()).with("K1");
 }
@Bean
public Binding binding2(){
        return BindingBuilder.bind(queue2()).to(directExchange()).with("K2");
}           

在控制层做测试通过交换机及路由键做信息发送

@RequestMapping("send3")
public String send3(){
    //向消息队列发送消息
    amqpTemplate.convertAndSend("directExchange","Q1","Hello");
    return "🚀";
}

 编写消费者进行接收信息,消费者通过接收消息队列queue1

 package com.yu.consumer;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue1")
public class ReceiverQ1 {
@RabbitHandler
public void process(String msg) {
log.warn("Q1接收到:" + msg);
}
}

在这个同时我们可以编写多个消费者,进行测试

 package com.yu.consumer;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

 @Component
 @SuppressWarnings("all")
 @Slf4j
 @RabbitListener(queues = "queue2")
 public class ReceiverQ2 {
 @RabbitHandler
 public void process(String msg) {
 log.warn("Q2接收到:" + msg);
 }
 }

这时我们访问send3向交换机发送消息并由消费者接收

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

因为我们所绑定的键为K1所以会进入到对应的queue1队列并由消费者Q1接收

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

 当我们键绑定键改为K2,这时就会进入到对应的queue2队列并由消费者Q2接收

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

同时我们还可以在RabbitMQ控制界面看到我们刚刚创建的交换机

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器 

2.主题交换机

创建主题交换机并与队列、规则进行绑定

/***
     * 主题交换机
     */
    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("topicExchange");
    }
    @Bean
    public Binding bnding3(){
        return BindingBuilder.bind(queue1()).to(topicExchange()).with("*.*.aa");
    }
    @Bean
    public Binding bnding4(){
        return BindingBuilder.bind(queue2()).to(topicExchange()).with("*.*.bb");
    }
    @Bean
    public Binding bnding5(){
        return BindingBuilder.bind(queue1()).to(topicExchange()).with("mq.#");
    }
    @Bean
    public Binding bnding6(){
        return BindingBuilder.bind(queue2()).to(topicExchange()).with("mq.#");
    }

 将规则以参数的形式传递到发送消息的方法中

@RequestMapping("send4")
    public String send4(String rex){
        //向消息队列发送消息
        amqpTemplate.convertAndSend("topExchange",rex,"Hello");
        return "🚀";
    }

输入规则进行访问

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

输出结果

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

同时制定了可以同时访问到的规则

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

 注意点:制定规则时不能使用数字

3.扇形交换机

 相对于主题交换机而言,扇形交换机更多用于群发,所以可以直接绑定不需要用到规则

/**
     * 扇形交换机
     *
     */
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("fanoutExchange");
    }
    @Bean
    public Binding bnding7(){
        return BindingBuilder.bind(queue1()).to(fanoutExchange());
    }
    @Bean
    public Binding bnding8(){
        return BindingBuilder.bind(queue2()).to(fanoutExchange());
    }

编写测试发送方法

@RequestMapping("send5")
    public String send5(){
        //向消息队列发送消息
        amqpTemplate.convertAndSend("fanoutExchange",null,"Hello");
        return "🚀";
    }

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

当我们进行访问send5时可以直接群发消息接收

RabbitMQ之交换机,rabbitmq,网络,分布式,docker,容器

总结

交换机是消息队列系统中的重要组件,通过合理配置交换机和队列的绑定关系,可以实现灵活、可靠的消息路由和分发,适应不同应用场景的需求 ,根据不同的实际应用场景使用不同的交换机,能够更好得帮助我们的程序提升效率文章来源地址https://www.toymoban.com/news/detail-824965.html

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

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

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

相关文章

  • RabbitMQ交换机类型

    先附加下官网文档。RabbitMQ的交换机类型共有四种,是根据其路由过程的不同而划分成的: 直连型交换机背后的路由算法很简单——消息会传送给绑定键与消息的路由键完全匹配的那个队列。 我们用直连交换机取代了只会无脑广播的扇形交换机,并且具备了选择性接收消息的

    2024年02月06日
    浏览(36)
  • RabbitMQ交换机

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

    2024年01月19日
    浏览(39)
  • RabbitMQ之交换机

    目录 前言 一.关于交换机 1.交换机工作原理 2.交换机类型及路由规则 二.交换机实战讲解 1.直连交换机 2.主题交换机 3.扇形交换机 总结 RabbitMQ 中的交换机(Exchange)是消息的分发中心,负责将消息发送到一个或多个队列。它接收生产者发送的消息并将这些消息路由到消息队列

    2024年01月25日
    浏览(39)
  • 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日
    浏览(48)
  • RabbitMQ-交换机类型

    RabbitMQ的交换机类型总共有四种 1-直连交换机(Direct exchange) 消息发送到此交换机上时,交换机会将此消息发送到RoutingKey和消息中RoutingKey完全匹配的的队列(如果匹配了多个队列,则每个队列都会收到相同的消息)。 2-扇形交换机(Fanout exchange) 这个交换机机,会将收到的

    2023年04月08日
    浏览(32)
  • [RabbitMQ] RabbitMQ简单概述,用法和交换机模型

    MQ概述: Message Queue(消息队列),实在消息的传输过程中保存消息的容器,都用于分布式系统之间进行通信 分布式系统通信的两种方式:直接远程调用 和 借助第三昂 完成间接通信 发送方称谓生产者,接收方称为消费者 MQ优势和劣势 优势: 应用解耦:如 把一个系统的不同功

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

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

    2024年02月02日
    浏览(40)
  • 2.rabbitMQ之交换机

    1.交换机的作用 1.默认交换机会自动指定队列 2.之前一个信息必须被消费1次,现在的是一个消息可以被消费多次(发送到不同队列的前提下,正常情况下一个队列只能消费一次) 3.消息先发给交换机,然后交换机发给多个队列,可以达到多次消费的效果 如图mq3 2.交换机的类型 默认交

    2024年02月02日
    浏览(23)
  • RabbitMQ交换机与队列

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

    2024年01月24日
    浏览(27)
  • RabbitMq交换机类型介绍

    在RabbitMq中,生产者的消息都是通过交换器来接收,然后再从交换器分发到不同的队列,再由消费者从队列获取消息。这种模式也被成为“发布/订阅”。 分发的过程中交换器类型会影响分发的逻辑。 直连交换机:Direct exchange 扇形交换机:Fanout exchange 主题交换机:Topic excha

    2024年02月12日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包