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秒之后被处理成死信,就不存在处理顺序的问题了。


     

  • 相关阅读:
    数据结构-树与二叉树-思维导图
    The last packet successfully received from the server was 2,272 milliseconds ago. The last packet sent successfully to the server was 2,258 milliseconds ago.
    idea连接mysql报错Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property
    redis学习笔记
    AJAX校验注册用户名是否存在
    AJAX学习笔记
    JSON学习笔记
    JQuery基础知识学习笔记
    Filter、Listener学习笔记
    三层架构学习笔记
  • 原文地址:https://www.cnblogs.com/lcmlyj/p/10408129.html
Copyright © 2011-2022 走看看