【问题标题】:Prevent multiple instances of an Azure web job processing the same Queue message防止处理同一队列消息的 Azure Web 作业的多个实例
【发布时间】:2017-01-24 16:46:59
【问题描述】:

我注意到我的 Web 作业的多个实例正在接收相同的消息并最终对其采取行动。这不是期望的行为。我希望同时处理多条消息,但是,我不希望 Web 作业的多个实例处理同一条消息。

  • 我的网络作业是连续运行类型的。
  • 我使用 QueueTrigger 接收消息并调用函数
  • 我的函数运行了几个小时。

我查看了 JobHostConfiguration.BatchSize 和 MaxDequeue 属性,但我不确定这些。我只是想要一个处理消息的实例,并且可能需要几个小时才能完成。

这是我在网络作业日志中看到的,表明收到了两次消息。

[2017 年 1 月 24 日 16:17:30 > 7e0338:信息] 执行: 'Functions.RunExperiment' - 原因:'检测到新队列消息 '运行实验'。'

[2017 年 1 月 24 日 16:17:30 > 7e0338:信息] 执行: 'Functions.RunExperiment' - 原因:'检测到新队列消息 '运行实验'。'

【问题讨论】:

  • 不确定这是否是最佳解决方案,但我通过检查 dequeueCount 以了解是运行还是退出来解决幂等性问题。我希望消息队列默认或允许配置,以防止消息扇出。
  • 您是否发现任何异常?当抛出异常时,消息将被丢弃。
  • 没有抛出异常。在 webjob 日志中可以看到两个实例正在运行,它们将完成和复制工作。
  • 哦,如果处理消息需要一段时间,你应该更新锁。你可以使用`OnMessageOptions.AutoRenewTimeout`。见stackoverflow.com/a/33785389/4167200

标签: azure-webjobs azure-storage-queues


【解决方案1】:

根据official document,如果我们在多个实例上的WebJob中使用Azure队列存储,我们不需要编写代码来防止多个实例处理同一个队列消息。

WebJobs SDK 队列触发器自动阻止函数多次处理队列消息;函数不必写成幂等的。

我在 2 个实例 WebApp 上部署了一个 WebJob,它也可以正常工作(不会使用相同的队列消息执行两次)。它可以在 2 个实例上运行,并且没有重复的执行消息。

所以队列消息执行两次很奇怪,请尝试调试是否有2个具有相同内容的队列消息被触发。

以下是我的调试代码。我将带有执行时间和实例 ID 信息的消息写入另一个队列。

public static void ProcessQueueMessage([QueueTrigger("queue")] string message, [Queue("logqueue")] out string newMessage, TextWriter log)
    {
        string instance = Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID");
        string newMsg = $"WEBSITE_INSTANCE_ID:{instance}, timestamp:{DateTime.Now}, Message:{message}";
        log.WriteLine(newMsg);
        Console.WriteLine(newMsg);
        newMessage = newMsg;
    }
}

【讨论】:

  • 我无法再复制此内容。在我发布的那天,我看到多个工作开始针对同一条消息。如果我再次发现此问题,我会将其标记为已完成并密切关注。
  • 你有关于这个线程的任何更新吗?如果有帮助,请帮忙标记为答案,以帮助更多有相同问题的社区。​​span>
【解决方案2】:

我遇到了同一条消息同时处理多次的问题。一旦我设置了 MaxPollingInterval 属性,问题就消失了......

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2016-04-16
    • 2018-09-27
    相关资源
    最近更新 更多