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 秒之后该队列会被删除。

  • 相关阅读:
    素数路径Prime Path POJ3126 素数,BFS
    Fliptile POJ3279 DFS
    Find the Multiple POJ1426
    洗牌Shuffle'm Up POJ3087 模拟
    棋盘问题 POJ1321 DFS
    抓住那只牛!Catch That Cow POJ3278 BFS
    Dungeon Master POJ2251 三维BFS
    Splitting into digits CodeForce#1104A
    Ubuntu下手动安装Nvidia显卡驱动
    最大连续子序列和
  • 原文地址:https://www.cnblogs.com/Zhangcsc/p/11714932.html
Copyright © 2011-2022 走看看