我正在使用azure Web作业从队列中提取消息并进行如下处理:
namespace TicketProcessor
{
public class Functions
{
public static void ProcessQueueMessage([QueueTrigger("ticketprocessorqueue")] string message, TextWriter log)
{
//DO STUFF HERE...
}
}
}
并且此网络作业存在于我的azure帐户中的应用程序服务中。我的音量一直在稳定增长,现在我需要“向外扩展”。我需要同一个Web作业才能同时在多个实例上运行。造成这种情况的原因有两个:
我在我的应用程序服务中看到了“向外扩展”选项。但是我不确定消息队列的内部工作原理,因为它与向外扩展有关。我特别担心的是:如果我将此应用程序服务扩展到2个实例,并且我的Web作业同时在两个实例上运行(如上所示),队列中的每条消息都将被处理两次(每个实例一次)? / strong>还是Azure队列机制以这样的方式处理它,即每个消息仅由两个实例之一处理一次?
要考虑的另一件事-在阅读此书时,我发现Azure中有两种类型的队列(存储队列和服务总线队列)。我在docs(在“基础功能”部分中)发现有趣的一件事是,存储队列的传递保证是“至少一次”。但是,服务总线队列的传递保证是“至少一次”和“每次一次”。这似乎表示如果我的进程在服务总线队列中运行,则保证只运行一次。但是,如果它在存储队列中运行,则可能会运行多次。就我而言,我正在使用存储队列运行它。对此进行任何澄清都是有帮助的。
答案 0 :(得分:3)
如果我将此应用程序服务扩展到2个实例,并且我的网络作业在 两者(如上所示),将处理队列中的每个消息 两次(每次实例一次)?
您的问题的答案是否定的。每个消息将仅被处理一次。从此link
(“多个实例”部分):
如果您的Web应用程序在多个实例上运行,则将连续运行WebJob 在每台机器上,并且每台机器将等待触发器并尝试 运行功能。 WebJobs SDK队列触发器会自动阻止 来自多次处理队列消息的功能;功能 不必写成幂等的。但是,如果您想 确保即使有 主机Web应用程序的多个实例,您可以使用Singleton 属性。