Azure Functions 中的服务总线死信队列处理

Service Bus Dead Letter Queue Processing In Azure Functions

我的环境。

现在我有两个 ServiceBusTrigger 函数。一个处理主队列消息,另一个处理死信队列消息。

场景

更新 1

从 DLQ 中获取消息的过程应该不会经常失败。 DLQ 中的消息进入循环本身的事实表明这里确实有问题。

您能否详细说明您的流程在做什么以及失败的原因?您是否从主队列触发了与 DLQ 相同的功能?那是不明智的。如果您可以查看失败的根本原因,您将有更少的消息登陆 DLQ 来处理。

这样想。您是否需要额外的队列来重试然后将其推送到另一个队列?在最终将其移动到死信队列之前,您还需要多少个队列?那你会用死信队列做什么?

无论如何,服务总线不会自动将消息从 DLQ 移动到另一个队列。但是,如果确实需要,您可以触发自己的进程将其写入另一个队列。服务总线触发的 Azure 功能非常适合做这样的工作。

要从 DLQ 中打破无限循环,请从 Brokered 属性中添加对传递计数值的检查。如果这个值大于某个阈值,则将消息写入另一个队列。每次提取邮件时,传递计数都会增加。

下面显示了 .NET 中的一个示例。我是模拟失败来说明。

using System;
using System.Threading.Tasks;
using Microsoft.Toolkit.Services;

public static void Run(string myQueueItem, Int32 deliveryCount, ILogger log)
{
    log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
    log.LogInformation($"Delivery count : {deliveryCount}");
    if (deliveryCount < 3)
    {
        log.LogInformation("Simulating failure");
        throw new TooManyRequestsException();
    }
    else
    {
        log.LogInformation($"Delivery count is now {deliveryCount}. Time to write this message into another queue.");
    } 
}

在第 3 次重试时,我想将消息发送到另一个队列。向我的服务总线发送测试消息后,我得到以下输出。

2022-02-22T03:05:35.281 [Information] Executing 'Functions.ServiceBusQueueTrigger1' (Reason='(null)', Id=eed59015-f100-42b4-b0bf-57a9a6ab226f)
2022-02-22T03:05:35.281 [Information] Trigger Details: MessageId: 86f8250e82fb42deb88e6b91244ca2b7, SequenceNumber: 3, DeliveryCount: 1, EnqueuedTimeUtc: 2022-02-22T03:05:35.2980000Z, LockedUntilUtc: 2022-02-22T03:06:05.2980000Z, SessionId: (null)
2022-02-22T03:05:35.531 [Information] C# ServiceBus queue trigger function processed message: my new message
2022-02-22T03:05:35.531 [Information] Delivery count : 1
2022-02-22T03:05:35.532 [Information] Simulating failure
2022-02-22T03:05:35.557 [Error] Executed 'Functions.ServiceBusQueueTrigger1' (Failed, Id=eed59015-f100-42b4-b0bf-57a9a6ab226f, Duration=253ms)Exception of type 'Microsoft.Toolkit.Services.TooManyRequestsException' was thrown.
2022-02-22T03:05:35.644 [Information] Executing 'Functions.ServiceBusQueueTrigger1' (Reason='(null)', Id=78d2df93-11f6-412b-9ae7-880ac3bf4213)
2022-02-22T03:05:35.645 [Information] Trigger Details: MessageId: 86f8250e82fb42deb88e6b91244ca2b7, SequenceNumber: 3, DeliveryCount: 2, EnqueuedTimeUtc: 2022-02-22T03:05:35.2980000Z, LockedUntilUtc: 2022-02-22T03:06:05.6730000Z, SessionId: (null)
2022-02-22T03:05:35.645 [Information] C# ServiceBus queue trigger function processed message: my new message
2022-02-22T03:05:35.646 [Information] Delivery count : 2
2022-02-22T03:05:35.646 [Information] Simulating failure
2022-02-22T03:05:35.674 [Error] Executed 'Functions.ServiceBusQueueTrigger1' (Failed, Id=78d2df93-11f6-412b-9ae7-880ac3bf4213, Duration=2ms)Exception of type 'Microsoft.Toolkit.Services.TooManyRequestsException' was thrown.
2022-02-22T03:05:35.782 [Information] Executing 'Functions.ServiceBusQueueTrigger1' (Reason='(null)', Id=b856141d-d891-4edb-a910-7e53b40b96a0)
2022-02-22T03:05:35.783 [Information] Trigger Details: MessageId: 86f8250e82fb42deb88e6b91244ca2b7, SequenceNumber: 3, DeliveryCount: 3, EnqueuedTimeUtc: 2022-02-22T03:05:35.2980000Z, LockedUntilUtc: 2022-02-22T03:06:05.8130000Z, SessionId: (null)
2022-02-22T03:05:35.783 [Information] C# ServiceBus queue trigger function processed message: my new message
2022-02-22T03:05:35.784 [Information] Delivery count : 3
2022-02-22T03:05:35.784 [Information] Delivery count is now 3. Time to write this message into another queue.**
2022-02-22T03:05:35.784 [Information] Executed 'Functions.ServiceBusQueueTrigger1' (Succeeded, Id=b856141d-d891-4edb-a910-7e53b40b96a0, Duration=2ms)