Ошибка таймаута App Engine: обслуживание стороннего API с изображением, сохраненным в App Engine - PullRequest
1 голос
/ 16 июня 2011

Я создаю приложение на Python на App Engine. Мое приложение получает изображения в виде вложений электронной почты . Когда приходит электронное письмо, я беру изображение и должен отправить его стороннему API.

Первое, что я сделал, было:
1) сделать POST-запрос к стороннему API с данными изображения

Я остановил этот метод, потому что у меня были довольно серьезные проблемы с кодировкой с urllib2 и MultipartPostHandler.

Второе, что я сейчас делаю, это
1) Поместите изображение во входящее письмо в Datastore
2) Поместите его в memcache
3) Отправьте в API URL-адрес , который обслуживает изображение (с использованием memcache или, если не найдено в memcache, хранилища данных)

Проблема, которую я прочитал в своих журналах: DeadlineExceededError: ApplicationError: 5

Точнее, я вижу два запроса в своих журналах:
- во-первых, входящее письмо
- затем сторонний HTTP-вызов API для моего изображения по URL, который я ему дал

Входящая электронная почта заканчивается DeadlineExceededError. Сторонний вызов API для моего приложения завершается нормально, корректно обрабатывая изображение.

Моя интерпретация:
Похоже, что App Engine ожидает ответа от стороннего API, затем закрывается из-за истечения времени ожидания и затем обрабатывает запрос, сделанный сторонним API для изображения. К сожалению, поскольку соединение закрыто, я не могу получить полезную информацию, предоставленную сторонним API, после получения моего изображения.

Мои вопросы:
1) Может ли App Engine обрабатывать запрос от хоста, на который он рассчитывает получить ответ?
2) Если нет, как я могу обойти эту проблему?

1 Ответ

1 голос
/ 16 июня 2011

Если вы напрямую используете API Appfel URLfetch, вы можете настроить время ожидания для вашего запроса.Значение по умолчанию составляет 5 секунд, и его можно увеличить до 10 секунд для обычных обработчиков или до 10 минут для выборок в задачах очереди задач или заданиях cron.

Если внешнему API потребуется более 10 секундчтобы ответить, вероятно, лучше всего было бы, чтобы ваш обработчик электронной почты запускал задачу, которая вызывает API с очень большим тайм-аутом (хотя почти наверняка было бы лучше исправить ваши «довольно серьезные проблемы с кодированием»; насколько плохо может кодироватьбинарными данными в POST быть?)

Чтобы ответить на ваш первый вопрос: если вы используете dev_appserver, нет, вы вообще не можете обрабатывать какие-либо запросы, пока вы ожидаете внешнего запроса;dev_appserver является однопоточным и обрабатывает 1 запрос за раз.Производственная среда должна иметь возможность масштабироваться для этого;однако, если у вас есть обработчики, которые ждут urlfetch в течение 10 секунд, планировщик может плохо масштабировать ваше приложение, поскольку задержка входящих запросов является одним из факторов автоматического масштабирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...