Azure Functions 中的服务总线死信队列处理
Service Bus Dead Letter Queue Processing In Azure Functions
我的环境。
- 网络 6
- Azure Functions(与 dotnet 隔离)
- Azure 服务总线
现在我有两个 ServiceBusTrigger 函数。一个处理主队列消息,另一个处理死信队列消息。
场景
- 当主队列消息处理失败(2 次)时,消息将移至死信队列。
- 现在它触发死信队列消息并开始重试。这里好像是无限循环。如果消息在 DLQ 级别失败,如何将消息移动到另一个队列。有什么方法可以重新提交消息到队列中吗?
更新 1
- 场景是处理该消息的消费者出现问题。
- 现在,当消息首先进入主队列然后由消费者处理时,由于消费者的某些依赖性问题而出现问题。所以在一些重试消息之后将进入 DLQ。
- 现在DLQ使用相同的业务代码来处理来自不同函数的消息。由于依赖性存在问题,因此消息将再次失败。现在在 DLQ 中它处理无限。我想将此消息移至其他队列,并从那里进行一些手动干预以进一步处理该消息。
- 在高流量应用程序中,可能在做出上述决定之前 queue/DLQ 中有很多消息。
从 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)
我的环境。
- 网络 6
- Azure Functions(与 dotnet 隔离)
- Azure 服务总线
现在我有两个 ServiceBusTrigger 函数。一个处理主队列消息,另一个处理死信队列消息。
场景
- 当主队列消息处理失败(2 次)时,消息将移至死信队列。
- 现在它触发死信队列消息并开始重试。这里好像是无限循环。如果消息在 DLQ 级别失败,如何将消息移动到另一个队列。有什么方法可以重新提交消息到队列中吗?
更新 1
- 场景是处理该消息的消费者出现问题。
- 现在,当消息首先进入主队列然后由消费者处理时,由于消费者的某些依赖性问题而出现问题。所以在一些重试消息之后将进入 DLQ。
- 现在DLQ使用相同的业务代码来处理来自不同函数的消息。由于依赖性存在问题,因此消息将再次失败。现在在 DLQ 中它处理无限。我想将此消息移至其他队列,并从那里进行一些手动干预以进一步处理该消息。
- 在高流量应用程序中,可能在做出上述决定之前 queue/DLQ 中有很多消息。
从 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)