GAE — выполнение множества мелких задач через фиксированное время

Я хотел бы создать приложение Google App Engine, которое отправляет сообщение Facebook пользователю в фиксированное время (например, через день) после того, как он нажмет кнопку в приложении. Масштабирование с использованием cron или очередь задач для потенциально миллионов крошечных заданий. Я также рассматривал возможность реализации собственной очереди с помощью фонового потока, но насколько я знаю, это доступно только с использованием Backends API, который разработан для гораздо более широкого использования и не является бесплатным.

Существует ли масштабируемый способ для бесплатного приложения Google App Engine выполнять большое количество небольших задач через фиксированный период времени?


person 1''    schedule 25.06.2013    source источник


Ответы (1)


Для начала, если вы хотите выполнять миллионы крошечных работ, вы очень быстро преодолеете бесплатную квоту, как бы вы на это ни смотрели. Бесплатная квота предназначена для тестирования.

Это зависит от степени детализации ваших задач. Если вы выполняете много задач один раз в день, cron, подключенный к операции mapreduce (которая, по сути, отправляет кучу задач в очереди задач), работает нормально. Вы в основном выдаете запрос к хранилищу данных, чтобы найти задачи, которые необходимо выполнить, и отправляете их на mapreduce.

Если вы выполняете эту задачу тысячи раз в день (каждую минуту), она может стать дорогостоящей, поскольку вы выполняете много запросов. Обратите внимание, что даже если большинство этих запросов ничего не возвращает, стоимость по-прежнему минимальна.

Другой вариант — хранить ваши задачи в памяти, а не в хранилище данных, где вы хотели бы начать использовать серверные части. Но бэкенды дороги в обслуживании. Попробуйте использовать Google Compute Engine, который дает гораздо более дешевые виртуальные машины.

РЕДАКТИРОВАТЬ:

Если вы пойдете по маршруту cron/datastore, вы будете сохранять новую сущность всякий раз, когда пользователь хочет отправить отложенное сообщение. Самое главное, у него будет запрашиваемая временная метка, когда сообщение должно быть отправлено, возможно, округленное до ближайшей минуты или до ближайших 5 минут, независимо от того, какой вы решите, что ваша детализация должна быть.

Тогда у вас будет задание cron, которое запускается с заданным интервалом, скажем, каждую минуту. При каждом запуске он будет создавать запрос для всех заданий cron, которые необходимо отправить в данную минуту.

Если вам действительно нужно отправлять сотни тысяч сообщений каждую минуту, вам не захочется делать это из задачи cron. Вы бы хотели, чтобы задача cron порождала задание mapreduce, которое будет разветвлять запрос и порождать задачи для отправки ваших сообщений.

person dragonx    schedule 25.06.2013
comment
Хороший ответ, спасибо! Модель, на которую я смотрю, заключается в том, что задачи поступают непрерывно и обрабатываются непрерывно (с однодневной задержкой), поэтому я предполагаю, что решение cron + mapreduce не сработает? - person 1''; 26.06.2013
comment
Зависит от вашей детализации. Если вы согласны ходить каждые 5 минут, это будет всего 288 звонков в день, что неплохо. Каждую минуту будет 1440. Я бы не стал делать что-то вроде задачи cron в секунду ... в этот момент задачи легко начнутся до завершения предыдущей. - person dragonx; 26.06.2013
comment
Разве это не приводит к той же проблеме, что и раньше? Вместо того, чтобы выяснять, как ставить задачи в очередь на день, теперь вам нужно ставить их в очередь на 5 минут. - person 1''; 26.06.2013
comment
Если вы согласны с отправкой сообщений с интервалом в 5 минут, это сработает. ЕСЛИ вам нужна точность до секунды, то вы, вероятно, захотите использовать сервер на Compute Engine. - person dragonx; 26.06.2013
comment
Я имею в виду, что GAE дает вам возможность отвечать только на запросы, так как же вы можете хранить сообщения в течение 5 минут, необходимых для запуска следующей задачи cron, не используя что-то глупое, например time.sleep? - person 1''; 26.06.2013