使用废弃的服务总线消息重新触发 Azure 函数

Re-trigger Azure Function with abandonded Service Bus messages

我有一个服务总线主题,其中有 400,000 条消息从 Azure 函数推送到它。我有第二个 Azure Functions,它接收消息作为触发器。当第二个函数 运行 时,它成功处理了 98% 的消息。它给我留下了大约 8,000 条失败的消息。无论是来自异常还是来自我的代码,消息都被放弃了。我现在有 8,000 条消息坐在该主题的订阅者中,我无法让函数重新尝试处理。

订阅者最初设置为只允许发送 1 次消息。我这样做是因为我在调试时看到同一条消息被多次处理。我不确定这是否是在 Visual Studio 本地调试的副作用,或者消息是否会多次发送到函数。我认为这就是导致这些消息在被放弃后没有函数 re-运行 的原因(如果支持的话?)。

我已将订户传递计数更改为 5,希望它将消息重新传递给函数。它没有。我现在需要做什么才能让剩余的 8,000 条消息再次触发 2nd Function?

最坏的情况是我可以删除订阅,重新创建订阅,然后 运行 重新创建第一个函数,它应该只发布与原始丢失的 8,000 条消息相关的数据(我有逻辑在第一个函数中处理丢失的数据)。这将导致第二个功能重新启动。我想弄清楚当订阅有这样的孤立消息时如何处理它,因为我将在推广到生产时遇到这种情况。我希望这是自动化的,而不必处理手动清理和重新运行第二次处理该过程。

以下显示主题中没有任何消息,但它们仍然存在于订阅中。

我在 Full Framework 上用 C# Functions 1.0 编写了函数。

如果达到 MaxDeliveryCount,消息将被发送到死信队列。
您可以将订阅视为 sub-queue,这样您仍然可以访问这些消息。

检查此 post 如何访问死信队列:

  • How do you access the dead letter sub-queue on an Azure subscription?

首先,您的方案是增加 MaxDeliveryCount。

然后你可以创建一个函数,每次消息到达死信时都会触发该函数 queue/subscription:

 [FunctionName("my-subscription-failure")]
 public static async Task RunFailure(
        [ServiceBusTrigger("%MytopicName%", "%MySubscription%/$DeadLetterQueue", Connection = "MyconnectionString")] BrokeredMessage message,
        [ServiceBus( "%MytopicName%", AccessRights.Send, Connection = "MyconnectionString")] ICollector<BrokeredMessage> queueBinding,
        TraceWriter log, ExecutionContext context)
{
    // fist check if the message can be resent (it could be a message that can't be replay)
    ...

    // If ok, resent the message
    queueBinding.Add(message);
}