Как управлять историей выполнения для функций Azure Durable

Я разрабатываю процесс ETL, который использует для выполнения устойчивые функции (v2). Основной процесс выглядит следующим образом:

  1. Используйте действие, чтобы получить список кодов продуктов, которые нужно обработать
  2. Разветвление от основного оркестратора на N подчиненных оркестровок для объединения нескольких источников данных интеграции в один объект и обновления в Cosmos DB.

Основная оркестровка реализуется с использованием шаблона экземпляра синглтона, поэтому одновременно выполняется только один экземпляр.

Он работает нормально, но история выполнения в базовом хранилище таблиц TaskHub значительно увеличивается с каждым выполнением этого процесса, и здесь возникает очевидная проблема обслуживания, потому что этот процесс будет выполняться каждый час и будет генерировать много данных в базовом хранилище. Таблицы TaskHub.

Я изо всех сил пытаюсь найти руководство о том, как поддерживать историю выполнения этого процесса, чтобы она не увеличивалась слишком сильно. Я знаю ContinueAsNewAsync() API, но он не очень хорошо вписывается в мой дизайн, потому что заставляет процесс снова запускаться. Я не могу найти информацию ни по одному API, который можно использовать для очистки истории выполнения.

Это вопрос очистки таблиц вручную на данный момент, скажем, с использованием отдельных функций, запускаемых таймером? Это кажется немного взломанным / нестабильным, учитывая, что схема таблиц устойчивых функций может измениться в любой момент.


person Sam    schedule 22.10.2018    source источник


Ответы (3)


Durable Functions 1.7 представила очистку истории оркестровки, который позволяет удалить все данные, относящиеся к указанному экземпляру:

await client.PurgeInstanceHistoryAsync(instanceId);

Вам все равно придется реализовать логику запуска (например, задание, запускаемое таймером). Чтобы найти экземпляры, которые вы хотите удалить, вы можете использовать метод GetStatusAsync, который позволяет вам запрашивать время создания и статус экземпляра:

var instances = await client.GetStatusAsync(
    creationTimeFrom, 
    creationTimeTo,
    new[] { OrchestrationRuntimeStatus.Completed, OrchestrationRuntimeStatus.Failed, OrchestrationRuntimeStatus.Canceled });
person Thorkil Holm-Jacobsen    schedule 26.09.2019

Да, вам нужно сейчас вручную удалить записи таблицы или автоматизировать это с помощью внеполосного рабочего процесса или функции, запускаемой по таймеру.

Существует открытая проблема с GitHub, отслеживающая это по адресу https://github.com/Azure/azure-functions-durable-extension/issues/17

И инженерные усилия уже начали решать эту проблему. См. https://github.com/Azure/durabletask/pull/216.

person Ling Toh    schedule 23.10.2018
comment
Ах, отлично, спасибо, PurgeHistoryAsync () - это именно то, что мне нужно - я буду ждать, пока это будет выпущено. - person Sam; 23.10.2018
comment
Да, мы над этим активно работаем. Спасибо за ваше терпение! - person Ling Toh; 23.10.2018

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);
person R.Titov    schedule 06.08.2020