失败的消息不会从 Azure 服务总线触发函数移动到 DLQ

Posted

技术标签:

【中文标题】失败的消息不会从 Azure 服务总线触发函数移动到 DLQ【英文标题】:Failed messages are not moved to DLQ from Azure Servicebus triggerfunction 【发布时间】:2022-01-20 05:15:49 【问题描述】:

第一次发帖,请客气。

我在 Azure 中有一个 Servicebus 触发器。该函数按预期工作,当消息进入队列时触发。触发器的主要功能是处理消息中的数据并将它们放入另一个外部系统中。但是,无法保证外部系统会接受数据,因此消息处理失败。如果发生这种情况,则会引发异常并将消息移动到死信队列 (DLQ)。设置了一个 timertrigger 来读取 DLQ 并将失败的消息移回主队列,其中 Servicebus 触发器再次退出以处理消息。

我现在的问题是失败的消息没有移动到 DLQ,它只是消失了。然而,这并不一致。有时会移到 DLQ,但大多数时候不会。

这一直有效,这周开始发生。

我已经多次测试将相同的消息发布到队列中,但不一致仍然存在。所以看不出跟队列中的数据有什么关系。

我已将代码剥离为下面的代码,体验相同。

有人知道会发生什么吗?我在代码中看不到它,而且我没有对 Azure 中的 Servicebus 做任何事情,但我怀疑这可能是我忽略的一些设置。

public static void Run([ServiceBusTrigger("xxx", Connection = "xxx")] string myQueueItem, ILogger log)

    log.LogInformation($"C# ServiceBus queue trigger function processed message: myQueueItem");

    if (myQueueItem == "0")
    
        log.LogError($"Message failed myQueueItem");
        throw new Exception("DLQ test");
    


【问题讨论】:

你好@Larry Gumpert,你能参考这个github.com/Azure/azure-webjobs-sdk/issues/…。让我知道它是否有效 你也可以参考这个特定原因github.com/paolosalvatori/ServiceBusExplorer/issues/… @AjayKumarGhose-MT 感谢您的帮助,但看不到这对我有帮助。服务总线触发函数应该在函数抛出异常时自动放弃并将消息移动到 DLQ。我不应该使用代码将消息移动到 DLQ(不过,我也尝试过)。 很高兴您的问题已得到解决。您可以接受并投票赞成答案,以便对可能面临相同问题的其他社区成员有所帮助。 【参考方案1】:

看起来它毕竟在我的代码中,现在看起来像预期的那样工作。

在测试期间,我一直在从主队列读取数据,从 DLQ 读取数据并将 DLQ 消息重新提交回主队列。我用来接收和发送消息的 SDK 对象似乎一直在阻止消息的处理,如果它们没有在代码中正确处理:

await sender.DisposeAsync();
await receiver.DisposeAsync();
await client.DisposeAsync();

实施后,事情似乎更稳定了。

【讨论】:

以上是关于失败的消息不会从 Azure 服务总线触发函数移动到 DLQ的主要内容,如果未能解决你的问题,请参考以下文章

服务总线触发 Azure 函数

Azure 服务总线触发队列在本地调试中未命中代码

如何编写将部分传入消息传递给服务总线队列的 Azure HTTP 触发器函数?

从 SQL 向 Azure 服务总线队列添加消息

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

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