【问题标题】:How to manage execution history for Azure Durable Functions如何管理 Azure Durable Functions 的执行历史记录
【发布时间】:2018-10-22 22:38:23
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    Durable Functions 1.7 引入了Orchestration History Purging,它允许您删除与指定实例相关的所有数据:

    await client.PurgeInstanceHistoryAsync(instanceId);
    

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

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

    【讨论】:

      【解决方案2】:

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

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

      工程方面的努力已经开始解决这个问题。请看https://github.com/Azure/durabletask/pull/216

      【讨论】:

      • 啊,太好了,谢谢,PurgeHistoryAsync() 正是我所需要的——我会等待它发布。
      • 是的,我们正在积极努力。感谢您的耐心等待!
      【解决方案3】:

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        相关资源
        最近更新 更多