0

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

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

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

4

1 回答 1

3

您实际上并不需要自定义retryCount,因为消息已经包含一个称为DeliveryCount跟踪传递(读取处理)尝试次数的系统属性。如果您需要在重试之间存储一些额外的元数据,则需要放弃您的消息。使用 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 默认假定消息已成功处理,并将尝试完成消息。

于 2019-09-16T22:58:51.443 回答