我正在开发一个使用持久功能(v2)进行执行的ETL流程。基本过程如下:
主要业务流程是使用单例实例模式实现的,因此一次仅运行一个实例。
它工作正常,但是底层TaskHub表存储中的执行历史记录随着此过程的每次执行而显着增长,并且那里存在明显的维护问题,因为该过程将在一个小时内运行并会生成大量数据在基础TaskHub表中。
我正在努力寻找有关如何维护此过程的执行历史的指南,以免其增长太多。我知道ContinueAsNewAsync()
API,但这确实不能很好地适应我的设计,因为它会迫使流程再次运行。我也找不到任何可用于清除执行历史记录的API的信息。
现在是直接手动清除表(例如使用单独的计时器触发函数)吗?鉴于持久功能表的架构随时可能发生变化,因此这感觉有些hacky /易变。
答案 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)
GetStatusAsync
是Obsolete
,但您可以改用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);