5

最近、クライアント側の JavaScript からサーバーに POST を実行するときに、非常に奇妙な、しかし非常に一貫した遅延が発生しています。

これが私たちの技術スタックです。

  1. カスタム JavaScript クライアント コード
  2. Backbone.js
  3. カスタム Backbone.sync() 実装
  4. jQuery.ajax() (1.7.2)
  5. XmlHttpRequest
  6. ブラウザ (Firefox と Chrome の両方で検証済み)
  7. インターネット
  8. Nginx フロントエンド
  9. イントラネット (Nginxhttp://アップストリーム経由)
  10. Nginx バックエンド
  11. Gunicorn (Nginxunix://アップストリーム ソケット経由)
  12. ジャンゴ1.4
  13. ジャンゴ・テイピー

(補足: Web 開発がいかに複雑であるかに畏敬の念を抱いたことはありますか?)

イベントのタイムラインは次のとおりです。

  1. クライアント コードは.save()、新しく作成された Backbone を呼び出しますAPIModel
  2. カスタムは、新しく作成されたオブジェクトを にディスパッチし.sync()ます。client.send()$.ajax()
  3. 結果の XmlHttpRequest POST。要求は、ブラウザー開発ツールの [ネットワーク] ペインに表示され、pendingとしてマークされます。
  4. HTTP リクエストは Nginx に到達し、django-tastypie バックエンドにルーティングされます。
  5. Tastypie はリクエストを迅速かつ完璧に処理し、リソースを作成して 201 CREATED レスポンスを返しLocationます。ヘッダーは新しいリソースを指しています。
  6. Nginx はリクエストをログに記録し、(表向きは) レスポンスを送信します。
  7. 1.1 分が経過し、その間、ネットワーク ペインで要求は保留中としてマークされたままになります。
  8. 要求は、ブラウザーの [ネットワーク] ペインで完了としてマークされます。
  9. jQueryxhrが成功ハンドラーを起動する
  10. カスタム API クライアントの成功ハンドラーが 201 応答コードを検出し、ロケーションへの後続の GET 要求を開始します。
  11. 通常の処理が行われ、GET が即座に応答し、最も外側の$.Deferred()オブジェクトが解決され、関連するクライアント コードの成功ハンドラーが起動されます。

考慮すべきその他の詳細:

  1. 同じスタック内の GET リクエストと PUT リクエストはすぐに解決されます。
  2. 専用の HTTP クライアントを介して最も外側の Nginx と直接対話する場合、問題のリクエストと同一の POST リクエストが即座に解決されます。
  3. 特殊なケースの 201 ハンドラーとその後の GET を削除しても、バグには影響しません。
  4. 遅延は常に1.1 分です。私はconsole.time()、遅延が 65,000 ミリ秒の範囲内で変動することを確認しました。
  5. 遅延は、この構成でのみ表示されます。少し単純な開発セットアップでは発生しません。

私が行っている未確認の仮定:

  1. Nginx がリクエストをログに記録すると、レスポンスは弓で結ばれ、手書きのお礼状とともにクライアントに送信されます。
  2. これはブラウザや jQuery のバグではありません。

細心の注意を払って申し訳ありませんが、変数を排除するために最善を尽くしました。現在、問題は次のいずれかであると言っても過言ではありません。

  1. 宇宙の物理構造の欠陥
  2. 私たちの心の知覚モデルの欠陥
  3. まだ検討していない他の何か

#3 希望です。何か案は?

4

1 に答える 1

3

謎解き!それはContent-Lengthヘッダー、というか、ヘッダーの欠如でした。@MaxDounin は正しい考えを持っていましたが、私はそれを十分にフォローしていませんでした。

Djangoを有効django.middleware.http.ConditionalGetMiddlewareにするとうまくいきました。(このミドルウェアはContent-Lengthヘッダーを設定します。)

于 2012-10-04T23:20:41.947 に答える