消息队列RabbitMQ.02.交换机的讲解与使用

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

目录

RabbitMQ中交换机的基本概念与作用解析

交换机的作用:

交换机的类型:

直连交换机(Direct Exchange): 将消息路由到与消息中的路由键(Routing Key)完全匹配的队列。

主题交换机(Topic Exchange): 使用通配符匹配路由键,允许更灵活的消息路由。

扇形交换机(Fanout Exchange): 将消息广播到与交换机绑定的所有队列,无视消息的路由键。

头部交换机(Headers Exchange): 使用消息头信息进行匹配,而不是路由键。

死信交换机(Dead Letter Exchange)是在消息队列系统中一种用于处理死信(Dead Letter Messages)的机制。死信通常是指由于某些原因而无法被成功处理的消息,这些原因可能包括消息过期、消息被拒绝、队列满等。

 个人总结:


消息队列RabbitMQ.02.交换机的讲解与使用,rabbitmq,java-rabbitmq

RabbitMQ中交换机的基本概念与作用解析


交换机的作用:

  • 消息分发: 交换机接收发布者发送的消息,并负责将消息路由到一个或多个队列。
  • 路由规则定义: 通过交换机可以定义消息的路由规则,以确保消息被正确地发送到目标队列。

交换机的类型:

  • 直连交换机(Direct Exchange): 将消息路由到与消息中的路由键(Routing Key)完全匹配的队列。

直连交换机只能通过queue发送一个请求,如果需要发送多个请求那么就要进行多个配置

//--------直连交换机
    @Bean
    public Queue queue1() {
        return new Queue("queue1");
    }

    @Bean
    public Queue queue2() {
        return new Queue("queue2");
    }

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

    @Bean
    public Binding binding01(){
        return BindingBuilder
                .bind(queue1())
                .to(directExchange())
                .with("aa");
    }
    @Bean
    public Binding binding02(){
        return BindingBuilder
                .bind(queue2())
                .to(directExchange())
                .with("bb");
    }

 消费者接受信息

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "queue1")
public class ReceiverQ1 {

    @RabbitHandler
    public void process(String msg) {
        log.warn("q1接收到:" + msg);
    }
}

测试

@RestController
public class TestController {

    @Autowired
    private AmqpTemplate template;
    @Autowired
    private ObjectMapper objectMapper;

   
    @RequestMapping("/send3")
    public String send3(){
        template.convertAndSend("directExchange","aa","hello");
        return "🤣";
    }


}

 


  • 主题交换机(Topic Exchange): 使用通配符匹配路由键,允许更灵活的消息路由。
  1. 通配符的含义:

    • 星号(*): 匹配一个单词,可以出现在路由键的任意位置。例如,"animal.*"匹配"animal.rabbit"和"animal.cat"等。
    • 井号(#): 匹配零个或多个单词,只能出现在路由键的末尾。例如,"animal.#"匹配"animal.rabbit"、"animal.cat"和"animal.mammal.large"等。

主题交换机可以通过配置多个路由键来实现不同的键进入不同的消费者,如:交换机a,交换机b,

现在有一个包含a和b的键那么两个都能进入不同的消费者功能更加强大,并且可以配置通配符,根据通配符 * #  来实现进入不同的消费者

//--------------主题交换机
    // *.*.aa -> Q1
    // *.*.bb -> Q2
    // mq.# -> Q1,Q2
    // 一个队列可以用多个绑定键

    @Bean
    public TopicExchange topicExchange(){
        return  new TopicExchange("topicExchange");
    }

    @Bean
    public Binding binding03(){
        return BindingBuilder
                .bind(queue1())
                .to(topicExchange())
                .with("*.*.aa");
    }

    @Bean
    public Binding binding04(){
        return BindingBuilder
                .bind(queue2())
                .to(topicExchange())
                .with("*.*.bb");
    }

    @Bean
    public Binding binding05(){
        return BindingBuilder
                .bind(queue1())
                .to(topicExchange())
                .with("mq.#");
    }

    @Bean
    public Binding binding06(){
        return BindingBuilder
                .bind(queue2())
                .to(topicExchange())
                .with("mq.#");
    }

测试


@RestController
public class TestController {

    @Autowired
    private AmqpTemplate template;
    @Autowired
    private ObjectMapper objectMapper;

   
     @RequestMapping("/send4")
    public String send4(String rex){
        template.convertAndSend("topicExchange",rex,"hello");
        return "🤣";
    }



}

 


  • 扇形交换机(Fanout Exchange): 将消息广播到与交换机绑定的所有队列,无视消息的路由键。

扇形交换机可以统一发送请求,列入可以运用到,商城活动时统一给用户发送商城活动信息

//--------------扇形交换机
    // 广播,群发
    //它上面的队列不需要binding key

    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("fanoutExchange");
    }
    @Bean
    public Binding binding07(){
        return BindingBuilder
                .bind(queue1())
                .to(fanoutExchange());
    }
    @Bean
    public Binding binding08(){
        return BindingBuilder
                .bind(queue2())
                .to(fanoutExchange());
    }

