Google App Engine URL Fetch не работает на производстве - PullRequest
4 голосов
/ 27 ноября 2011

Я использую функцию urlfetch движка приложения Google для удаленного входа в другой веб-сервис. На разработке все работает нормально, но когда я перехожу на работу, процедура входа не проходит. Есть ли у вас какие-либо предложения о том, как отладить производственную выборку URL?

Я использую файлы cookie и другие заголовки в своей выборке URL (я вручную настраивал файлы cookie в заголовке). Один из файлов cookie является файлом cookie сеанса.

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

Вот как я это называю:

fetchresp = urlfetch.fetch(url=req.get_full_url(),
    payload=req.get_data(),
    method=method,
    headers=all_headers,
    allow_truncated=False,
    follow_redirects=False,
    deadline=10
    )

Вот некоторые предположения относительно проблемы:

  • Распределенная природа реализации извлечения URL-адресов в Google приводит к путанице.
  • На производстве заголовки отправляются в другом порядке, чем в разработке, что может сбить с толку сервер.
  • Некоторые серверы Google включены в черный список целевым сервером.

Вот некоторая гипотеза, которую я исключил:

  • Кэширование в Google слишком агрессивно. Но я все еще получаю проблему после отключения кеша с помощью заголовка Cache-Control: no-store.
  • Google urlfetch слишком быстр для целевого сервера. Но я все еще получаю проблему после вставки задержек между вызовами.
  • Google добавляет некоторые данные в заголовок User-Agent. Но я добавил этот заголовок в разработку, и у меня не возникает проблемы.

Какие еще различия существуют между производственной выборкой URL-адреса и выборкой URL-адреса разработки? У вас есть идеи для отладки этого?

ОБНОВЛЕНИЕ 2

(первое обновление было включено выше) Я не знаю, было ли это чем-то, что я делал (возможно, добавлял задержки или отключал кэши, упомянутые выше), но теперь производственная среда работает примерно в 50% случаев. Это определенно похоже на состояние гонки. К сожалению, я понятия не имею, кроется ли проблема в моем коде, коде Google или коде целевого сервера.

Ответы [ 3 ]

2 голосов
/ 28 ноября 2011

Как уже упоминалось, ключевые различия между dev и prod - это исходный IP-адрес и то, как обрабатываются некоторые заголовки запроса.Смотрите здесь для списка ограниченных заголовков.Я не знаю, задокументировано ли это, но в prod идентификатор вашего приложения добавляется в конец вашего пользовательского агента.Однажды у меня возникла проблема, когда запросы в prod обнаруживались как паук поисковой системы, потому что мой идентификатор приложения содержал строку «bot».

Вы упомянули, что вы настраиваете cookie вручную, включая cookie сессии,Означает ли это, что вы создали сессию в Dev, а затем пытаетесь повторно использовать ее в prod?Возможно ли, что удаленный сервер регистрирует исходный IP-адрес, который устанавливает сеанс, и требует, чтобы последующие запросы приходили с того же IP-адреса?

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

1 голос
/ 04 октября 2012

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

5 секунд на моем локальном компьютере было достаточно для запроса URL-адресов на моем локальном компьютере, но в GAE он только последовательно выполнял свою задачу за 5 секунд, примерно в 20% случаев.

Я включил параметр deadline=60, и с тех пор он работает нормально.

Надеюсь, это поможет другим!

1 голос
/ 28 ноября 2011

Проверьте журналы вашего сервера, чтобы увидеть, удаляет ли GAE какие-либо заголовки. Я заметил, что GAE (мне кажется, я видел его на сервере dev) отрубит заголовки, которые ему не нравятся.

В зависимости от веб-службы, с которой вы звоните, GAE может вызывать не так хорошо, как ваш локальный компьютер.

...