1

次のシナリオ:ユーザーへの新しいメールメッセージが格納されているデータベーステーブルがあります。ユーザーがクライアントアプリケーションを実行している場合、このユーザーのエントリがデータベーステーブルに挿入されたときに、新しいメールが到着したことを示すアイコンをアプリに表示する必要があります。

約100人のユーザーが同時にログインします。

私が見る限り、2つの解決策:

  1. 中央サーバーにサービスを実装します。そのサーバーはデータベースを定期的にポーリングします。また、クライアントは、起動時にサーバーに登録する必要があります。これにより、ユーザーへの新しいメッセージが到着したときにコールバックできるようになります。良い例:データベースのポーリングが少ない。悪い例:中央要素のコーディングが増えています。
  2. すべてのクライアントは、独自にデータベースをポーリングします。ポーリングは1分に1回程度行う必要があるため、100人のクライアントが毎分データベースをポーリングしています。悪いアイデア?それともまだ大丈夫ですか?

それで、あなたはどちらのオプションを選びますか?

クライアントには.NET4.0を使用し、データベースにはMS SQLServer2008を使用しています。

また、ソリューション1に投票する場合:WCFサービスは良い考えですか?私のシナリオに関するリンクやアイデアをいただければ幸いです。

皆さんありがとう!

4

3 に答える 3

2

箱の外で少し考えてみると、(特に、コンテンツをアプリケーションに公開するWebサーバーがすでにある場合に)検討したい別のオプションは、ロングポーリングサポートを提供するライブラリを使用することです。たとえば、SignalRです。そうすれば、クライアントからのポーリングを回避し、通知の受信について心配するだけで済みます。

これは、コンソールアプリケーションからSignalRを使用する方法と、標準のweb/js実装に関するチュートリアルです。

さて、あなたが抱えているもう1つの問題は、データベースの変更を絶えずポーリングすることです。SqlDependencyADO.netおよびSQLServerの機能(サービスブローカーと通知)を使用することで、これを回避できる場合もあります。

これは、このリアルタイム通知のアプローチを使用したチャットアプリケーションのサンプルです

同時クライアントの実際の数によっては、クライアントから直接依存関係を確立できる場合もあります(ただし、これはお勧めしません)。

したがって、これら2つを組み合わせると、サーバーに接続されているすべてのクライアントを認識させることができ、テーブル内のデータが実際に変更SqlDependencyされた場合にのみ更新をトリガーするために使用できます。Messagesその場合、SignalRのwikiの下部に示されているように、 「ハブの外部からハブを介してブロードキャストする」というタイトルのConnectionManagerを使用してハブを取得する必要がある場合があります。

この代替手段は、高速ポーリングアプローチよりも拡張性が高く、クライアントとサーバー間、およびサーバーとデータベース間の全体的なトラフィックを大幅に削減できると思います。

ただし、Webファームに展開する場合は、SignalRの現在のサポートについてもう少し調査する必要がある場合があることに注意してください。

于 2012-11-28T05:36:46.637 に答える
1

オプション1に進みます。コードは増えますが、スケーラビリティは高まります。

于 2015-10-01T08:18:45.157 に答える
0

オプション1を選択する傾向があります。データベースと通信するクライアントを減らすことは良いことであり、後でデータベースを変更したり、そこに他のロジックを追加したりする必要がある場合は、より簡単になります。WCFサービスは、おそらくこれに対して正常に機能します。

于 2012-11-27T20:44:25.910 に答える