4

Google App Engine の urlfetch 機能を使用して、別の Web サービスにリモートでログインしています。開発ではすべて正常に動作しますが、本番環境に移行するとログイン手順が失敗します。プロダクション URL フェッチをデバッグする方法について何か提案はありますか?

URL フェッチで Cookie やその他のヘッダーを使用しています (ヘッダー内に手動で Cookie を設定しています)。Cookie の 1 つはセッション Cookie です。

エラーや例外はありません。実稼働環境では、URL コマンドにログインを送信するとセッション Cookie が返されますが、セッション Cookie を使用してページを要求すると、それらは無視され、ログイン情報の入力を再度求められます。開発時にセッション 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
    )

問題に関するいくつかの推測は次のとおりです。

  • Google の url fetch 実装の分散型の性質により、問題が発生しています。
  • 本番環境では、開発環境とは異なる順序でヘッダーが送信され、サーバーが混乱する可能性があります。
  • Google のサーバーの一部は、ターゲット サーバーによってブラックリストに登録されています。

以下は、私が除外したいくつかの仮説です。

  • Google キャッシングは積極的すぎます。しかし、ヘッダー Cache-Control: no-store を使用してキャッシュをオフにした後も問題が発生します。
  • Google の urlfetch はターゲット サーバーに対して速すぎます。しかし、呼び出しの間に遅延を挿入した後も問題が発生します。
  • Google は User-Agent ヘッダーにいくつかのデータを追加します。しかし、そのヘッダーを開発に追加しましたが、問題は発生しません。

本番用 URL フェッチと開発用 URL フェッチには他にどのような違いがありますか? これをデバッグするためのアイデアはありますか?

更新 2

(最初の更新は上記に組み込まれています)それが私が行ったものかどうかはわかりません(おそらく上記の遅延の追加またはキャッシュの無効化)が、現在、本番環境は約50%の時間で動作します. これは間違いなく競合状態のように見えます。残念ながら、問題が自分のコードにあるのか、Google のコードにあるのか、ターゲット サーバーのコードにあるのかはわかりません。

4

3 に答える 3

2

他の人が述べたように、dev と prod の主な違いは、元の IP と、一部の要求ヘッダーの処理方法です。制限付きヘッダーのリストについては、こちらを参照してください。これが文書化されているかどうかはわかりませんが、本番環境では、アプリ ID がユーザー エージェントの末尾に追加されます。アプリ ID に文字列「bot」が含まれていたため、prod のリクエストのみが検索エンジン スパイダーとして検出されるという問題がありました。

セッション Cookie を含め、手動で Cookie を設定しているとのことでした。これは、Dev でセッションを確立し、それを本番環境で再利用しようとしているということですか? リモート サーバーがセッションを確立する送信元 IP をログに記録し、後続の要求が同じ IP から送信されることを要求する可能性はありますか?

うまくいかないと言いましたが、例外は発生しません。これは正確にはどういう意味ですか?HTTP 200 と空の応答本文を取得しますか? 別の HTTP ステータス?最善の策は、リモート サービスの所有者に連絡して、リクエストの何が問題だったのかをより具体的に教えてくれるかどうかを確認することです。それ以外はただの憶測です。

于 2011-11-28T15:58:03.820 に答える
1

サーバーのログをチェックして、GAE がヘッダーを切り落としているかどうかを確認します。GAE (開発サーバーで見たことがあると思います) は、気に入らないヘッダーを切り落とすことに気付きました。

呼び出している Web サービスによっては、ローカル マシンよりも GAE からの呼び出しの方がうまくいかない場合もあります。

于 2011-11-28T04:11:05.410 に答える
1

類似の問題で webapp を作成しているときにこの問題に遭遇しました。urlfetch のドキュメントを見ると、フェッチ呼び出しの最大タイムアウトは 60 秒ですが、デフォルトは 5 秒です。

ローカル マシンで 5 秒あれば、ローカル マシンで URL を要求するのに十分な長さでしたが、GAE では、約 20% の確率で一貫して 5 秒でタスクを完了していました。

パラメータを含めましたがdeadline=60、それ以来正常に機能しています。

これが他の人に役立つことを願っています!

于 2012-10-04T01:18:33.833 に答える