GWT/GAE アプリを設計する際に、クライアント側 (GWT) が 3 種類の要求を生成することが明らかになりました。
- Synchronous - 「今すぐ応答してください! 私は重要な人物であり、リアルタイムの応答が必要です!!!」
- 非同期- 「できるときに答えてください。ある時点で答えを知る必要がありますが、実際にはそれほど緊急ではありません。」
- コマンド- 「答えは必要ありません。これは実際には要求ではありません。サーバー側で何かを実行または処理するための単なるコマンドです。」
私のゲームプランは、GWT コードを実装して、特定のサーバー側の要求ごとに指定できるようにすることです (注:RequestFactory
この質問の範囲外の理由で、従来の GWT-RPCを使用することにしました)。リクエスト:
SynchronousRequest
- 同期 (上から); コマンドを送信し、何らかの方法でクライアントの状態を更新するために使用する応答を熱心に待ちますAsynchronousRequest
- 非同期 (上から); 最初のリクエストを作成し、ポーリングまたは GAE Channel API のいずれかを介して、レスポンスが最終的に受信されたときに通知されますCommandRequest
- コマンド (上から); サーバー側の要求を作成し、応答を待ちません (サーバーがコマンドの実行に失敗したり拒否したりしても)
私の意図SynchronousRequest
は、完全にブロックするリクエストを生成することではないと思いますが、ユーザーWidget
が画面の特定または一部と対話する機能をブロックする可能性があります。
ここで追加されたキッカーは次のとおりです。GAE は、すべてのフロントエンド インスタンスにタイムアウトを強く適用します (60 秒)。バックエンド インスタンスでは、タイムアウトやスレッド化などの制約がはるかに緩和されています。そのため、GAE タイムアウトが問題にならないようにバックエンド インスタンスにルーティングする必要があることは明らかAsynchronousRequests
ですCommandRequests
。
ただし、GAE の動作が悪い場合、またはトラフィックがピークに達している場合、またはコードが単純にうまくいかない場合は、aSynchronousRequest
が作成されるシナリオを説明する必要があります (タイムアウトによって調整されたフロントエンド インスタンスを通過する必要があります)。私のGAEサーバーコードが何か特別なことをしない限り、タイムアウトします。GAE API には、リクエストがタイムアウトするまでのミリ秒数を確認するために呼び出すことができるメソッドがあることを知っています。しかし、その名前は今のところわかりませんが、この「派手な」コードの基になっているものです。public static long GAE.timeLeftOnRequestInMillis()
この質問のためにそれを呼び出しましょう。
このシナリオでは、 aSynchronousRequest
がタイムアウトしようとしていることを検出し、何らかの方法で動的に a に変換して、タイムアウトにならないようにしたいと考えAsynchronousRequest
ています。おそらく、これは をAboutToTimeoutResponse
クライアントに送り返すことを意味し、クライアントに として再送信するAsynchronousRequest
か、単に失敗するかを決定させることになります。あるいは、 を に変換して、バックエンド インスタンスがそれを消費し、処理して応答を返すキューにプッシュすることもできSynchronousRequest
ますAsynchronousRequest
。実装に関しては、サーバーが十分に速く処理できなかったためにリクエストが失敗したりタイムアウトしたりしない限り、好みはありません(GAEが課す規制のため)。
それでは、ここで私が実際に求めているのは次のとおりです。
- 内で
RequestFactory
呼び出しをラップするにはどうすればよいですか? また、呼び出しがそれぞれの意図どおりに動作するようにするにはどうすればよいですか? 言い換えれば、呼び出しが部分的にブロックされる (同期) か、途中で通知/更新される (非同期) か、単に起動して忘れられる (コマンド) か?SynchronousRequest
AsynchronousRequest
CommandRequest
RequestFactory
SynchronousRequest
GAE の 60 秒のタイムアウトをバイパスし、失敗することなく処理できるようにする要件を実装するにはどうすればよいですか?
注意: タイムアウトの問題は、バックエンド インスタンスに再ルーティングすることで簡単に回避できますが、バックエンドはスケーリングできません。ここでもスケーラビリティが必要です (それが、そもそも GAE を使用している主な理由です!) - そのため、スケーラブルなフロントエンド インスタンスとそのタイムアウトを処理するソリューションが必要です。前もって感謝します!