如何管理Azure持久功能的执行历史记录

时间:2018-10-22 22:38:24

标签: azure azure-functions azure-durable-functions

我正在开发一个使用持久功能(v2)进行执行的ETL流程。基本过程如下:

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

主要业务流程是使用单例实例模式实现的,因此一次仅运行一个实例。

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

我正在努力寻找有关如何维护此过程的执行历史的指南,以免其增长太多。我知道ContinueAsNewAsync() API,但这确实不能很好地适应我的设计,因为它会迫使流程再次运行。我也找不到任何可用于清除执行历史记录的API的信息。

现在是直接手动清除表(例如使用单独的计时器触发函数)吗?鉴于持久功能表的架构随时可能发生变化,因此这感觉有些hacky /易变。

3 个答案:

答案 0 :(得分:2)

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

有一个公开的GitHub问题,网址是,网址为 https://github.com/Azure/azure-functions-durable-extension/issues/17

并且工程工作已经开始解决此问题。请参见https://github.com/Azure/durabletask/pull/216

答案 1 :(得分:1)

Durable Functions 1.7引入了业务流程历史记录清除,该功能使您可以删除与指定实例有关的所有数据:

await client.PurgeInstanceHistoryAsync(instanceId);

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

var instances = await client.GetStatusAsync(
    creationTimeFrom, 
    creationTimeTo,
    new[] { OrchestrationRuntimeStatus.Completed, OrchestrationRuntimeStatus.Failed, OrchestrationRuntimeStatus.Canceled });

答案 2 :(得分: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);