2

我正在开发一个使用 Durable Functions (v2) 执行的 ETL 流程。基本流程如下:

  1. 使用活动检索要处理的产品代码列表
  2. 从主编排器扇出到 N 个子编排,以将多个集成数据源合并为单个对象并在 Cosmos DB 中更新

主要编排是使用单例实例模式实现的,因此一次只运行一个实例。

它工作正常,但是底层 TaskHub 表存储中的执行历史随着该进程的每次执行而显着增长,并且存在明显的维护问题,因为该进程将按小时运行,并且会在底层生成大量数据TaskHub 表。

我正在努力寻找有关如何维护此流程的执行历史以使其不会增长太多的指导。我知道ContinueAsNewAsync()API,但这并不太适合我的设计,因为它也会强制进程再次运行。我也找不到任何可用于清除执行历史记录的 API 信息。

现在是否需要直接手动清除表格,比如使用单独的计时器触发函数?考虑到持久函数表的架构可以随时更改,这感觉有点 hacky / volatile。

4

3 回答 3

3

Durable Functions 1.7引入了编排历史清除,它允许您删除与指定实例相关的所有数据:

await client.PurgeInstanceHistoryAsync(instanceId);

您仍然必须实现触发逻辑(例如计时器触发的作业)。要查找要删除的实例,可以使用GetStatusAsync允许您查询创建时间和实例状态的方法:

var instances = await client.GetStatusAsync(
    creationTimeFrom, 
    creationTimeTo,
    new[] { OrchestrationRuntimeStatus.Completed, OrchestrationRuntimeStatus.Failed, OrchestrationRuntimeStatus.Canceled });
于 2019-09-26T06:31:51.800 回答
2

是的,您现在必须手动删除表条目,或者使用带外工作流程或定时器触发功能自动删除。

在https://github.com/Azure/azure-functions-durable-extension/issues/17上有一个开放的 GitHub 问题跟踪此问题

工程工作已经开始解决这个问题。请参阅https://github.com/Azure/durabletask/pull/216

于 2018-10-23T02:54:24.480 回答
0

GetStatusAsyncObsolete,但您可以ListInstancesAsync改用:

DefaultPageSize = 100;
OrchestrationStatusQueryResult statusQueryResult = null;

do
{
    var instances = await client.ListInstancesAsync(
      new OrchestrationStatusQueryCondition
      {
         CreatedTimeFrom = creationTimeFrom,
         CreatedTimeTo = creationTimeTo,
         RuntimeStatus = new[]
         {
           OrchestrationRuntimeStatus.Completed, 
           OrchestrationRuntimeStatus.Failed, 
           OrchestrationRuntimeStatus.Canceled,
         },
         PageSize = DefaultPageSize,
         ContinuationToken = statusQueryResult?.ContinuationToken,
      }, CancellationToken.None);
      
    foreach (var instance in statusQueryResult.DurableOrchestrationState)
    {
        await client.PurgeInstanceHistoryAsync(instance.InstanceId);
    }
      
} while (statusQueryResult?.ContinuationToken != null);
于 2020-08-06T14:32:00.227 回答