Существует ли облачный сервис, который надежно планировал выполнение задания в точное время?

Я писал сервер с бессерверной моделью, в настоящее время aws lambda. И у вас есть требование запускать работу в точное время

В настоящее время я выполняю задание cron с aws cloudwatch, чтобы запускать мой сервер каждую минуту, находить все задачи, у которых временная метка старше текущей, а затем выполнять эти задачи. Это расточительно и иногда приводит к задержке или опережает на одну минуту от фактического времени, которое ему нужно (потому что максимальная частота cloudwatch составляет всего один пинг в минуту). Нежелательный подход

И работа не одинаковая каждый день. Клиент может использовать динамическую дату и время для проверки связи с моим сервером.

Я бы хотел, чтобы была какая-то служба, которая похожа на очередь сообщений, но может активно вызывать целевой URL-адрес при планировании временной метки. Есть ли что-то подобное? Это может быть любой сервис за пределами aws, если он может указать URL-адрес для запроса.

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


person Thaina    schedule 30.09.2017    source источник


Ответы (6)


Рассматривали ли вы возможность получить небольшой экземпляр EC2, а затем настроить там задания cron? Затем он может публиковать события в SNS или напрямую вызывать необходимые задачи. Кроме того, вы должны иметь возможность динамически планировать новые задания.

person Tofig Hasanov    schedule 30.09.2017
comment
Привет @TofigHasanov. Если это задание по расписанию, не будет ли более экономичным и удобным использовать запланированное событие Lambda для выполнения задания Cron, чем использование EC2? - person Ashan; 30.09.2017
comment
Кстати, спасибо за указание на проблему TTL. Я удалил ответ, связанный с TTL. - person Ashan; 30.09.2017
comment
Ну да, это был последний вариант, который я бы сделал. потому что я простой программист, поэтому я не хочу самостоятельно поддерживать работающий сервер. Я бы хотел, чтобы такие вещи мог сделать какой-нибудь сервис, который был бы более надежным, чем написание ec2 с нуля. Хотя спасибо за совет - person Thaina; 30.09.2017

Вы можете использовать DynamoDB с TTL, DynamoDB Streams и AWS Lambda. для этого.

Так как расписание является динамическим и исходит от пользователя, вы можете сохранить эти элементы в таблице DynamoDB с установленным TTL равным запланированному времени выполнения.

Когда для элемента будет достигнуто значение TTL, будет создан поток DynamoDB, который затем можно использовать для запуска функции Lambda.

Рекомендации:

person Noel Llevares    schedule 03.10.2017
comment
Мне нравится эта идея. Потоки Dynamodb проверяются 4 раза в секунду, так что это кажется приемлемой задержкой по сравнению с опросом. - person Trent Bartlem; 04.10.2017
comment
@TrentBartlem Откуда у тебя эта информация? - person Noel Llevares; 04.10.2017
comment
docs.aws.amazon.com/lambda/latest/dg/ with-ddb.html — модель на основе потоков. Это модель (см. «Сопоставление источников событий»), в которой AWS Lambda опрашивает поток 4 раза в секунду и при обнаружении новых записей вызывает вашу Lambda, передавая обновить событие как параметр. - person Trent Bartlem; 04.10.2017
comment
Это кажется многообещающим. я бы попробовала поэкспериментировать - person Thaina; 04.10.2017
comment
Имейте в виду, что AWS не гарантирует точное время истечения TTL. Элемент может быть удален в течение 48 часов после истечения срока его жизни< /а>. - person Benjamin Manns; 26.03.2019

В качестве обходного пути, почему бы не активировать лямбда-пробуждение при оповещении Cloudwatch, а затем проверять наличие задач каждые 5 секунд, пока не истечет 55 секунд?

person Trent Bartlem    schedule 01.10.2017
comment
Второй из последних вариантов, потому что я не хочу тратить время на вычисление лямбда. Это будет стоить мне больше, чем EC2 - person Thaina; 02.10.2017
comment
Затем уменьшите объем оперативной памяти этого экземпляра до минимально возможного значения. При необходимости вы можете переложить фактическую обработку задач на другую лямбду с помощью SNS. - person Trent Bartlem; 02.10.2017
comment
@Thaina Lambda на самом деле дешевле в твоем дешевом футляре. Наверное бесплатно. - person Noel Llevares; 26.03.2019

Вероятно, вы уже нашли решение этой проблемы, но мой сервис https://posthook.io может подойти для вашего случая использования. . Он позволяет планировать «хуки» с помощью вызова API следующим образом:

curl https://api.posthook.io/v1/hooks \
-H 'X-API-Key: ${POSTHOOK_API_KEY}' \
-H 'Content-Type: application/json' \
-d '{
    "path": "/webhooks/ph/event_reminder",
    "postAt": "2018-07-03T01:11:55Z",
    "data": {
        "eventID": 25
    }
}'

Затем из вашей функции lamdba вы можете либо использовать данные, которые вы передали как data, либо уникальный идентификатор hook, чтобы найти что-то в своей базе данных и выполнить необходимую работу. Бесплатная учетная запись позволяет планировать 500 таких запросов в месяц.

person Carlos Gomez    schedule 29.05.2018

Другие решения кажутся многообещающими, но я нашел еще одно решение

использование пошаговых функций состояния ожидания

http://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-wait-state.html

Я пока не могу использовать его в своем регионе, потому что мой регион — Сингапур, и его нельзя использовать в другом регионе. В настоящее время я бы попытался увидеть решение Dynamodb выше

По состоянию на 2018 год ступенчатая функция была общедоступна и работала должным образом.

person Thaina    schedule 04.10.2017

По состоянию на 2018 год существовали Azure Logic Apps. Служба, эквивалентная функции шага aws в Azure. Он содержит коннектор задержки, который может планировать время задержки

https://docs.microsoft.com/en-us/azure/connectors/connectors-native-delay

person Thaina    schedule 31.05.2018