Как программно работать с Триггерами в 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, из которой при помощи триггера функция следующего контура вычитывает событие и выполняет задание. При этом возникает возможность распределить задачи на несколько независимых функций с целью разделения кода, используя несколько очередей со своими триггерами и функциями.

→ Ссылка