google app engine - рекомендации по проектированию задач cron

StackOverflow https://stackoverflow.com/questions/814896

Вопрос

Я занимаюсь разработкой программного обеспечения с использованием механизма приложений Google.

У меня есть некоторые соображения по поводу оптимального дизайна в отношении следующей проблемы: мне нужно создавать и сохранять снимки некоторых объектов через равные промежутки времени.

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

например, задание будет вставлять запись для каждого активного пользователя, которая будет содержать его текущий счет в "userrank" стол, скажем, каждый час.

Я хотел бы знать, каков наилучший способ добиться этого в Google App Engine. Я знаю, что есть сервис Cron, но позволяет ли он нам выполнять задания, которые будут вставлять / обновлять тысячи записей?

Это было полезно?

Решение

Рассматривали ли вы вместо этого использование удаленного API ? Таким образом, вы можете получить оболочку для вашего хранилища данных и избежать таймаутов. Класс Mapper, который они демонстрируют в этой ссылке, весьма полезен, и я успешно использовал его для выполнения пакетных операций над ~ 1500 объектами.

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

Другие советы

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

Мое предложение будет следующим: добавьте поле 'last snapshot' и создайте подкласс для функции put () вашей модели (при условии, что вы используете Python; то же самое возможно в Java, но я не знаю синтаксис ), так что при каждом обновлении записи он проверяет, прошло ли больше часа с момента последнего снимка, и, если да, создает и записывает запись снимка.

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

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

Я хотел бы использовать комбинацию заданий Cron и метод циклического извлечения URL, подробно описанный здесь: http: // stage.vambenepe.com/archives/549 . Таким образом, вы можете перехватить таймауты и начать другой запрос.

Чтобы подвести итог статьи, задание cron вызывает ваш начальный процесс, вы ловите ошибку тайм-аута и снова вызываете процесс, маскируемый как второй URL. Вы должны пропинговать между двумя URL-адресами, чтобы двигатель приложения не думал, что вы попали в случайный цикл. Вы также должны быть осторожны, чтобы не зацикливаться бесконечно. Убедитесь, что в цикле обновления есть конечное состояние, так как это очень быстро поместит вас в ваши квоты, если оно никогда не закончится.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top