Итак, коллега покинул предприятие, на котором я работаю, и я должен принять участие в некоторых проектах, которые он возглавлял. Один проект основан на Azure Функции (v1), но я не совсем все понимаю.
Суть проекта заключается в том, чтобы каждую ночь запускать некоторый код в базах данных (статистика, пересоздавать индексы, .. .)
Так что все организовано так
RunTimerTrigger([TimerTrigger("0 30 0 * * *")]TimerInfo myTimer, [OrchestrationClient] DurableOrchestrationClient starter, ILogger log)
For each database: starter.StartNewAsync(DurableTenantFunction, tenantInfo);
[FunctionName(DurableTenantFunction)]
RunOrchestrator([OrchestrationTrigger] DurableOrchestrationContextBase context,
[Queue(FunctionConstants.DurableMidnightScriptQueue, Connection = "ServerFunctionsStorage")]
Call activity 1 (context.CallActivityAsync)
Call activity 2
Call activity 3
//Put message in queue to start trigger the scripts for the DB
await outputQueue.AddAsync(tenantInfo);
RunOrchestratorClient([QueueTrigger(FunctionConstants.DurableMidnightScriptQueue)] TenantInfo tenantInfo,
[OrchestrationClient] DurableOrchestrationClient starter
Call activity 4
Call activity 5
Call activity 6
Итак, у нас есть TimerTrigger, который срабатывает каждую ночь в 0:30. Он получает базу данных, которую мы должны обновить, а затем запускаем оркестратор. Оркестратор вызывает некоторых активистов, а затем добавляет сообщение в очередь. Эта очередь запускает другого клиента Orchestrator, который запускает три дополнительных действия. (Orchestrator 1 - это в основном обновление статистики, а Orchestrator 2 - в основном оптимизация db (спящий сеанс, индекс, ...)
Мы заметили, что в поведении нашего полуночного скрипта было что-то странное (это название мы называем эту часть кода) и поэтому я добавляю несколько журналов для проверки поведения. Журналы выглядят так:
//Log start activity 1 for database x
start activity 1
// Log end activity 1 for database x
// Log start activity 2 for database x
...
На основе журналов таймер срабатывает каждую ночь, как и должно быть, но затем странное поведение в оркестраторе, у нас около ста начальных действий 1, но не так много конечных действий 1. И в нашей самой большой базе данных действия 4,5,6 не достигаются как одна ночь за двумя.
Есть ли у вас Ребята, есть какие-либо идеи о том, что происходит? Есть ли у вас какие-то идеи по лучшей архитектуре, использующей функции для выполнения некоторых кодов каждую ночь в базах данных?
Если у вас есть другие вопросы, не стесняйтесь задавать
Большое спасибо