[英]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.