【问题标题】:Re-trigger Azure Function with abandonded Service Bus messages使用废弃的服务总线消息重新触发 Azure 函数
【发布时间】:2018-04-04 02:16:51
【问题描述】:

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

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

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

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

下图显示,Topic 中没有任何消息,但订阅中仍然存在。

我在完整框架上用 C# Functions 1.0 编写了函数。

【问题讨论】:

  • 您可以从死信或毒物队列中获取消息。
  • 所以我无法让原来的服务总线触发 Azure 函数再次运行?我必须编写一个实用程序来获取这些消息?
  • 在您的 azure 仪表板上,您能在死信或毒物队列中看到此消息吗?如果是的话,你可以得到它们
  • 不,主题下所有内容的消息数均为 0。订阅有 8000 条消息,但主题为空。
  • 我更新了我的 OP 并附上了主题截图以供参考。

标签: azure azure-functions azureservicebus azure-servicebus-topics


【解决方案1】:

如果达到 MaxDeliveryCount,则消息将被发送到死信队列。
您可以将订阅视为子队列,因此您仍然可以访问这些消息。

查看这篇关于如何访问死信队列的帖子:

首先你的方案是增加 MaxDeliveryCount。

然后你可以创建一个函数,每次消息到达死信队列/订阅时都会触发:

 [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);
}

【讨论】:

    猜你喜欢
    • 2022-06-17
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2021-09-09
    相关资源
    最近更新 更多