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

时间:2017-01-24 16:47:00

标签: azure-webjobs azure-storage-queues

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

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

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

这是我在网络作业日志中看到的,表明邮件已收到两次。

  

[01/24/2017 16:17:30> 7e0338:INFO]执行:   ' Functions.RunExperiment' - 原因:'检测到新队列消息   ' runexperiment''

     

[01/24/2017 16:17:30> 7e0338:INFO]执行:   ' Functions.RunExperiment' - 原因:'检测到新队列消息   ' runexperiment''

2 个答案:

答案 0 :(得分:1)

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

  

WebJobs SDK队列触发器自动阻止函数多次处理队列消息;函数不必写成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;
    }
}

enter image description here

enter image description here

答案 1 :(得分:0)

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