zoukankan      html  css  js  c++  java
  • 【RabbitMQ 实战指南】一 过期时间TTL

    RabbitMQ 可以对消息和队列设置过期时间(TTL)

    1、设置消息的TTL

    目前有两种方式可以设置消息的TTL

    • 第一种方式是通过队列属性设置,队列中所有消息都有相同的过期时间
    • 第二种方式是对消息本身进行单独的设置,每条消息的TTL可以不同

    如果两种方法一起使用,则消息的TTL已较小的数值为准。

    1.1、通过设置队列属性来控制消息的TTL

    在声明队列的时候可以通过 x-message-ttl 属性来控制消息的TTL, 这个参数的单位是毫秒。如果不设置 TTL.则表示此消息不会过期 ;如果将 TTL 设置为 0,则表示除非此时可以直 接将消息投递到消费者,否则该消息会被立即丢弃。 

    可以参考以下测试代码, github地址:https://github.com/SevenParadise/php-examples/blob/master/mq/rabbitmq/ttl/msg_ttl_with_queue.php

    <?php 
    require __DIR__ . '/../../../vendor/autoload.php';
    
    use PhpAmqpLibWireAMQPTable;
    use PhpAmqpLibMessageAMQPMessage;
    use PhpAmqpLibConnectionAMQPStreamConnection;
    
    // todo 换成自己的配置
    $connection = new AMQPStreamConnection('192.168.33.1', 5672, 'zhangcs', 'zhangcs', '/');
    $channel = $connection->channel();
    
    // 通过队列属性设置消息过期时间为10s, 然后在管理页面查看10s之后消息是否消失
    $arguments = new AMQPTable();
    $arguments->set("x-message-ttl", 10000);
    
    $queueName = 'test_msg_ttl';
    $channel->queue_declare($queueName, false, true, false, false, false, $arguments);
    
    $message = new AMQPMessage('Hello RabbitMQ');
    $channel->basic_publish($message, '', $queueName);
    
    $channel->close();
    $connection->close();

    运行该代码之后可以在web管理后台中发现增加了 test_msg_ttl 队列,然后队列特性中会有 TTL标志,队列中会有一条消息。10 秒之后该消息会自动删除。

    1.2、通过设置消息的属性控制消息的TTL

    在创建消息的时候可以指定参数 expiration 来控制消息的TTL,单位是毫秒。

    可以参考以下测试代码,github地址:https://github.com/SevenParadise/php-examples/blob/master/mq/rabbitmq/ttl/msg_ttl.php

    <?php 
    require __DIR__ . '/../../../vendor/autoload.php';
    
    use PhpAmqpLibWireAMQPTable;
    use PhpAmqpLibMessageAMQPMessage;
    use PhpAmqpLibConnectionAMQPStreamConnection;
    
    // todo 换成自己的配置
    $connection = new AMQPStreamConnection('192.168.33.1', 5672, 'zhangcs', 'zhangcs', '/');
    $channel = $connection->channel();
    
    $queueName = 'test_msg_ttl1';
    $channel->queue_declare($queueName, false, true, false, false);
    
    // 通过消息属性设置消息过期时间为10s, 然后在管理页面查看10s之后消息是否消失
    $message = new AMQPMessage('Hello RabbitMQ', [
        'expiration' => 10000
    ]);
    $channel->basic_publish($message, '', $queueName);
    
    $channel->close();
    $connection->close();

    运行该代码之后可以在web管理后台中发现增加了 test_msg_ttl1 队列,每条消息的过期时间都不同。

    1.3、消息过期之后删除的时机

    对于第一种方式通过队列属性控制TTL的消息来说,一旦消息过期,则会立马删除,这是因为过期的消息肯定是在队头,删除代价很低。

    对于第二种方式来说,消息过期之后是不会立马删除的,因为每条消息的过期时间不同,如果要删除过期消息,那必须扫描整个队列,代价太高,所以消失是否过期是在消息消费的时候判断的。

    2、设置队列的TTL

    在声明队列的时候可以通过 x-expires 参数来控制队列被自动删除前处于未使用状态的时间。未使用的意思是队列上没有任何的消费者,队列也没有被重新声明,并 且在过期时间段 内也未调用过 Basic.Get 命令。 x-expires 参数以毫秒为单位。

    可以参考以下代码,github地址:https://github.com/SevenParadise/php-examples/blob/master/mq/rabbitmq/ttl/queue_ttl.php

    <?php 
    require __DIR__ . '/../../../vendor/autoload.php';
    
    use PhpAmqpLibWireAMQPTable;
    use PhpAmqpLibMessageAMQPMessage;
    use PhpAmqpLibConnectionAMQPStreamConnection;
    
    // todo 换成自己的配置
    $connection = new AMQPStreamConnection('192.168.33.1', 5672, 'zhangcs', 'zhangcs', '/');
    $channel = $connection->channel();
    
    // 通过队列属性设置队列的过期时间为10s, 然后在管理页面查看10s之后队列是否消失
    $arguments = new AMQPTable();
    $arguments->set("x-expires", 10000);
    
    $queueName = 'test_queue_ttl';
    $channel->queue_declare($queueName, false, true, false, false, false, $arguments);
    
    $channel->close();
    $connection->close();

    运行该代码之后可以在web管理后台中发现增加了 test_queue_ttl 队列,然后队列特性中会有 Exp 标志,10 秒之后该队列会被删除。

  • 相关阅读:
    c/c++设置图片为透明图
    转;说说AngularJS中的$parse和$eval
    转: css3: display:box详解
    转: 深入理解 AngularJS 的 Scope
    转:说说angularjs中的$parse和$eval
    转: 理解AngularJS中的依赖注入
    angularjs学习总结(快速预览版)
    XML基础知识
    读书笔记:js设计模式
    contains 和 ele.compareDocumentPosition确定html节点间的关系
  • 原文地址:https://www.cnblogs.com/Zhangcsc/p/11714932.html
Copyright © 2011-2022 走看看