zoukankan      html  css  js  c++  java
  • RabbitMQ交换机、死信队列、延迟队列

    安装配置参考:https://blog.csdn.net/qq_31634461/article/details/79377256

    概念学习参考:https://www.cnblogs.com/ityouknow/p/6120544.html


    RabbitMQ的hello world(基于Spring Boot)

    1.配置文件

    spring.application.name=rabbitMQ
    
    spring.rabbitmq.host=127.0.0.1
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=guest
    spring.rabbitmq.password=guest

    2.配置队列

    @Configuration
    public class RabbitMQConfig {
    
        @Bean
        public Queue queue() {
         //队列名称,后面生产者根据此队列名称发送消息,消费者也监听此名称
    return new Queue("hello"); } }

    3.生产者

    @Component
    public class RabbitMQSender {
    //AmqpTemplate接口,spring boot会去实现它
    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void send() {
    String info = "hello RabbitMQ!";
    System.out.println("send:" + info);
    //参数"hello"对应队列的名称
    rabbitTemplate.convertAndSend("hello", info);
    }
    }

    4.消费者

    @Component
    @RabbitListener(queues="hello") //监听队列"hello"
    public class RabbitMQReceiver {
        
       //调用队列的信息,参数hello既是消费的信息; @RabbitHandler
    public void receive(String hello) { System.out.println("receive:" + hello); } }

    5.test

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class RabbitMqApplicationTests {
    
        @Autowired
        private RabbitMQSender rabbitMQSender;
    
        @Test
        public void contextLoads2() {
            rabbitMQSender.send();
        }
    }

    结果:

    send:hello RabbitMQ!
    receive:hello RabbitMQ!

    RabbitMQ的四种交换机

    交换机的作用是接收消息,并转发到绑定的队列,四种类型:Direct, Topic, Headers and Fanout

    Direct

    Direct类型的Exchange交换机,在生产者发送消息时,会去严格匹配生产者所绑定的队列queue名称

    Topic(最为灵活)

    给队列绑定routing_key(路由key),发送消息时,就根据发送消息传回的参数去匹配这个routing_key,然后根据匹配情况把消息分配到对应的消息队列中;

    举个例子:

    与交换机绑定的queue是 #.abc,生产者发消息当routing_key设置为 any.abc时(这里any可以为任何值),那么这个最终生产者所发的消息都会发送给绑定到 #.abc的队列中去

    Headers

    生产者发出消息时,无论routing_key设置成什么,这个消息都是根据生产者与队列的headers参数比对结果来判断是否发送消息。

    比对的方式,通过在绑定队列时设置头,有两种设置方式:

    x-match:all  --------------> 表示要头全部匹配上才发送到队列中

    x-match:any  --------------> 表示要头只要有一个匹配上就发送到队列中

    Fanout

    生产者发出消息时,无论routing_key设置成什么,这个消息都会被等量复制发送给所有绑定到Fanout类型Exchange的队列queue中去


     RabbitMQ死信队列

    死信定义

    dead-letter,死信,以下几种情况会发生死信并让死信进入死信队列:

    1.消费方调用channel.basicNack或者channel.basicReject时,并且requeue参数设置为false

    2.消息在队列中存在时间超过TTL(time-to-live)

    3.消息超过了队列允许的最大长度;

    死信队列需要在配置队列queue时,设置死信队列信息

    如何处理死信

    1.配置死信队列交换机,死信队列queue,死信队列其实和普通的队列本质上一样,只是可以专门来处理死信而已;

    2.为正常队列设置死信队列信息,需要用map设置以下参数:

    x-dead-letter-exchange:死信队列交换机

    x-dead-letter-routing-key:死信队列routing-key,注意:如果配置了这个参数,那么死信进来之后其routing-key也会替换成这个参数,否则就保留其本身的routing-key


     RabbitMQ延迟队列

    延迟队列是什么

      延迟队列指的是,队列需要在指定时间之后才被消费。

      在特有的场景下可以使用延迟队列,例如一些定时通知的业务,可以通过延迟队列实现。

    TTL实现延迟队列

      首先, TTL 是什么。TTL是英文 time to live 的缩写,就是最大存活时间。在上一节有说到消息队列在队列中存活超过TTL设置的时间之后,会进入死信队列。而延迟队列则正是通过给队列设置TTL过期时间,然后在这个时间过期之后,这个消息成为死信并进入到 死信队列 中。这样就实现了死信队列。

      但是,TTL实现延迟队列有以下几个问题:

      1.在队列上配置TTL,有不可扩展性,每有一个业务需要不同的TTL就需要一个新的队列来配置,这样不合理。于是,可以在消息本身设置TTL。

      2.队列有先入先出的特性,在第一条消息被处理成死信之前,第二条消息无法被处理。例如,队列A先进来,设置了TTL 10秒,随后立刻让队列B进来,设置了TTL 1秒。这个时候会发生这种情况,A队列在被处理成死信之前(需要10秒时间),B队列设置TTL是1秒,理论上来说B队列在1秒之后会被处理成死信,但是,实际上RabbitMQ在处理的时候会先处理A,后面的队列依次等待。于是呢,需要RabbitMQ的延迟队列插件来实现,具体可以看下面的链接和方法。

    插件实现延迟队列

      首先,在官网下载插件: rabbitmq_delayed_message_exchange ,https://www.rabbitmq.com/community-plugins.html,然后放到其插件目录中再重启即可。

      安装成功之后,就可以像上面第2条所说的那样,后入队的B队列1秒之后就被处理成了死信,先入队的A队列在10秒之后被处理成死信,就不存在处理顺序的问题了。


     

  • 相关阅读:
    Python 基础之函数初识与函数参数
    python 基础之浅拷贝与深拷贝
    Python 基础之集合相关操作与函数和字典相关函数
    Python 基础之字符串操作,函数及格式化format
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
  • 原文地址:https://www.cnblogs.com/lcmlyj/p/10408129.html
Copyright © 2011-2022 走看看