代码之家  ›  专栏  ›  技术社区  ›  Matt Spinks

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

  •  0
  • Matt Spinks  · 技术社区  · 6 年前

    我正在使用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. 我的服务针对的是一个web api,它根据ip进行调节

    我在我的应用服务中看到了“扩展”的选项。但我不确定消息队列的内部工作方式,因为它与扩展有关。我特别关心的是: 如果我将此应用程序服务扩展到2个实例,并且我的web作业同时在这两个实例上运行(如上所示),队列中的每条消息将被处理两次(每个实例一次)吗? 或者azure队列机制处理它的方式是让两个实例中的一个只处理一次每条消息?

    还有一件事需要考虑——在阅读本文时,我发现azure中有两种类型的队列(存储队列和服务总线队列)。我发现有件事很有趣 docs (在“基本功能”一节中)存储队列的传递保证是“至少一次”。但服务总线队列的交付保证是“至少一次”和“最多一次”。这个 似乎 指示如果我的进程在服务总线队列中运行,则它保证只运行一次。但如果它在存储队列中运行,则可能会运行多次。在我的例子中,我用一个存储队列运行它。这方面的任何澄清都会有帮助。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Gaurav Mantri    6 年前

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

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

    如果您的web应用在多个实例上运行,则会运行一个连续的webjob 在每台机器上,每台机器将等待触发器并尝试 运行函数。webjobs sdk队列触发器自动阻止 多次处理队列消息的函数;函数 不必写为等幂。但是,如果你想 确保函数只有一个实例运行,即使存在 主机web应用的多个实例,您可以使用singleton 属性。