[英]Azure App Service startuop command isn't working on a docker container
[英]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 呼叫速度的任何想法?
我不認為在讀取隊列時向 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.