2012-04-29 3 views
0

У нас есть два задания cron, которые попадают в два разных динамических бэкэнда, и оба имеют такую ​​же проблему. Я могу дублировать проблему, перейдя по URL-адресам, которые выполняются заданиями cron непосредственно в браузере.AppEngine backends return 503 - Java

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

Error: Server Error 
The service you requested is not available yet. 

Please try again in 30 seconds. 

В журналах, я вижу запрос/_ah/старт (мы не имеем конкретный обработчик для этого) для внутреннего интерфейса с этим сообщением:

This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application. 

Затем я обновил URL-адрес бэкэнд и работал нормально.

Итак, моя теория заключается в том, что работа cron будет работать нормально, если бэкэнд уже загружен. Если это не так, он не ждет достаточно долго, чтобы проверить, будет ли бэкэнд загружаться.

Предполагая, что это правильно, есть ли способ заставить работу cron ждать до завершения/_ah/start?

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

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

ответ

3

У Cron нет функции повтора, которая задана для задачи, поэтому я бы рекомендовал использовать frontend cron, чтобы поставить задачу на очередь задач с динамическим экземпляром бэкэнд. Таким образом, запрос cron будет обрабатываться свободным экземпляром frontend, который более надежен, чем то, что вы делаете сейчас, и выполнение вашей backend-задачи будет повторено в случае сбоя.

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

Для получения более подробной информации о задаче с именем, см: https://developers.google.com/appengine/docs/java/taskqueue/overview#Task_Names

+0

В итоге я сделал то, что вы описали в первом абзаце, и это сработало. Если он начнет действовать, мы поговорим о том, как сделать вызов cron более надежным. –

0

Удобный трюк я использовал для обеспечения бэкенд сети и готов пойти в запланировать ничегонеделания хрон за 30 секунд до Вашего Дела -рабочий крон. Не имеет значения, если запрос no-op завершится неудачно или удастся, он разогревает ваш сервер перед вашим важным cron.

Другое примечание к коду ошибки 503 - Иногда это происходит, если вы обращаетесь к номеру экземпляра бэкэнд, который не существует. Проверьте заголовки задач, чтобы убедиться, что хост-сервер - 0.yourbackend.yourapp.appspot.com или что # - < общий выделенный сервер.

Смежные вопросы