1.Message TTL
message在队列queue中可以存活多长时间,以毫秒为单位;发布的消息在queue时间超过了你设定的时间就会被删除掉。
channel.queueDeclare("test", true, false, false, new HashMap<String, Object>());
2.Auto expire
auto expire 设置当前的queue在指定的时间内,没有consumer、basic.get也就是未被访问,就会被删除。
3.MaxLength与MaxLength bytes
Max Length(x-max-length): 限定队列的消息的最大值长度,超过指定长度将会把最早的几条删除掉, 类似于mongodb中的固定集合,例如保存最新的100条消息, Feature=Lim
Max Length Bytes(x-max-length-bytes): 限定队列最大占用的空间大小, 一般受限于内存、磁盘的大小, Features=Lim B
Dead letter exchange(x-dead-letter-exchange): 当队列消息长度大于最大长度、或者过期的等,将从队列中删除的消息推送到指定的交换机中去而不是丢弃掉,Features=DLX
4.dead letter exchange与dead letter routingkey
就像上面的messagettl,maxlength等。消息因为超时或超过限制在队列里消失,这样我们就丢失了一些消息,也许里面就有一些是我们做需要获知的。而rabbitmq的死信功能则为我们带来了解决方案。设置了dead letter exchange与dead letter routingkey(要么都设定,要么都不设定)那些因为超时或超出限制而被删除的消息会被推动到我们设置的exchange中,再根据routingkey推到queue中
Dead letter exchange(x-dead-letter-exchange): 当队列消息长度大于最大长度、或者过期的等,将从队列中删除的消息推送到指定的交换机中去而不是丢弃掉,Features=DLX
Dead letter routing key(x-dead-letter-routing-key):将删除的消息推送到指定交换机的指定路由键的队列中去, Feature=DLK
5.Lazy Queue
lazy queue是在3.6.0版本被引入的,lazy queue的信息尽可能的都保存在磁盘上,仅在消费者请求的时候才会加载到RAM中。
使用默认的queue,并且消息不持久化的话,都是放在RAM中的。当消息峰值的时候,大量的消息在RAM导致rabbitmq服务器压力过大,当RAM使用量到一定数字的时候就会因为压力把数据移到硬盘中,但是不要嗨皮,rabbitmq服务器重启后消息一样会丢失。而且过大的压力可能会出现各种各样的异常情况,这并不是我们想要看到的。