美文网首页技术篇
RabbitMQ的TTL消息详解

RabbitMQ的TTL消息详解

作者: 若兮缘 | 来源:发表于2019-03-22 08:02 被阅读28次

    TTL说明

    • TTL是Time To Live的缩写,也就是生存时间
    • RabbitMQ支持消息的过期时间,在消息发送时可以进行指定
    • RabbitMQ支持为每个队列设置消息的超时时间,从消息入队列开始计算,只要超过了队列的超时时间配置,那么消息会自动的清除

    TTL演示

    这次演示我们不写代码,只通过管控台进行操作,实际测试也会更为方便一些。

    1.创建Exchange

    选择Exchange菜单,找到下面的Add a new exchange

    2.创建Queue

    选择Queue菜单,找到下面的Add a new queue

    3.建立队列和交换机的绑定关系

    点击Exchange表格中的test002_exchange,在下面添加绑定规则

    4.发送消息

    点击Exchange表格中的test002_exchange,在下面找到Publish message,设置消息进行发送

    5.验证

    点击Queue菜单,查看表格中test002已经有了一条消息,10秒后表格显示0条,说明过期时间到了消息被自动清除了。

    6.设置单条消息过期时间

    点击Exchange表格中的test002_exchange,在下面找到Publish message,设置消息的过期时间并进行发送,此时观察test002队列,发现消息5s后就过期被清除了,即使队列设置的过期时间是10s。

    TTL代码设置

    消息的过期时间设置
            AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
                    .expiration("10000") //10s过期
                    .build();
            //发送消息
            channel.basicPublish(exchange, routingKey, true, properties, msg.getBytes());
    
    队列的过期时间设置
            //设置队列的过期时间10s
            Map<String,Object> param = new HashMap<>();
            param.put("x-message-ttl", 10000);
            //声明队列
            channel.queueDeclare(queueName, true, false, false, null);
    
    注意事项
    1. 两者的区别是设置队列的过期时间是对该队列的所有消息生效的。
    2. 为消息设置TTL有一个问题:RabbitMQ只对处于队头的消息判断是否过期(即不会扫描队列),所以,很可能队列中已存在死消息,但是队列并不知情。这会影响队列统计数据的正确性,妨碍队列及时释放资源。

    相关文章

      网友评论

        本文标题:RabbitMQ的TTL消息详解

        本文链接:https://www.haomeiwen.com/subject/mcsfvqtx.html