在Azure中扩展应用程序服务时,是否在所有实例上都处理了一条消息(来自队列)?

时间:2019-03-12 02:51:13

标签: c# azure azure-webjobs

我正在使用azure Web作业从队列中提取消息并进行如下处理:

namespace TicketProcessor
{
    public class Functions
    {
        public static void ProcessQueueMessage([QueueTrigger("ticketprocessorqueue")] string message, TextWriter log)
        {
            //DO STUFF HERE...
        }
    }
}

并且此网络作业存在于我的azure帐户中的应用程序服务中。我的音量一直在稳定增长,现在我需要“向外扩展”。我需要同一个Web作业才能同时在多个实例上运行。造成这种情况的原因有两个:

  1. 更多处理能力
  2. 我的服务的目标是根据IP进行限制的网络api

我在我的应用程序服务中看到了“向外扩展”选项。但是我不确定消息队列的内部工作原理,因为它与向外扩展有关。我特别担心的是:如果我将此应用程序服务扩展到2个实例,并且我的Web作业同时在两个实例上运行(如上所示),队列中的每条消息都将被处理两次(每个实例一次)? / strong>还是Azure队列机制以这样的方式处理它,即每个消息仅由两个实例之一处理一次?

要考虑的另一件事-在阅读此书时,我发现Azure中有两种类型的队列(存储队列和服务总线队列)。我在docs(在“基础功能”部分中)发现有趣的一件事是,存储队列的传递保证是“至少一次”。但是,服务总线队列的传递保证是“至少一次”和“每次一次”。这似乎表示如果我的进程在服务总线队列中运行,则保证只运行一次。但是,如果它在存储队列中运行,则可能会运行多次。就我而言,我正在使用存储队列运行它。对此进行任何澄清都是有帮助的。

1 个答案:

答案 0 :(得分:3)

  

如果我将此应用程序服务扩展到2个实例,并且我的网络作业在   两者(如上所示),将处理队列中的每个消息   两次(每次实例一次)?

您的问题的答案是否定的。每个消息将仅被处理一次。从此link(“多个实例”部分):

  

如果您的Web应用程序在多个实例上运行,则将连续运行WebJob   在每台机器上,并且每台机器将等待触发器并尝试   运行功能。 WebJobs SDK队列触发器会自动阻止   来自多次处理队列消息的功能;功能   不必写成幂等的。但是,如果您想   确保即使有   主机Web应用程序的多个实例,您可以使用Singleton   属性。