rabbitmq专栏
代码地址: 码云
TTL设置主要有2种方式:
-
指定一条消息的过期时间。
-
给队列设置消息过期时间,队列中的所有消息都有同样的过期时间。
最佳实践:
采用队列TTL,统一设置消息TTL;
说明:
如果同时指定了Message TTL和Queue TTL,则优先较小的那一个。
1. 给消息设置过期时间
应用场景:
用户购买一个商品,30分钟如果未支付,则订单自动删除;
1.1 RabbitMQConfig配置
/**
* TTL_direct交换机名称
*/
public static final String TTL_DIRECT_EXCHANGE="ttldirectExchange";
/**
* ttl_direct路由Key
*/
public static final String TTL_DIRECT_ROUTINGKEY="ttl_directRoutingKey";
/**
* ttl_direct队列名称
*/
public static final String TTL_DIRECT_QUEUE="ttldirectQueue";
/**
* 定义一个TTL direct交换机
* @return
*/
@Bean
public DirectExchange ttlDirectExchange(){
return new DirectExchange(TTL_DIRECT_EXCHANGE);
}
/**
* 定义一个TTL direct队列
* @return
*/
@Bean
public Queue ttlDirectQueue(){
return new Queue(TTL_DIRECT_QUEUE);
}
/**
* TTL定义一个队列和交换机的绑定
* @return
*/
@Bean
public Binding ttlDirectBinding(){
return BindingBuilder.bind(ttlDirectQueue()).to(ttlDirectExchange()).with(TTL_DIRECT_ROUTINGKEY);
}
1.2 producer
1.3 测试
启动消息生产者服务,
15秒后,消息消失了:
2. 给队列设置消息过期时间
用队列TTL, 统一设置消息TTL;
2.1 注意点
TTL的延时队列存在一个问题,就是同一个队列里的消息延时时间最好一致,比如说队列里的延时时间都是1小时,千万不能队列里的消息延时时间乱七八糟多久的都有,这样的话先入队的消息如果延时时间过长会堵着后入队延时时间小的消息,导致后面的消息到时也无法变成死信转发出去,很坑!!!
举个栗子:延时队列里先后进入A,B,C三条消息,存活时间是3h,2h,1h,结果到了1小时C不会死,到了2hB不会死,到了3小时A死了,同时B,C也死了,意味着3h后A,B,C才能消费,很坑!!!
2.2 队列参数含义
1、name: 队列的名称;
2、actualName: 队列的真实名称,默认用name参数,如果name为空,则根据规则生成一个;
3、durable: 是否持久化;
4、exclusive: 是否独享、排外的;
5、autoDelete: 是否自动删除;
6、arguments:队列的其他属性参数,有如下可选项,可参看图2的arguments:
(1)x-message-ttl:消息的过期时间,单位:毫秒;
(2)x-expires:队列过期时间,队列在多长时间未被访问将被删除,单位:毫秒;
(3)x-max-length:队列最大长度,超过该最大值,则将从队列头部开始删除消息;
(4)x-max-length-bytes:队列消息内容占用最大空间,受限于内存大小,超过该阈值则从队列头部开始删除消息;
(5)x-overflow:设置队列溢出行为。这决定了当达到队列的最大长度时消息会发生什么。有效值是drop-head、reject-publish或reject-publish-dlx。仲裁队列类型仅支持drop-head;
(6)x-dead-letter-exchange:死信交换器名称,过期或被删除(因队列长度超长或因空间超出阈值)的消息可指定发送到该交换器中;
(7)x-dead-letter-routing-key:死信消息路由键,在消息发送到死信交换器时会使用该路由键,如果不设置,则使用消息的原来的路由键值
(8)x-single-active-consumer:表示队列是否是单一活动消费者,true时,注册的消费组内只有一个消费者消费消息,其他被忽略,false时消息循环分发给所有消费者(默认false)
(9)x-max-priority:队列要支持的最大优先级数;如果未设置,队列将不支持消息优先级;
(10)x-queue-mode(Lazy mode):将队列设置为延迟模式,在磁盘上保留尽可能多的消息,以减少RAM的使用;如果未设置,队列将保留内存缓存以尽可能快地传递消息;
(11)x-queue-master-locator:在集群模式下设置镜像队列的主节点信息。