最近、クライアント側の JavaScript からサーバーに POST を実行するときに、非常に奇妙な、しかし非常に一貫した遅延が発生しています。
これが私たちの技術スタックです。
- カスタム JavaScript クライアント コード
- Backbone.js
- カスタム Backbone.sync() 実装
- jQuery.ajax() (1.7.2)
- XmlHttpRequest
- ブラウザ (Firefox と Chrome の両方で検証済み)
- インターネット
- Nginx フロントエンド
- イントラネット (Nginx
http://
アップストリーム経由) - Nginx バックエンド
- Gunicorn (Nginx
unix://
アップストリーム ソケット経由) - ジャンゴ1.4
- ジャンゴ・テイピー
(補足: Web 開発がいかに複雑であるかに畏敬の念を抱いたことはありますか?)
イベントのタイムラインは次のとおりです。
- クライアント コードは
.save()
、新しく作成された Backbone を呼び出しますAPIModel
。 - カスタムは、新しく作成されたオブジェクトを にディスパッチし
.sync()
ます。client.send()
$.ajax()
- 結果の XmlHttpRequest POST。要求は、ブラウザー開発ツールの [ネットワーク] ペインに表示され、pendingとしてマークされます。
- HTTP リクエストは Nginx に到達し、django-tastypie バックエンドにルーティングされます。
- Tastypie はリクエストを迅速かつ完璧に処理し、リソースを作成して 201 CREATED レスポンスを返し
Location
ます。ヘッダーは新しいリソースを指しています。 - Nginx はリクエストをログに記録し、(表向きは) レスポンスを送信します。
- 1.1 分が経過し、その間、ネットワーク ペインで要求は保留中としてマークされたままになります。
- 要求は、ブラウザーの [ネットワーク] ペインで完了としてマークされます。
- jQuery
xhr
が成功ハンドラーを起動する - カスタム API クライアントの成功ハンドラーが 201 応答コードを検出し、ロケーションへの後続の GET 要求を開始します。
- 通常の処理が行われ、GET が即座に応答し、最も外側の
$.Deferred()
オブジェクトが解決され、関連するクライアント コードの成功ハンドラーが起動されます。
考慮すべきその他の詳細:
- 同じスタック内の GET リクエストと PUT リクエストはすぐに解決されます。
- 専用の HTTP クライアントを介して最も外側の Nginx と直接対話する場合、問題のリクエストと同一の POST リクエストが即座に解決されます。
- 特殊なケースの 201 ハンドラーとその後の GET を削除しても、バグには影響しません。
- 遅延は常に1.1 分です。私は
console.time()
、遅延が 65,000 ミリ秒の範囲内で変動することを確認しました。 - 遅延は、この構成でのみ表示されます。少し単純な開発セットアップでは発生しません。
私が行っている未確認の仮定:
- Nginx がリクエストをログに記録すると、レスポンスは弓で結ばれ、手書きのお礼状とともにクライアントに送信されます。
- これはブラウザや jQuery のバグではありません。
細心の注意を払って申し訳ありませんが、変数を排除するために最善を尽くしました。現在、問題は次のいずれかであると言っても過言ではありません。
- 宇宙の物理構造の欠陥
- 私たちの心の知覚モデルの欠陥
- まだ検討していない他の何か
#3 希望です。何か案は?