簡體   English   中英

為什么 Task.Delay 不能在 Azure Function 應用程序中運行?

[英]Why isn't Task.Delay working in an Azure Function App?

我有一個 C# function 應用程序(.net Core 3.1)處理隊列中的項目。 我需要放慢處理速度,因為我需要與另一個外部 API 通話,而且它有速率限制。

我在用

await Task.Delay(1000);

在調用 API 之間暫停 function 應用程序一段時間。在我的本地開發環境中,它運行良好,並在給定的時間段內暫停。 當部署到 Azure 時,似乎沒有發生延遲,隊列項目的處理比預期的要快得多。

我已經嘗試了 10000 毫秒(10 秒)的長時間,並且在本地測試時可以看到延遲,但是當部署到 Azure 時,隊列項目很快就用完了,而且肯定間隔不到 10 秒。

function 聲明如下所示:

[FunctionName("ProcessUserQueue")]
public async Task RunAsync([QueueTrigger(QueueNames.ProcessUserQueueName)]string myQueueItem, ILogger log)
{
    log.LogInformation($"ProcessUserQueue trigger function processed: {myQueueItem}");
    await _userService.ProcessUserAsync(myQueueItem, log);
}

在 ProcessUserAsync 內部,我做的第一件事就是調用

await Task.Delay(10000);

它有效,但僅在本地開發環境中有效。

我的 host.json 看起來像這樣(隊列批量大小為 1):

{
  "version": "2.0",
  "functionTimeout": "00:10:00",
  "extensions": {
    "queues": {
      "batchSize": 1,
      "maxDequeueCount": 5
    }
  }
}

關於為什么這不起作用,或者如何更好地限制 function 內的 API 呼叫速度的任何想法?

有多種方法可以延遲該過程:

  1. 您可以使用Thread.Sleep()而不是使用Task.Delay() ) 。

    Task.Delay( ) 用於在不阻塞當前線程的情況下進行邏輯延遲。

    Thread.Sleep()用於阻塞當前線程。

  2. 您可以使用durable functions來實現進程延遲參考

  3. 它包括設置initialVisibilityDelay添加消息

對於initialVisibilityDelay你需要添加一個臨時隊列,然后添加一個function。

請參閱更多信息

我不認為在讀取隊列時向 HttpTrigger function 添加延遲不會在現實場景中起作用,因為如果項目的處理時間超過 function 超時期限,function 將超時。

對於可能需要比 HttpTrigger function 超時時間更長的操作,請使用Azure Durable Functions

Durable Functions 提供持久計時器,供在協調器函數中使用以實現延遲或設置異步操作的超時。

[FunctionName("BillingIssuer")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    for (int i = 0; i < 10; i++)
    {
        DateTime deadline = context.CurrentUtcDateTime.Add(TimeSpan.FromDays(1));
        await context.CreateTimer(deadline, CancellationToken.None);
        await context.CallActivityAsync("SendBillingEvent");
    }
}

要使用計時器在 Azure Durable function 中實現延遲,請參閱文章: https://learn.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-timers?tabs=csharp

對於 Azure 持久函數,請參閱: https://learn.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-overview?tabs=csharp

暫無
暫無

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

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