Azure Функции вопросы - PullRequest
1 голос
/ 05 марта 2020

Итак, коллега покинул предприятие, на котором я работаю, и я должен принять участие в некоторых проектах, которые он возглавлял. Один проект основан на 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 не достигаются как одна ночь за двумя.

Есть ли у вас Ребята, есть какие-либо идеи о том, что происходит? Есть ли у вас какие-то идеи по лучшей архитектуре, использующей функции для выполнения некоторых кодов каждую ночь в базах данных?

Если у вас есть другие вопросы, не стесняйтесь задавать

Большое спасибо

1 Ответ

0 голосов
/ 11 марта 2020

Да. Вход в долговременные функции может быть довольно странным. Чтобы процитировать документы Microsoft

Когда функции оркестровки дается больше работы (например, получено ответное сообщение или истекает длительный таймер), оркестратор пробуждается и заново выполняет всю функцию с самого начала, чтобы восстановить локальное состояние. Во время воспроизведения, если код пытается вызвать функцию (или выполнить любую другую асинхронную работу c), Durable Task Framework проверяет историю выполнения текущей оркестровки. Если он обнаруживает, что функция действия уже выполнила и дал результат, он воспроизводит результат этой функции, и код оркестратора продолжает выполняться. Воспроизведение продолжается до тех пор, пока код функции не будет завершен или пока не запланирована новая асинхронная c работа.

Такое поведение «воспроизведения» имеет некоторые последствия для ведения журнала. В частности, если функция оркестратора отправляет сообщения журнала, поведение при воспроизведении может привести к отправке дублированных сообщений журнала. Дайте этот пример регистрации долговременных функций .

Вполне возможно, что вы видите повторяющиеся сообщения журнала из-за этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...