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 PhpAmqpLib\Wire\AMQPTable;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Connection\AMQPStreamConnection; // 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 PhpAmqpLib\Wire\AMQPTable;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Connection\AMQPStreamConnection; // 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 PhpAmqpLib\Wire\AMQPTable;
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Connection\AMQPStreamConnection; // 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 秒之后该队列会被删除。

【RabbitMQ 实战指南】一 过期时间TTL的更多相关文章

  1. 【RabbitMQ 实战指南】一 延迟队列

    1.什么是延迟队列 延迟队列中存储延迟消息,延迟消息是指当消息被发送到队列中不会立即消费,而是等待一段时间后再消费该消息. 延迟队列很多应用场景,一个典型的应用场景是订单未支付超时取消,用户下单之后3 ...

  2. 【RabbitMQ 实战指南】一 RabbitMQ 开发

    1.RabbitMQ 安装 RabbitMQ 的安装可以参考官方文档:https://www.rabbitmq.com/download.html 2.管理页面 rabbitmq-management ...

  3. RabbitMQ 设置队列的过期时间

    设置队列的过期时间非常简单,在声明队列时,设置x-expires参数即可.当队列的生存周期超时后,RabbitMQ server会自动将该队列删除. 代码如下: channel.QueueDeclar ...

  4. .Net RabbitMQ实战指南——进阶(一)

    备份交换器 备份交换器,英文名称为Alternate Exchange,简称AE.通过在声明交换器(调用channel.ExchangeDeclare方法)时添加alternate-exchange参 ...

  5. 【RabbitMQ 实战指南】一 死信队列

    1.死信队列 DLX,全称为 Dead-Letter-Exchange,可以称之为死信交换器.当消息在一个队列中变成死信(dead message)之后,它能被发送到另一个交换器中,这个交换器就是DL ...

  6. .Net RabbitMQ实战指南——客户端开发

    开发中关键的Class和Interface有Channel.Connection.ConnectionFactory.Consumer等,与RabbitMQ相关的开发工作,基本上是围绕Connecti ...

  7. RabitMq过期时间TTL

    第一种:给消息设置过期时间 启动一个插件 @Bean public DirectExchange DirectExchange() { return new DirectExchange(" ...

  8. 【RabbitMQ 实战指南】一 RabbitMQ入门

    1.消息中间件 1.1.什么是消息中间件 消息中间件(Message Queue Middleware,简称 MQ)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通道来进行分布式系 ...

  9. .Net RabbitMQ实战指南——RabbitMQ相关概念介绍

    什么是消息中间件 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串.JSON等,也可以很复杂,比如内嵌对象. 消息队列中间件(Message Queue Middl ...

随机推荐

  1. jmeter 分布式压测

    1.配置主机名称 查看主机名 hostname 配置主机别名 vim /etc/hosts 2.分布式主机也需要配置主机别名 3.每个主机上必需有JAVA环境和jmeter环境 4.如果脚本有参数文件 ...

  2. Docker学习之docker常用命令

    docker ps -a 表示所有容器 docker pull 获取image docker build 创建image docker run 运行container docker images 列出 ...

  3. (转)在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境

    阿里云的云服务器(ECS)可以选择多种操作系统,打算用它运行 Drupal或者 WordPress ,你最好选择 Linux 系统,这篇文章的演示是基于阿里云的 CentOS 操作系统的服务器.我们在 ...

  4. 2018年蓝桥杯ava b组第一题

    第一题.标题:第几天 2000年的1月1日,是那一年的第1天.那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容 如果问我怎么做的,我就是看日历做的,看了 ...

  5. Hadoop点滴-HDFS文件系统

    1.HDFS中,目录作为元数据,保存在namenode中,而非datanode中 2.HDFS的文件权限模型与POSIX的权限模式非常相似,使用  r  w  x 3.HDFS的文件执行权限(X)可以 ...

  6. 03-body标签中的部分标签

    一.字体标签 标题标签h1-h6 h1定义最大的标题,h6定义最小的标题,一般一个页面中h1只能出现一次,尽量标题不要超过三级.h标签具有align属性,属性值分别是:left.center.righ ...

  7. Spring Boot 2.x基础教程:JSR-303实现请求参数校验

    请求参数的校验是很多新手开发非常容易犯错,或存在较多改进点的常见场景.比较常见的问题主要表现在以下几个方面: 仅依靠前端框架解决参数校验,缺失服务端的校验.这种情况常见于需要同时开发前后端的时候,虽然 ...

  8. B/S 端 WebGL 3D 游戏机教程

    前言 摘要:2D 的俄罗斯方块已经被人玩烂了,突发奇想就做了个 3D 的游戏机,用来玩俄罗斯方块...实现的基本想法是先在 2D 上实现俄罗斯方块小游戏,然后使用 3D 建模功能创建一个 3D 街机模 ...

  9. Java的一些基础知识深入

    1.浅析Java中的final关键字: 2.Java中的static关键字解析: 3.探秘Java中String.StringBuilder以及StringBuffer: 4.Java内部类详解: 5 ...

  10. C# WinForm 跨线程访问控件(实用简洁写法)

    C# WinForm 跨线程访问控件(实用简洁写法) 1.<C# WinForm 跨线程访问控件(实用简洁写法)>       2.<基于.NET环境,C#语言 实现 TCP NAT ...