Планирование задач cron
Интерфейс Deno.cron позволяет настроить JavaScript или TypeScript код, который выполняется по настраиваемому расписанию с использованием синтаксиса cron. В примере ниже мы настраиваем блок JavaScript кода, который будет выполняться каждую минуту.
Deno.cron("Log a message", "* * * * *", () => {
console.log("This will print once a minute.");
});
Также можно использовать JavaScript объекты для определения расписания cron. В примере ниже мы настраиваем блок JavaScript кода, который будет выполняться один раз в час.
Deno.cron("Log a message", { hour: { every: 1 } }, () => {
console.log("This will print once an hour.");
});
Deno.cron принимает три аргумента:
- Читаемое человеком имя задачи cron
- Строку расписания cron или JavaScript объект, определяющий расписание, по которому будет выполняться задача cron
- Функцию, которая будет выполняться по заданному расписанию
Если вы новичок в синтаксисе cron, есть ряд модулей сторонних разработчиков таких как этот, которые помогут вам сгенерировать строки расписания cron.
Повторное выполнение неудачных запусков
Неудачные вызовы cron автоматически повторяются с политикой повторных попыток по умолчанию. Если вы хотите указать пользовательскую политику повторных попыток, вы можете использовать свойство backoffSchedule для указания массива времен ожидания (в миллисекундах), чтобы подождать перед повторной попыткой вызова функции. В следующем примере мы будем пытаться повторить неудачные обратные вызовы трижды — через одну секунду, пять секунд и затем десять секунд.
Deno.cron("Retry example", "* * * * *", () => {
throw new Error("Deno.cron will retry this three times, to no avail!");
}, {
backoffSchedule: [1000, 5000, 10000],
});
Архитектура и ограничения
Ниже приведены некоторые детали архитектуры и ограничения, о которых следует знать при использовании Deno.cron.
Задачи должны быть определены на уровне верхнего уровня модуля
Интерфейс Deno.cron разработан для поддержки статического определения задач cron на основе предварительно определенных расписаний. Все Deno.cron задачи должны быть определены на верхнем уровне модуля. Любые вложенные Deno.cron определения (например, внутри обработчика Deno.serve) приведут к ошибке или будут проигнорированы.
Если вам необходимо динамически планировать задачи во время выполнения вашей программы Deno, вы можете использовать API очередей Deno.
Часовой пояс
Расписания Deno.cron задаются с использованием часового пояса UTC. Это помогает избежать проблем с часовыми поясами, которые соблюдают летнее время.
Перекрывающиеся выполнения
Возможно перекрытие следующего запланированного вызова вашей задачи cron с предыдущим вызовом. Если это происходит, Deno.cron пропустит следующий запланированный вызов, чтобы избежать перекрывающихся выполнений.
Числовое представление дня недели
Deno.cron не использует числовое представление дня недели с основанием 0. Вместо этого используется 1-7 (или SUN-SAT) для представления воскресенья по субботу. Это может отличаться от других cron движков, использующих представление 0-6.
Использование на Deno Deploy
С помощью Deno Deploy вы можете запускать фоновые задачи на изолятах V8 в облаке. При этом следует учитывать несколько моментов.
Отличия от Deno CLI
Как и другие встроенные компоненты Deno runtime (такие как очереди и Deno KV), реализация Deno.cron работает несколько иначе на Deno Deploy.
Как cron работает по умолчанию
Реализация Deno.cron в Deno runtime сохраняет состояние выполнения в памяти. Если вы запускаете несколько программ Deno, которые используют Deno.cron, каждая программа будет иметь свой независимый набор задач cron.
Как cron работает на Deno Deploy
Deno Deploy предоставляет серверless реализацию Deno.cron, которая разработана для высокой доступности и масштабируемости. Deno Deploy автоматически извлекает ваши определения Deno.cron во время развертывания и планирует их выполнение с использованием изолятов по требованию. Ваше последнее производственное развертывание определяет набор активных задач cron, которые запланированы для выполнения. Чтобы добавить, удалить или изменить задачи cron, просто измените код и создайте новое производственное развертывание.
Deno Deploy гарантирует, что ваши задачи cron будут выполняться как минимум один раз за каждый интервал запланированного времени. Это, как правило, означает, что ваш обработчик cron будет вызываться один раз за запланированное время. В некоторых сценариях ошибок обработчик может быть вызван несколько раз для одного и того же запланированного времени.
Панель мониторинга cron
Когда вы выполняете производственное развертывание, содержащее задачу cron, вы можете просмотреть список всех ваших задач cron в панели мониторинга Deploy на вкладке Cron для вашего проекта.
Ценообразование
Вызовы Deno.cron взимаются по той же ставке, что и входящие HTTP-запросы к вашим развертываниям. Узнайте больше о ценообразовании здесь.
Ограничения, связанные с Deploy
Deno.cronдоступен только для производственных развертываний (не для предварительных развертываний)- Точное время вызова вашего обработчика
Deno.cronможет отличаться на одну минуту от запланированного времени
Примеры конфигурации cron
Вот несколько распространенных конфигураций cron, предоставленных для вашего удобства.
Deno.cron("Run once a minute", "* * * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every fifteen minutes", "*/15 * * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run once an hour, on the hour", "0 * * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every three hours", "0 */3 * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every day at 1am", "0 1 * * *", () => {
console.log("Hello, cron!");
});
Deno.cron("Run every Wednesday at midnight", "0 0 * * WED", () => {
console.log("Hello, cron!");
});
Deno.cron("Run on the first of the month at midnight", "0 0 1 * *", () => {
console.log("Hello, cron!");
});
© 2018–2024 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/deploy/kv/manual/cron