質問
現在 Web サービスに取り組んでおり、返される結果が非常に大きくなる可能性があります (> 5MB)。
このデータセットがこれほど大きくなるのは完全に妥当であり、Web サービスを同期または非同期と呼ぶことができますが、次の点について人々はどう考えているのか気になります。
接続が失われた場合、結果セット全体を再生して再度送信する必要があります。接続が失われたりリセットされたりした場合、「再開」を行う方法はありますか?
これほど大きな結果セットを送信することは適切でしょうか?結果セットが生成されてサーバーに保存され、クライアントが結果セットのチャンクを少量ずつダウンロードして、最後にセットを再組み立てできる、ある種の「ページング」を実装する方がよいでしょうか?
解決
3つのアプローチすべてを見てきましたが、 ページングされた, 保存して取得する, 、 そして 大規模なプッシュ.
あなたの問題の解決策は、結果セットがなぜ非常に大きいのか、そしてそれがどのように生成されるのかにある程度依存すると思います。結果は時間の経過とともに増加しますか? 結果は一度に計算されてプッシュされますか? 結果が得られたらすぐにストリーミングして戻しますか?
ページングアプローチ
私の経験では、クライアントが検索結果のページと同様の結果セットの適切なサイズのチャンクに迅速にアクセスする必要がある場合、ページング アプローチを使用するのが適切です。ここで考慮すべき点は、プロトコルの全体的なチャット性、クライアント ページ要求間の結果セット全体のキャッシュ、および/または結果のページの生成にかかる処理時間です。
保存と取得
保存と取得は、結果がランダム アクセスではなく、クエリが処理されるにつれて結果セットのサイズが増大する場合に役立ちます。ここで考慮すべき問題は、クライアントにとっての複雑さ、および部分的な結果をユーザーに提供できるかどうか、またはクライアントに何かを返す前にすべての結果を計算する必要があるかどうか (分散検索エンジンからの結果の並べ替えを考えてください) です。
大プッシュ
大規模なプッシュ手法にはほぼ間違いなく欠陥があります。クライアントがすべての情報を必要とし、それをモノリシックな結果セットにプッシュする必要がある場合でも、次のアプローチをとることをお勧めします。 WS-ReliableMessaging
(直接または独自の簡易バージョンを介して) 結果をチャンク化します。これを行うことで、あなたは
- 作品が確実にクライアントに届くようにする
- クライアントから領収書を受け取るとすぐにチャンクを破棄できます
- これにより、サーバー側とクライアント側で 5MB の XML、DOM、またはその他のものをメモリ内に保持する必要があるため、メモリ消費に関する発生する可能性のある問題を軽減できます (結果をストリーミング方式で処理していないことを前提としています)。
ただし、他の人が言っているように、結果セットのサイズ、生成方法、全体的なパフォーマンスが実際の問題であることがわかるまでは、何もしないでください。
他のヒント
結果セットのサイズとして 5 MB に対する厳格な法則はありません。400MBを超える可能性があります 送りにくい.
(.net を使用しているため) 非同期ハンドラーが自動的に取得されます。
結果セットが生成され、サーバーに保存され、クライアントが結果セットのチャンクを少量でダウンロードし、最後にセットを再組み立てることができるような「ページング」を実装する
それはすでに起こっています -- それは tcp/ip と呼ばれます ;-) それを再実装するのはやりすぎかもしれません。
同様に --
結果セット全体を再生し、再び送信する必要があります
たとえば、結果セットの大部分を生成しているのが MS-SQL の場合、結果セットを再生成すると SQL Server の暗黙的なキャッシュが利用され、後続の生成が高速になります。
使用しているプラットフォームがパフォーマンスのボトルネックの多くを処理してくれるため、これらの問題が「実際の」問題として表面化するまでは、ある程度心配しなくても済みます。
私は、secretGeek のコメントにやや同意しません。
それはすでに起こっています -- それは tcp/ip と呼ばれます ;-) それを再実装するのはやりすぎかもしれません。
これだけを実行したい場合もありますが、実際には UI の観点からのみ実行します。データをクライアントにストリーミングする方法 (プッシュレット メカニズムのようなものを介して) を実装するか、提案のようにデータをページに分割する方法を実装した場合は、クライアントに非常に小さなサブセットをロードしてから、UI をゆっくりと構築できます。データの全量。
これにより、(ユーザーの観点からは) UI がより滑らかで高速になりますが、追加の労力に見合う価値があるかどうかを評価する必要があります...決して大した作業量ではないと思うからです。
したがって、Web メソッドに「開始レコード番号」と「最終レコード番号」パラメータを追加するソリューションに興味があるようですね。(または「ページ番号」と「ページごとの結果」)
バッキング ストアが SQL サーバー (または mysql) の場合、行番号付けのサポートが組み込まれているため、これはそれほど難しいことではありません。
それにもかかわらず、サーバー上でのセッション管理の実行を回避し、結果セットの明示的なキャッシュを回避し、バッキング ストアのキャッシュにのみ依存して作業をシンプルに保つことができるはずです。