Завершение всех долговременных функций функционального приложения / учетной записи хранилища

#azure #azure-functions #azure-durable-functions

#лазурный #azure-функции #azure-durable-функции

Вопрос:

Мы хотим перенести все выполняемые в настоящее время долговременные функции из функционального приложения в недавно разработанное функциональное приложение.

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

Наша идея состояла в том, чтобы удалить таблицы «DurableFunctionsHubHistory» и «DurableFunctionsHubInstances» в связанной учетной записи хранения. С этой учетной записью хранилища не связаны другие функциональные приложения, использующие долговременные функции.

Безопасно ли это делать или есть лучший способ остановить большое количество долговременных функций?

Ответ №1:

вопрос в том, хотите ли вы остановить функции или функции, запущенные в очереди? если вы просто хотите остановить все существующие функции и использовать новые перенесенные функции

быстрый способ — использовать функции отключения, вы можете сделать это в Azure Portal или CLI с приведенным ниже примером

 az functionapp config appsettings set --name <myFunctionApp> 
--resource-group <myResourceGroup> 
--settings AzureWebJobs.QueueTrigger.Disabled=false
 

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

  var RunningStateFilter = new OrchestrationStatusQueryCondition()
                {
                    RuntimeStatus = new[]
                    {
                        OrchestrationRuntimeStatus.Running
                    },
                    CreatedTimeFrom = DateTime.UtcNow.Subtract(TimeSpan.FromDays(7)),
                    CreatedTimeTo = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)),
                    PageSize = 100
                };

                OrchestrationStatusQueryResult result = await client.ListInstancesAsync(RunningStateFilter, CancellationToken.None);
                foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
                {
                    NoOfInstance  = 1;
                    await client.TerminateAsync(instance.InstanceId, reason);
                }
 

Комментарии:

1. Но это приведет к запуску долговременных функций. Мне не нравится идея запуска большого количества экземпляров, которые никогда не будут завершены. Я чувствую, что это может укусить меня при следующей миграции или во время общей работы по обслуживанию…

2. вы можете создать несколько вспомогательных функций, чтобы отслеживать их на этом пути, я привел несколько примеров кодов, чтобы помочь вам в этом, вы также можете поискать github.com/scale-tone/DurableFunctionsMonitor чтобы понять, насколько это жизнеспособно для вас, может ли это помочь и вам.

3. Извините, ваш последний ответ пришел ко мне слишком поздно. В итоге я сделал то, что предложил, и удалил таблицы «DurableFunctionsHubHistory» и «DurableFunctionsHubInstances» и снова создал их пустыми. Это сработало, как ожидалось, и я пока не обнаружил никаких проблем.