Как программно работать с Триггерами в Yandex Cloud Functions
Пишу yandex-cloud-функцию на Python.
Она реализует планировщик задач пользователей. Т.е. должна уметь запускать себя через разные промежутки времени по расписанию, задаваемому пользователями и часто меняющемуся (сдвигаются сроки выполнения, добавляются и отменяются задачи и т.п.).
Cloud-функция в Yandex имеет короткий срок жизни, и поэтому не может сама ожидать наступления нужного времени. Для этого, как я понимаю, она должна уметь создавать и настраивать Триггеры (таймеры).
И вот здесь я уткнулся в стену: как программно создавать, изменять и удалять эти таймеры.
Вроде существует Yandex Cloud Python SDK, который, подозреваю, как раз и создан для этого. Но ни документации по нему, ни примеров работы с триггерами на Python там нет.
Каким образом реализовать такой планировщик?
Или где найти доки и соответствующие примеры для Yandex Cloud Python SDK?
Ответы (1 шт):
Управлять логикой через изменение/пересоздание триггеров не лучшая идея. На это есть как минимум 1 причина, после создания триггер начинает полноценно работать через несколько минут, в среднем 5 (https://cloud.yandex.ru/docs/functions/concepts/trigger/).
Как ещё вариант, это использование отложенных сообщений в YQM (https://cloud.yandex.ru/docs/message-queue/concepts/delay-queues). На такую очередь можно поставить триггер и отложить событие на +15 минут.
Лучшим решением выглядит создание триггера с таймером на 1 минуту, который будет вызывать функцию, проверяющую необходимость выполнения действия. При этом сохранение стейта расписания стоит вынести за рамки функций, как пример в serverless ydb. В зависимости от сложности логики событий, объема работ выполняемых внутри события, возможно, имеет место разделение на два контура. Первый контур проверяет расписание и определяет необходимость выполнения действия и, при возникновении события, отправляет сообщение в YMQ, из которой при помощи триггера функция следующего контура вычитывает событие и выполняет задание. При этом возникает возможность распределить задачи на несколько независимых функций с целью разделения кода, используя несколько очередей со своими триггерами и функциями.