我正在使用azure web作业从队列中获取消息并处理它们,如下所示:
namespace TicketProcessor
{
public class Functions
{
public static void ProcessQueueMessage([QueueTrigger("ticketprocessorqueue")] string message, TextWriter log)
{
//DO STUFF HERE...
}
}
}
此Web作业存在于我的Azure帐户中的应用程序服务中。我的音量一直在稳步增长,我现在需要“扩大规模”。我需要同一个Web作业同时在多个实例上运行。这有两个原因:
我在我的应用服务中看到“向外扩展”的选项。但我不确定消息队列的内部工作方式,因为它与扩展有关。我特别关注的是:如果我将此应用服务扩展到2个实例,并且我的Web作业都在两个上运行(如上所示),队列中的每条消息都会被处理两次(每个实例一次)?或者Azure队列机制是否以这样的方式处理它:每个消息只被两个实例之一处理一次?
还有一件事需要考虑 - 在阅读本文时,我发现Azure中有两种类型的队列(存储队列和服务总线队列)。我在docs(“基础能力”部分)中发现有趣的一点是,存储队列的交付保证是“至少一次”。但服务总线队列的交付保证是“至少一次”和“最多一次”。这似乎表明,如果我的进程在服务总线队列中运行,那么它保证只运行一次。但如果它在存储队列中运行,它可能会运行多次。就我而言,我正在使用存储队列运行它。任何明确的说明都会有所帮助。
如果我将此应用服务扩展到2个实例,并且我的Web作业同时运行(如上所示),队列中的每条消息都会被处理两次(每个实例一次)?
你的问题的答案是否定的。每条消息只会被处理一次。从这个link
(“多个实例”部分):
如果您的Web应用程序在多个实例上运行,则在每台计算机上运行连续的WebJob,并且每台计算机将等待触发器并尝试运行功能。 WebJobs SDK队列触发器自动阻止函数多次处理队列消息;函数不必写成幂等的。但是,如果要确保即使存在多个主机Web应用程序实例,也只运行一个函数实例,则可以使用Singleton属性。