【问题标题】: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),我仍然可以从死信队列接收消息。 (所以他们没有从队列中删除。)

【问题讨论】:

    标签: c# azure message-queue azureservicebus


    【解决方案1】:

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

    【讨论】:

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

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

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

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

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

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

    【讨论】:

    • 您能否提供此信息的来源? “即使禁用死字,消息也会过期”我尝试查找,但在任何地方都找不到此说明
    • 赞成,因为我喜欢这个评论。我相信也可能存在这样一种情况,我们想要死信消息,这样我们就不会丢失数据,但仍然有某种类型的消息过期,这些消息驻留在死信队列中。只是一个想法。
    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    相关资源
    最近更新 更多