Azure耐用功能-编排中的计数器

时间:2019-04-23 14:07:42

标签: c# azure azure-functions azure-durable-functions

我正在基于monitor pattern构建持久功能。我有下面的代码,我的问题是关于用于简单指数重试回退的计数器变量。

[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++;

要成为replay-safe吗?

1 个答案:

答案 0 :(得分:2)

不。您不需要SELECT CAST(YEAR(getdate()) AS VARCHAR)+ RIGHT('00'+CAST(MONTH(getdate()) AS VARCHAR),2) 周围的monitorContext.IsReplaying检查。
您只需要对要运行一次的语句(例如日志记录(如代码中的代码),外部系统的状态更新等)进行此检查。

要确保重放安全,基本上您只需要确定代码即可。因此,无法在Pure Function中构成的任何代码都必须移入其自己的活动函数中。其他一切都会做。

就像文档说明一样,任何随时间(重放时间)变化的代码(例如基于时间的生成器,来自外部API的远程数据等)都必须处于活动函数中。