我正在基于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吗?
答案 0 :(得分:2)
不。您不需要SELECT CAST(YEAR(getdate()) AS VARCHAR)+ RIGHT('00'+CAST(MONTH(getdate()) AS VARCHAR),2)
周围的monitorContext.IsReplaying
检查。
您只需要对要运行一次的语句(例如日志记录(如代码中的代码),外部系统的状态更新等)进行此检查。
要确保重放安全,基本上您只需要确定代码即可。因此,无法在Pure Function中构成的任何代码都必须移入其自己的活动函数中。其他一切都会做。
就像文档说明一样,任何随时间(重放时间)变化的代码(例如基于时间的生成器,来自外部API的远程数据等)都必须处于活动函数中。