簡體   English   中英

Azure耐用功能-編排中的計數器

[英]Azure Durable Function - counter in orchestration

我正在基於監視器模式構建持久功能。 我有下面的代碼,我的問題是關於用於簡單指數重試退避的計數器變量。

[FunctionName("RequestOrchestrator")]
public static async Task RequestOrchestrator(
    [OrchestrationTrigger] DurableOrchestrationContext monitorContext, ILogger log)
{
    DateTime endTime = monitorContext.CurrentUtcDateTime.AddHours(1);
    int counter = 0;

    while (monitorContext.CurrentUtcDateTime < endTime)
    {
        var result = await monitorContext.CallActivityAsync<bool>("GetStatusExternal", "test");

        if (result)
        {
            // all ok
            break;
        }
        else
        {
            counter++;
            // Wait for the next checkpoint with exponential backoff
            var nextCheckpoint = monitorContext.CurrentUtcDateTime.AddSeconds(5 * counter);
            if (!monitorContext.IsReplaying)
            {
                log.LogInformation($"Next check at {nextCheckpoint}.");
            }

            await monitorContext.CreateTimer(nextCheckpoint, CancellationToken.None);
        }
    }
}

可以這樣使用計數器嗎?還是需要將counter++放入

if (!monitorContext.IsReplaying)
  counter++;

為確保重播安全

不。您不需要在counter++周圍使用monitorContext.IsReplaying檢查。
您只需要對要運行一次的語句進行此檢查,例如記錄(如在代碼中),對外部系統的狀態更新等。

為了重播安全,您基本上只需要確定代碼即可。 因此,任何無法在“ 純函數”中構成的代碼都必須移入其自己的活動函數中。 其他一切都會做。

像文檔狀態一樣,任何隨時間(重放時間)變化的代碼(例如基於時間的生成器,來自外部API的遠程數據等)都必須包含在活動函數中。

暫無
暫無

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

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