我注意到我的Web作业的多个实例正在接收相同的消息并最终对其进行操作。这不是理想的行为。我希望同时处理多个消息,但是,我不希望多个Web作业实例处理相同的消息。
我查看了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''
答案 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;
}
}
答案 1 :(得分:0)
我在同一时间多次处理过同一条消息。一旦我设置了MaxPollingInterval属性,问题就消失了......