簡體   English   中英

在Azure中擴展應用程序服務時,是否在所有實例上都處理了一條消息(來自隊列)?

[英]When scaling out an app service in Azure, is a single message (from the queue) processed on all instances?

我正在使用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節流的Web API

我在我的應用程序服務中看到了“向外擴展”選項。 但是我不確定消息隊列的內部工作原理,因為它與向外擴展有關。 我特別擔心的是: 如果我將此應用程序服務擴展到2個實例,並且我的Web作業同時在兩個實例上運行(如上所示),隊列中的每個消息是否都會被處理兩次(每個實例一次)? 還是Azure隊列機制以這樣的方式處理它,即每個消息僅由兩個實例之一處理一次?

需要考慮的另一件事-在繼續閱讀時,我發現Azure中有兩種類型的隊列(存儲隊列和服務總線隊列)。 我在文檔中 (“基礎功能”部分中)發現有趣的一件事是,存儲隊列的交付保證是“至少一次”。 但是,服務總線隊列的傳遞保證是“至少一次”和“每次一次”。 似乎表明,如果我的進程在服務總線隊列中運行,那么可以保證它只能運行一次。 但是,如果它在存儲隊列中運行,則可能會運行多次。 就我而言,我正在使用存儲隊列運行它。 任何對此的澄清將是有幫助的。

如果我將此應用程序服務擴展到2個實例,並且我的Web作業同時在兩個實例上運行(如上所示),隊列中的每條消息是否都會被處理兩次(每個實例一次)?

您的問題的答案是否定的。 每個消息將僅被處理一次。 通過此link (“多個實例”部分):

如果您的Web應用程序在多個實例上運行,則連續的WebJob將在每台計算機上運行,​​並且每台計算機將等待觸發器並嘗試運行功能。 WebJobs SDK隊列觸發器會自動阻止函數多次處理隊列消息。 函數不必寫為冪等的。 但是,如果即使在主機Web應用程序有多個實例的情況下也要確保僅運行一個功能實例,則可以使用Singleton屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM