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 仍然是3DeadLetterMessageCount 奇怪的是0),我仍然可以从死信队列接收消息。 (所以他们没有从队列中删除。)

【问题讨论】:

【参考方案1】:

Sebastian 您的观察是正确的,因为一旦放置在 DeadLetter 子队列中的消息永远不会过期。它们将永远可用,直到从 DeadLetter 子队列中明确删除。在上述关于工具/api的错误中,它可能是一个刷新问题?对 GetQueueAsync() 的调用需要在消息被死信之后进行,这不是一个确定性的时间,例如,如果您有一个包含一千条已过期但未使用该队列的消息的队列(发送/接收操作) 那么在执行某些操作之前,计数可能仍会返回为 Active。

【讨论】:

基本上:确保定期删除队列,可能以合理的方式(即以某种方式处理,抛出错误等)。【参考方案2】:

在做了一些研究后,我偶然发现了一个我完全错过的事实:

即使禁用死信,邮件也会过期。

当消息过期而死信被禁用(这是默认设置)时,它们将被删除。

所以,微软不从死信队列中自动删除消息的原因可能是:

如果您启用死信,您明确希望过期的消息不会被丢弃,而是存储在其他地方(死信队列),以便您可以查看它们。 em>

【讨论】:

您能否提供此信息的来源? “即使禁用死字,消息也会过期”我尝试查找,但在任何地方都找不到此说明 赞成,因为我喜欢这个评论。我相信也可能存在这样一种情况,我们想要死信消息,这样我们就不会丢失数据,但仍然有某种类型的消息过期,这些消息驻留在死信队列中。只是一个想法。 github.com/Azure/azure-resource-manager-schemas/blob/main/…

以上是关于Azure 服务总线中的死信队列中的消息是不是过期?的主要内容,如果未能解决你的问题,请参考以下文章

Azure SB 队列将消息发送到禁用的死信队列

将死信队列中的所有消息移回订阅的主队列

如何删除 Azure 服务总线主题上的死信消息

Azure 服务总线触发函数 - 绑定到 MessageReceiver

如何查看 Azure 服务总线队列中的所有消息?

如何在服务总线队列触发功能中将服务总线消息移动到死信