测试代码

 @RequestMapping("/send5")
    public String send5(){
        template.convertAndSend("fanoutExchange","","hello");
        return "🤣";
    }

 上述效果图:

消息队列RabbitMQ.02.交换机的讲解与使用,rabbitmq,java-rabbitmq


 

  • 头部交换机(Headers Exchange): 使用消息头信息进行匹配,而不是路由键。

头部交换机(Headers Exchange)是RabbitMQ中的一种交换机类型,与其他类型的交换机(直连交换机、主题交换机、扇出交换机)不同,头部交换机使用消息的头信息(Headers)而不是路由键来进行消息的路由。头部交换机提供更灵活的路由方式,允许根据消息头的键值对进行匹配。

 以下是头部交换机的一些关键特性和使用方式:

  1. 消息头信息:

    • 键值对: 消息头是由一系列键值对组成的,用于描述消息的属性。
    • 自定义属性: 消息头可以包含自定义的属性,根据应用程序的需要定义不同的属性信息。
  2. 匹配规则:

    • 匹配方式: 消息通过匹配消息头的键值对来确定路由目标。
    • 多条件匹配: 可以定义多个键值对,消息需要满足所有条件才能被正确路由。
  3. 绑定关系:

    • 绑定头信息: 在绑定队列到头部交换机时,可以指定一个或多个键值对作为匹配条件。
    • 匹配算法: 消息头需要匹配绑定队列时指定的键值对条件,才能被路由到相应的队列。
  4. 使用场景:

    • 复杂路由逻辑: 当消息的路由逻辑需要根据多个条件进行判断时,头部交换机提供了更灵活的解决方案。
    • 自定义属性: 当消息携带有多个自定义属性,需要根据这些属性进行复杂匹配时,头部交换机是一个合适的选择。
  5. 示例:

    • 如果有一个消息头包含"content-type"为"application/json",并且"priority"为"high",一个队列可以通过绑定这两个条件到头部交换机来接收符合这两个条件的消息。
    • 另一个队列可以通过绑定"content-type"为"application/xml"的条件来接收不同类型的消息。

头部交换机适用于需要根据消息的多个属性进行复杂匹配的场景,提供了更高度定制化的消息路由能力。


  • 死信交换机(Dead Letter Exchange)是在消息队列系统中一种用于处理死信(Dead Letter Messages)的机制。死信通常是指由于某些原因而无法被成功处理的消息,这些原因可能包括消息过期、消息被拒绝、队列满等。

以下是关于死信交换机的基本概念和作用:

  1. 死信的产生原因:

    • 消息过期: 消息在队列中等待的时间超过了指定的过期时间。
    • 消息被拒绝: 消费者拒绝消费消息,并且消息被标记为不可重新投递。
    • 队列满: 队列达到最大容量,无法再接收新的消息。
  2. 死信交换机的作用:

    • 死信路由: 当消息被标记为死信时,它会被发送到死信交换机。
    • 重新处理或记录: 可以通过死信交换机重新将消息发送到其他队列,进行额外处理,或者记录日志以分析死信的原因。
  3. 死信交换机的配置:

    • 绑定关系: 死信交换机与原始交换机或队列建立绑定关系。
    • 死信队列: 定义一个死信队列,接收由死信交换机路由的死信。
    • 死信交换机类型: 死信交换机可以是不同类型的交换机,根据具体需求选择合适的类型。
  4. 应用场景:

    • 错误处理: 处理由于消息格式错误等原因导致的死信。
    • 重试机制: 将死信重新发送到其他队列进行重试。
    • 日志记录: 记录死信信息以便进行故障排除和分析。

