zoukankan      html  css  js  c++  java
  • SpringCloudStream学习(四)TTL(存活时间)Dead Letter Exchanges(死信交换机)

    TTL(Time-To-Live and Expiration)

    RabbitMQ既能对队列设置TTL也能对消息设置TTL,消息TTL可以应用于单个队列、一组队列或应用于逐个消息。

    如何给消息设置TTL?

    rabbitmqctl rabbitmqctl set_policy TTL ".*" '{"message-ttl":60000}' --apply-to queues
    rabbitmqctl (Windows) rabbitmqctl set_policy TTL ".*" "{""message-ttl"":60000}" --apply-to queues

    或者

    byte[] messageBodyBytes = "Hello, world!".getBytes();
    AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
                                       .expiration("60000")
                                       .build();
    channel.basicPublish("my-exchange", "routing-key", properties, messageBodyBytes);
    

    如何给队列设置TTL?

    rabbitmqctl rabbitmqctl set_policy expiry ".*" '{"expires":1800000}' --apply-to queues
    rabbitmqctl (Windows) rabbitmqctl.bat set_policy expiry ".*" "{""expires"":1800000}" --apply-to queues

    或者:

    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-message-ttl", 60000);
    channel.queueDeclare("myqueue", false, false, false, args);
    

    死信队列:跟死信交换机绑定的队列

    死信交换机:

    当以下的任意情况发生的时候,意味着队列中的该消息变成了死信

    1. 消费者调用了basic.reject/basic.nack 并且设置requeuefalse(不重回队列)的时候,消息就会进入死信队列 。
    2. 消息有效期过期。
    3. 队列达到最大的长度,并且我们没有设置自动拒绝消息的时候,队首的消息就会进入死信队列 。

    死信交换机其实就是一个正常的交换机,我们可以像申明一个正常交换机一样申明它。

    怎么给队列申明死信交换机?

    rabbitmqctl rabbitmqctl set_policy DLX ".*" '{"dead-letter-exchange":"my-dlx"}' --apply-to queues
    rabbitmqctl (Windows) rabbitmqctl set_policy DLX ".*" "{""dead-letter-exchange"":""my-dlx""}" --apply-to queues

    或者:

    channel.exchangeDeclare("some.exchange.name", "direct");
    
    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-dead-letter-exchange", "some.exchange.name");
    channel.queueDeclare("myqueue", false, false, false, args);
    

    我们也可以给这个交换机申明routingKey:

    args.put("x-dead-letter-routing-key", "some-routing-key");
    

    利用TTL跟死信交换机我们可以实现消息的延时处理:

    大致思路如下:

    1. 声明一个延时处理的队列

      其实就是在申明队列的时候指定消息的存活时间,伪代码如下:

      map.put("x-message-ttl", delayTime);
      
    2. 在申明这个队列时,同时指定死信交换机跟RoutingKey

       map.put("x-dead-letter-exchange", "dead-exchange");
       map.put("x-dead-letter-routing-key", "dead");
       queueDeclare("delay-queue", true, false, false, map)
      
    3. 申明一个队列跟死信交换机绑定,作为死信队列

      queueDeclare("dead-queue", true, false, false, null)
      queueBind("dead-queue", "dead-exchange", "dead", null)
      
  • 相关阅读:
    C# Volatile
    C#索引器
    04Prism WPF 入门实战 Module
    No module named '_bz2'
    pandas day01
    实例讲解虚拟机3种网络模式(桥接、nat、Hostonly)
    asp.net 截屏 截取web页面
    c# winform 截图 网页
    delphi AddObject 用法
    DBGrid 更变数据内容显示
  • 原文地址:https://www.cnblogs.com/daimzh/p/12854465.html
Copyright © 2011-2022 走看看