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

问题描述 投票:0回答:1

我正在使用azure web作业从队列中获取消息并处理它们,如下所示:

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

此Web作业存在于我的Azure帐户中的应用程序服务中。我的音量一直在稳步增长,我现在需要“扩大规模”。我需要同一个Web作业同时在多个实例上运行。这有两个原因:

  1. 处理能力更强
  2. 我的服务针对的是根据IP限制的网络API

我在我的应用服务中看到“向外扩展”的选项。但我不确定消息队列的内部工作方式,因为它与扩展有关。我特别关注的是:如果我将此应用服务扩展到2个实例,并且我的Web作业都在两个上运行(如上所示),队列中的每条消息都会被处理两次(每个实例一次)?或者Azure队列机制是否以这样的方式处理它:每个消息只被两个实例之一处理一次?

还有一件事需要考虑 - 在阅读本文时,我发现Azure中有两种类型的队列(存储队列和服务总线队列)。我在docs(“基础能力”部分)中发现有趣的一点是,存储队列的交付保证是“至少一次”。但服务总线队列的交付保证是“至少一次”和“最多一次”。这似乎表明,如果我的进程在服务总线队列中运行,那么它保证只运行一次。但如果它在存储队列中运行,它可能会运行多次。就我而言,我正在使用存储队列运行它。任何明确的说明都会有所帮助。

c# azure azure-webjobs
1个回答
3
投票

如果我将此应用服务扩展到2个实例,并且我的Web作业同时运行(如上所示),队列中的每条消息都会被处理两次(每个实例一次)?

你的问题的答案是否定的。每条消息只会被处理一次。从这个link(“多个实例”部分):

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

© www.soinside.com 2019 - 2024. All rights reserved.