メッセージを交換するためにSqlServerデータベースを使用するチャットWebアプリケーションを開発しました。
すべてのクライアントはx秒ごとにポーリングして、新しいメッセージをチェックします。
このアプローチは多くのリソースを消費することは明らかであり、それを行うための「より安い」方法があるかどうか疑問に思いました。
私は「プレゼンス」に同じアプローチを使用します。つまり、誰がオンになっているかをチェックします。
メッセージを交換するためにSqlServerデータベースを使用するチャットWebアプリケーションを開発しました。
すべてのクライアントはx秒ごとにポーリングして、新しいメッセージをチェックします。
このアプローチは多くのリソースを消費することは明らかであり、それを行うための「より安い」方法があるかどうか疑問に思いました。
私は「プレゼンス」に同じアプローチを使用します。つまり、誰がオンになっているかをチェックします。
フラッシュやJavaアプレットのようなブラウザプラグイン/拡張機能を使用しない場合、ブラウザは本質的に一方向のコミュニケーションツールです。データをフェッチするには、ブラウザがリクエストを開始する必要があります。データをブラウザに「プッシュ」することはできません。
サーバーの「プッシュ」をシミュレートするためにAjaxポーリングメソッドを使用する多くのWebアプリ。秘訣は、周波数/データサイズと帯域幅およびサーバーリソースのバランスを取ることです。
Gmailの簡単な観察をしました。5秒ごとにHttpPostポーリングを実行します。'state'の変更がない場合、応答データのサイズはわずか数バイトです(httpヘッダーは含まれません)。もちろん、グーグルは巨大なサーバーリソースと帯域幅を持っています、それが私が言及する理由です:良いバランスを見つけること。
それが「ユーザーエクスペリエンスとサーバーリソースの改善」です。x秒ごとの単純なポーリングではなく、創造的なポーリング戦略を考え出す必要があるかもしれません。
例:パーティAからのアクティビティがない場合は、3秒ごとにポーリングします。パーティAが入力している間、5秒ごとにポーリングします。これは単なる実例であり、数字をいじったり、より効率的な数字を出したりすることができます。
最後に、データ交換。課題は、同じ情報を伝達するために最小データサイズを渡す方法を見つけることです。
私の2セント:)
SQL Server 2005を使用している場合は、NotificationServicesを確認できます。これにより、SQL2008でNotificationServicesが削除されたため、SQL2005にロックされます。SQLServerがデータベースへの変更をクライアントアプリケーションに通知できるように設計されています。
もう少しスケーラブルなものが必要な場合は、Usersレコードにいくつかのビットフラグを設定できます。ユーザーへのメッセージが届いたら、新しいメッセージのビットをtrueに変更します。メッセージを読んだら、それを0に変更します。人々がサインオンおよびサインオフしたときも同じです。そうすれば、すでにキャッシュにある可能性が非常に高い非常に小さなフィールドを読み取っています。
ワークフローは少し準備ができていますか。1の場合は、メッセージテーブルからメッセージを取得します。0の場合は、何もしません。
ASP.NET 4.0では、JavaScriptオブジェクトおよび配列でオブザーバーパターンを使用できます。つまり、jQueryまたはPageMethodsを使用したAJAXJSON呼び出しです。
返すデータがあるかどうかを分析するには、常にデータベースにアクセスする必要があります。秘訣は、これらの呼び出しを小さくし、必要な場合にのみデータを返すことです。
SQL Server 2005に組み込まれ、SQLServer2008でも引き続き使用できる2つの関連ソリューションがあります。
1)サービスブローカー。これにより、サブスクライバーはキューに読み取りを投稿できます(WAITを使用したRECEIVEコマンド..)。あなたの場合、これらのキューの前にあるService Broker Servicesを使用して、データベースを介してメッセージを送信することをお勧めします。これらのキューは、待機中のクライアントによって取得される可能性があります。ポーリングはありません。メッセージを受信すると、待機中のクライアントがアクティブになります。
2)クエリ通知。これにより、サブスクライバーはクエリを定義でき、そのクエリの実行によって生じるデータセットが変更されたときに通知を受信します。Service Brokerに基づいて構築されたクエリ通知は、使いやすさは多少劣りますが、効率が多少低下する場合もあります。(クエリ通知とその兄弟ではなく、イベント通知は通知サービス(NS)と間違われることがよくあります。これは、NSが2008年に廃止されたために懸念されますが、クエリとイベント通知は引き続き完全に利用可能であり、SQL Server 2008でも拡張されています)。
リアルタイムチャットアプリのようなものについては、SQLバッキングを備えた分散キャッシュをお勧めします。Enyim .NETプロバイダーでmemcachedが好きなので、次のようにします。
データベースバッキングを使用すると、キャッシュがクリアされた場合やアプリケーションが再起動した場合にキャッシュをプリロードできますが、機能ビットはデータベースをポーリングするのではなく、メモリ内のキャッシュに依存します。