在 Azure Functions 编排中主动 activity 重试
Unsolicited activity retry in Azure Functions orchestration
我有一个很长的 运行ning(几分钟)工作,其中包含作为 Azure Functions 编排实现的 HTTP 触发器:
[FunctionName("ManualImportOrders")]
public async Task<HttpResponseMessage> HttpStart(
[HttpTrigger(AuthorizationLevel.Function, "POST")] HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient starter,
ILogger log)
{
var dtoInResult = await ReadDtoInAsync(req);
if (!dtoInResult.IsSuccess)
{
return new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent(dtoInResult.Error) };
}
string instanceId = await starter.StartNewAsync("ManualImportOrders_Orchestrator", dtoInResult.Value);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
return starter.CreateCheckStatusResponse(req, instanceId);
}
[FunctionName("ManualImportOrders_Orchestrator")]
public async Task<object> RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
var dtoIn = context.GetInput<ManualImportOrdersDtoIn>();
var result = await context.CallActivityAsync<object>("ManualImportOrders_RunJob", dtoIn);
return result;
}
[FunctionName("ManualImportOrders_RunJob")]
public async Task<object> RunManualAsync([ActivityTrigger] IDurableActivityContext context, ILogger logger, CancellationToken cancellationToken)
{
var dtoIn = context.GetInput<ManualImportOrdersDtoIn>();
logger.LogInformation("Invoking manual order import");
var result = ... call to business logic ...
logger.LogInformation("Manual order import completed");
return result.Output;
}
以上三个函数:
ManualImportOrders
调用编排。
ManualImportOrders_Orchestrator
调用单个 activity.
ManualImportOrders_RunJob
是 activity,执行长 运行ning 处理。
当 ManualImportOrders_RunJob
activity 函数因未处理的异常而失败时,我预计整个编排都会失败。当 运行 确实在本地使用 AF 工具时,就会发生这种情况。但是当 运行 在 Azure 中时,似乎有一些重试机制,因为 activity 函数再次 运行 具有相同的实例 ID。
比如第一个绿运行成功了。在第二个红色 运行 中,activity 函数失败并被反复召回:
知道为什么会这样吗?
我想找durable function
有没有默认的重试机制,没找到,我也很迷茫这种现象
但我认为您可以指定一个自动重试策略,这可能会减少对 activity 函数的调用次数。设置重试策略的语法是这样的:
[FunctionName("TimerOrchestratorWithRetry")]
public static async Task Run([OrchestrationTrigger] IDurableOrchestrationContext context)
{
var retryOptions = new RetryOptions(
firstRetryInterval: TimeSpan.FromSeconds(5),
maxNumberOfAttempts: 3);
await context.CallActivityWithRetryAsync("FlakyFunction", retryOptions, null);
}
您可以将maxNumberOfAttempts
的值设为最小值。希望对您有所帮助。
更多详情可以参考这位官方document.
我有一个很长的 运行ning(几分钟)工作,其中包含作为 Azure Functions 编排实现的 HTTP 触发器:
[FunctionName("ManualImportOrders")]
public async Task<HttpResponseMessage> HttpStart(
[HttpTrigger(AuthorizationLevel.Function, "POST")] HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient starter,
ILogger log)
{
var dtoInResult = await ReadDtoInAsync(req);
if (!dtoInResult.IsSuccess)
{
return new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent(dtoInResult.Error) };
}
string instanceId = await starter.StartNewAsync("ManualImportOrders_Orchestrator", dtoInResult.Value);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
return starter.CreateCheckStatusResponse(req, instanceId);
}
[FunctionName("ManualImportOrders_Orchestrator")]
public async Task<object> RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
var dtoIn = context.GetInput<ManualImportOrdersDtoIn>();
var result = await context.CallActivityAsync<object>("ManualImportOrders_RunJob", dtoIn);
return result;
}
[FunctionName("ManualImportOrders_RunJob")]
public async Task<object> RunManualAsync([ActivityTrigger] IDurableActivityContext context, ILogger logger, CancellationToken cancellationToken)
{
var dtoIn = context.GetInput<ManualImportOrdersDtoIn>();
logger.LogInformation("Invoking manual order import");
var result = ... call to business logic ...
logger.LogInformation("Manual order import completed");
return result.Output;
}
以上三个函数:
ManualImportOrders
调用编排。ManualImportOrders_Orchestrator
调用单个 activity.ManualImportOrders_RunJob
是 activity,执行长 运行ning 处理。
当 ManualImportOrders_RunJob
activity 函数因未处理的异常而失败时,我预计整个编排都会失败。当 运行 确实在本地使用 AF 工具时,就会发生这种情况。但是当 运行 在 Azure 中时,似乎有一些重试机制,因为 activity 函数再次 运行 具有相同的实例 ID。
比如第一个绿运行成功了。在第二个红色 运行 中,activity 函数失败并被反复召回:
知道为什么会这样吗?
我想找durable function
有没有默认的重试机制,没找到,我也很迷茫这种现象
但我认为您可以指定一个自动重试策略,这可能会减少对 activity 函数的调用次数。设置重试策略的语法是这样的:
[FunctionName("TimerOrchestratorWithRetry")]
public static async Task Run([OrchestrationTrigger] IDurableOrchestrationContext context)
{
var retryOptions = new RetryOptions(
firstRetryInterval: TimeSpan.FromSeconds(5),
maxNumberOfAttempts: 3);
await context.CallActivityWithRetryAsync("FlakyFunction", retryOptions, null);
}
您可以将maxNumberOfAttempts
的值设为最小值。希望对您有所帮助。
更多详情可以参考这位官方document.