防止 Azure Web 作业的多个实例处理相同的队列消息

Prevent multiple instances of an Azure web job processing the same Queue message

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

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

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

[01/24/2017 16:17:30 > 7e0338: INFO] Executing: 'Functions.RunExperiment' - Reason: 'New queue message detected on 'runexperiment'.'

[01/24/2017 16:17:30 > 7e0338: INFO] Executing: 'Functions.RunExperiment' - Reason: 'New queue message detected on 'runexperiment'.'

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

The WebJobs SDK queue trigger automatically prevents a function from processing a queue message multiple times; functions do not have to be written to be idempote.

我在 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;
    }
}

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

,问题就消失了