使用死信交换机可以提高消息系统的健壮性和可靠性,确保无法正常处理的消息得到妥善处理,避免消息的丢失或无法追踪。配置死信交换机需要根据具体消息队列系统的实现进行设置,例如在RabbitMQ中,可以通过设置交换机和队列的参数来实现死信机制。

消息队列RabbitMQ.02.交换机的讲解与使用,rabbitmq,java-rabbitmq 


 个人总结:

1.直连交换机只能通过queue发送一个请求,如果需要发送多个请求那么就要进行多个配置;

2.主题交换机可以通过配置多个路由键来实现不同的键进入不同的消费者,如:交换机a,交换机b,现在有一个包含a和b的键那么两个都能进入不同的消费者功能更加强大,并且可以配置通配符,根据通配符 * #  来实现进入不同的消费者;

3. * 星号代表匹配一个单词,# 井号代表匹配一个或多个单词;

4.扇形交换机可以统一发送请求,列入可以运用到,商城活动时统一给用户发送商城活动信息;文章来源地址https://www.toymoban.com/news/detail-821218.html

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

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

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

相关文章

  • RabbitMQ学习笔记(消息发布确认,死信队列,集群,交换机,持久化,生产者、消费者)

    MQ(message queue):本质上是个队列,遵循FIFO原则,队列中存放的是message,是一种跨进程的通信机制,用于上下游传递消息。MQ提供“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后消息发送上游只需要依赖MQ,不需要依赖其它服务。 功能1:流量消峰 功能2:应用解耦 功

    2024年02月07日
    浏览(34)
  • RabbitMQ队列及交换机的使用

    目录 一、简单模型 1、首先控制台创建一个队列 2、父工程导入依赖  3、生产者配置文件  4、写测试类 5、消费者配置文件 6、消费者接收消息 二、WorkQueues模型 1、在控制台创建一个新的队列 2、生产者生产消息 3、创建两个消费者接收消息 4、能者多劳充分利用每一个消费者

    2024年02月04日
    浏览(34)
  • 【学习日记2023.6.19】 之 RabbitMQ服务异步通信_消息可靠性_死信交换机_惰性队列_MQ集群

    消息队列在使用过程中,面临着很多实际问题需要思考: 消息从发送,到消费者接收,会经历多个过程: 其中的每一步都可能导致消息丢失,常见的丢失原因包括: 发送时丢失: 生产者发送的消息未送达exchange 消息到达exchange后未到达queue MQ宕机,queue将消息丢失 consumer接收

    2024年02月11日
    浏览(35)
  • 消息队列-RabbitMQ:Exchanges、绑定 bindings以及3大常用交换机(Fanout exchange、Direct exchange、Topics exchange)

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

    2024年04月08日
    浏览(41)
  • 利用消息中间件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日
    浏览(37)
  • 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 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列 。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。 相反, 生产者只能将消息发送到交换机(exchange) ,交换机工作的内容非常简单, 一方面它接收来自生产者的消息,另一方面

    2024年01月24日
    浏览(27)
  • RabbitMq创建交换机和队列

    1. 网页登录 IP:1572   2. 输入登录账号密码 admin admin 3. 点击Exchanges 添加交换机Platform_AlarmEngineInterface 和Rg_Platform_AlarmEngineInterface ,Type选择topic 4. 添加队列 VIDEO_Alarm_platform 、 watch_ftp、 RG_VIDEO_Alarm_platform 、 RG_VIDEO_Alarm_platform_jiance 5. 绑定交换机和队列 (1) 点击Exchanges界面,选择其

    2024年02月16日
    浏览(37)
  • RabbitMQ-死信交换机和死信队列

    DLX: Dead-Letter-Exchange 死信交换器,死信邮箱 当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。 如下图所示: 其实死信队列就是一个普通的交换机,有些队列的消息成为死信后,(比如过期了或者队列满了)这些死信一般情况下是会被 RabbitMQ 清理

    2024年02月08日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包