Azure 服务总线中的死信队列中的消息是不是过期?
Posted
技术标签:
【中文标题】Azure 服务总线中的死信队列中的消息是不是过期?【英文标题】:Do messages in dead letter queues in Azure Service Bus expire?Azure 服务总线中的死信队列中的消息是否过期? 【发布时间】:2014-06-30 21:01:22 【问题描述】:Azure 服务总线死信队列中的消息是否过期?
一些解释
我有这些队列设置:
var queueDescription = new QueueDescription("MyTestQueue")
RequiresSession = false,
DefaultMessageTimeToLive = TimeSpan.FromMinutes(1),
EnableDeadLetteringOnMessageExpiration = true,
MaxDeliveryCount = 10
;
namespaceManager.CreateQueue(queueDescription);
当我将一些消息放入 Azure 服务总线消息队列(不是来自 Azure 存储的队列)并且(永远)不使用它们时,它们会自动移动到死信队列。
但是,如果我也没有死信队列的消费者,那么消息是否会从死信队列中删除,或者它们会永远留在那里? (是否有一些官方文档说明这应该如何工作?)
我的试炼
在我的试验中,我在队列中放置了 3 条消息。大约 2 分钟后,他们就死了。他们在死信队列中至少停留了一天,并且没有被删除。
虽然调用NamespaceManager.GetQueueAsync() 给了我上面的值(注意MessageCount
仍然是3
但DeadLetterMessageCount
奇怪的是0
),我仍然可以从死信队列接收消息。 (所以他们没有从队列中删除。)
【问题讨论】:
【参考方案1】:Sebastian 您的观察是正确的,因为一旦放置在 DeadLetter 子队列中的消息永远不会过期。它们将永远可用,直到从 DeadLetter 子队列中明确删除。在上述关于工具/api的错误中,它可能是一个刷新问题?对 GetQueueAsync() 的调用需要在消息被死信之后进行,这不是一个确定性的时间,例如,如果您有一个包含一千条已过期但未使用该队列的消息的队列(发送/接收操作) 那么在执行某些操作之前,计数可能仍会返回为 Active。
【讨论】:
基本上:确保定期删除队列,可能以合理的方式(即以某种方式处理,抛出错误等)。【参考方案2】:在做了一些研究后,我偶然发现了一个我完全错过的事实:
即使禁用死信,邮件也会过期。
当消息过期而死信被禁用(这是默认设置)时,它们将被删除。
所以,微软不从死信队列中自动删除消息的原因可能是:
如果您启用死信,您明确希望过期的消息不会被丢弃,而是存储在其他地方(死信队列),以便您可以查看它们。 em>
【讨论】:
您能否提供此信息的来源? “即使禁用死字,消息也会过期”我尝试查找,但在任何地方都找不到此说明 赞成,因为我喜欢这个评论。我相信也可能存在这样一种情况,我们想要死信消息,这样我们就不会丢失数据,但仍然有某种类型的消息过期,这些消息驻留在死信队列中。只是一个想法。 github.com/Azure/azure-resource-manager-schemas/blob/main/…以上是关于Azure 服务总线中的死信队列中的消息是不是过期?的主要内容,如果未能解决你的问题,请参考以下文章