簡體   English   中英

Azure function 服務總線觸發器運行多次

[英]Azure function service bus trigger running multiple times

我在我的 Visual Studio 解決方案中添加了一個項目,它是一個服務總線主題觸發器 function。 我正在使用默認代碼運行應用程序,但遇到問題。 每當我向服務總線主題添加消息時,我的觸發器每條消息執行 5-6 次,最后它會出現以下錯誤。

錯誤

提供的鎖無效。 鎖已過期,或者消息已從隊列中刪除。

我的代碼:

[FunctionName("TopicFunction1")]
    public static void Run(
        [ServiceBusTrigger("myservicebustopicname", "subscriptionname", Connection = "ServiceBus_NS_ConnectionString")]string message,
        Int32 deliveryCount,
        ILogger log)
    {
        log.LogInformation($"ServiceBus topic trigger function processed message: {message}");
    }

交貨數量達到 5-6。

我檢查了與此問題相關的多個問題,但它們沒有幫助。 下面是一個例子。 Azure Function App Azure 服務總線觸發器觸發兩次

請幫助解決這個問題。

有些事情要檢查。 所有參考資料均指向文檔

通過注銷消息 ID ,確保每次都是相同的消息,並且您沒有收到多條消息。

[FunctionName("ServiceBusQueueTriggerCSharp")]                    
public static void Run(
    [ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")] 
    string myQueueItem,
    Int32 deliveryCount,
    DateTime enqueuedTimeUtc,
    string messageId,
    ILogger log)
{
    log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
    log.LogInformation($"EnqueuedTimeUtc={enqueuedTimeUtc}");
    log.LogInformation($"DeliveryCount={deliveryCount}");
    log.LogInformation($"MessageId={messageId}");
}

如果您的 function 拋出任何異常,則該消息將被重試,但似乎並非如此。

最后,最有可能的是,如果您有兩個 function 應用程序或部署,並且它們指向同一個隊列,那么它們可能會相互競爭,下面復制的是消息的處理方式。 你可能會遇到比賽條件。 確保您只有一個實例正在運行,並且沒有其他代碼在隊列中競爭。

PeekLock 行為Functions 運行時在 PeekLock 模式下接收消息。 如果 function 成功完成,它會在消息上調用 Complete,如果 function 失敗,它會調用 Abandon。 如果 function 運行時間超過 PeekLock 超時時間,則只要 function 正在運行,鎖就會自動更新。

maxAutoRenewDuration 可在 host.json 中配置,它映射到 OnMessageOptions.MaxAutoRenewDuration。 根據服務總線文檔,此設置允許的最大值為 5 分鍾,而您可以將函數時間限制從默認的 5 分鍾增加到 10 分鍾。 對於服務總線功能,您不希望這樣做,因為您會超過服務總線續訂限制。

如果您的host.json文件中有"autoComplete": false ,則消息將被處理,但不會自動從主題訂閱中消失。 就像在這個host.json文件中一樣:

{
  "version": "2.0",
  "extensions": {
    "serviceBus": {
      "messageHandlerOptions": {
        "autoComplete": false
      }
    }
  }
}

刪除autoComplete或將其設置為true應該會使 function 從主題訂閱中刪除成功處理的消息。

如果您需要更多控制並且無法使用自動完成功能,則可以通過添加MessageReceiver參數顯式完成消息,並為Message object 調用CompleteAsync ,如下所示:

[FunctionName("TopicFunction1")]
public static async Task Run(
    [ServiceBusTrigger("myservicebustopicname", "subscriptionname", Connection = "ServiceBus_NS_ConnectionString")]Message message,
    MessageReceiver messageReceiver,
    ILogger log)
{
    log.LogInformation($"ServiceBus topic trigger function processed message: {message}");
    await messageReceiver.CompleteAsync(message.GetLockToken());
}

暫無
暫無

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

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