#c# #azure #azure-functions #azure-durable-functions
#c# #azure #azure-функции #azure-durable-функции
Вопрос:
Я создаю надежную функцию на основе шаблона монитора. У меня есть приведенный ниже код, и мой вопрос касается переменной counter, которую я использовал для простого экспоненциального возврата к повторной попытке.
[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 ;
чтобы это было безопасно для воспроизведения?
Ответ №1:
Нет. Вам не нужна monitorContext.IsReplaying
проверка вокруг counter
.
Вам нужна эта проверка только для инструкций, которые вы хотите запустить только один раз, таких как ведение журнала (как в вашем коде), обновления статуса во внешней системе и т.д.
Чтобы быть безопасным для воспроизведения, вам просто нужно, чтобы ваш код был детерминированным. Таким образом, любой код, который не может быть создан в чистой функции, должен быть перемещен в их собственные функции activity. Все остальное подойдет.
Как указано в документации, любой код, который изменяется со временем (время воспроизведения), например, генераторы на основе времени, удаленные данные из внешних API и т.д. должно быть в функциях активности.
Комментарии:
1. спасибо за объяснение! Итак, способ, которым я использую счетчик для экспоненциального отката, действительно в порядке?!
2. ДА. Это правильно. Возможно, вам захочется установить верхний предел времени ожидания в зависимости от вашего варианта использования.