RabbitMQ -优先级是队列的消息TTL还是发布服务器中的每消息TTL

oo7oh9g9  于 2023-05-17  发布在  RabbitMQ
关注(0)|答案(1)|浏览(130)

如果我通过队列声明创建了一个队列:

var args = new Dictionary<string, object>();
args.Add("x-message-ttl", 60000);
model.QueueDeclare("myqueue", false, false, false, args);

然后我发布到这个队列:

byte[] messageBodyBytes = System.Text.Encoding.UTF8.GetBytes("Hello, world!");

IBasicProperties props = model.CreateBasicProperties();
props.ContentType = "text/plain";
props.DeliveryMode = 2;
props.Expiration = "30000";

model.BasicPublish(exchangeName,
                   routingKey, props,
                   messageBodyBytes);

请问这个消息是60000秒还是30000 TTL?

xytpbqjk

xytpbqjk1#

Per rabbitmq官方docs
当同时指定了每队列和每消息TTL时,将选择两者中较小的值
所以在你的情况下,它是:30000
附加信息:
具有追溯应用的每消息TTL的队列(当它们已经有消息时)将在特定事件发生时丢弃消息。只有当过期的消息到达队列的头部时,它们才会真正被丢弃(或死信)。消费者将不会收到过期的消息。请记住,在消息过期和消费者交付之间可能存在自然的竞争条件,例如消息可在其被写入套接字之后但在其到达消费者之前过期。
当设置每消息TTL时,过期消息可以排在未过期消息后面,直到后者被消耗或过期。因此,由这样的过期消息使用的资源将不会被释放,并且它们将在队列统计中被计数(例如,队列中的消息数量)。
当追溯应用每消息TTL策略时,建议使用者联机以确保更快地丢弃消息。
考虑到现有队列上的每消息TTL设置的这种行为,当需要删除消息以释放资源时,应改为使用队列TTL(或队列清除或队列删除)。

相关问题