使用 Azure 服务总线队列功能时如何使用更新的信息重新排队消息?

How to re-queue message with updated information while working with Azure Service Bus Queue Function?

在使用 Azure Service Bus Queue 函数时,我们知道每当出现异常时,azure 函数将执行默认重试策略(最大计数 = 10),我们想要做的是让我们的消息与一个属性调用了retryCount,所以当异常产生时,我们会增加retryCount += 1,同时将当前异常添加到我们的消息,然后下次当函数执行重试时,我们可以知道这是第 x 次它与 x 条异常记录一起出现。我们知道 Message 对象有一个只读的 属性 叫做 deliveryCount,但是,我们无法绑定我们的附加信息或找出Message 对象最后一次传递失败的原因

然而,在我们尝试实现我们的想法之后,我们发现每当函数执行重试时,它总是从队列重新加载初始消息,而不是我们更新的消息.有没有办法让它重试更新的消息而不强制将更新的消息重新发送回当前队列?

此外,我们如何自定义当前的重试逻辑,例如将最大重试次数从10次减少到1次,并使用Polly来处理函数内部的某些场景?

您实际上不需要自定义 retryCount,因为邮件已经包含一个名为 DeliveryCount 的系统 属性,它跟踪传递(读取处理)尝试的次数。如果您需要在重试之间存储一些额外的元数据,则需要 abandon 您的消息。使用 Functions v2,要放弃消息,您需要使用用于接收消息的消息接收器。

public static async Task ProcessMessage([ServiceBusTrigger("myqueue")] string message,
int deliveryCount,
MessageReceiver messageReceiver,
string lockToken)
{
  //
  await messageReceiver.AbandonAsync(lockToken, 
            new Dictionary<string, object> { { "Reason", "Blah" });
}

请注意,为确保 Azure Functions 继续处理消息,您需要抛出异常。否则,默认情况下,Functions 假定消息已成功处理并将尝试完成消息。