1

約1,000人の従業員PCにインストールされるWindowsフォームアプリケーションを開発しています。ユーザーは、アプリケーションの複数のインスタンスを同時に実行できます。クライアントはすべて単一のイントラネット上にあります。

アプリケーションを変更すると、データベースレコードが変更される可能性があります。この変更は、UIが更新されるように、他のクライアントに伝達する必要があります。

私たちのチームは、2つの異なるアプローチについて話しました。

1.マルチキャストパケット

ソースクライアントはレコードを変更してから、何かが変更されたペイロードを含むマルチキャストパケットを送信します。他のクライアントはこれを受け取り、指定されたデータをフェッチします。パケットが受信されず、データのアクティブな取得にフォールバックする場合を考慮する必要があります。

この時点での私の質問は、クライアントがパケットを受信しなかったことをどのようにして知るのかということです。(何がわからないのかわからない)これにより、データベース内のタイムスタンプを含むある種のイベントログが表示され、UIコントロールはそれらが最後に更新された時刻を追跡します。それらは焦点を合わせ、タイムスタンプをチェックし、必要に応じて更新します。

他の誰かは、UI要素がフォーカスされるたびにリロードするだけだと言いました(Outlookのモードを考えて、CABを使用してスタックワークスペースの前面にコントロールを表示します)。そして、マルチキャストは、現在のコンテキストが変更されたことをクライアントに更新することです。見逃した場合は、モードを変更して戻ってくるまで、古いデータを処理します。

2.WCFとコールバック

クライアントは、tcpバインディングを介したコールバックのWCFコントラクトに登録します。これに関する主な技術的懸念は、サーバーが多くの開いているソケットを維持していることです。従来の意味で開いていないことを確認しました。最大90秒間スリープ状態になり、その時点で再確立されます。また、Windows 2003 Serverマシンが処理できるオープン接続の最大数と、レジストリでそれを変更する方法についても説明しました。

サーバーへの1,000のオープンソケット接続がある場合、これは崩壊しますか?

誰かがこれと同じ状況に直面し、WCFアプローチを試したり評価したりした場合は、それについて聞いてみたいと思います。

4

1 に答える 1

1

私はこのような状況を実装していません。ただし、二重バインディングの 1 つが必ずしも高いオーバーヘッドを持つとは限らないと思います。

それはすべて、サーバーがクライアントに送り返す必要がある情報の量によって異なります。UI を更新するために情報が使用されるとのことでした。ただし、すべてが同時に同じ量の情報を必要とするわけではないようです。たとえば、西部地域に関する情報が変更された場合、1000 のクライアントすべてが変更があることを知りたいと考え、西部地域に関する概要レベルの情報を更新したいと考えているかもしれませんが、おそらくそれらの 1/4 だけが変更されている可能性があります。変更の詳細を確認する必要があります。

この場合、コールバックは変更内容に関する情報のみを提供することをお勧めします。ほとんどの場合、概要レベルです。変更の詳細に関心のあるクライアントに詳細を尋ねてもらいます。階層の上位 1 レベルまたは 2 レベルのすべての詳細を提供し、残りの部分については、「これは時間に変更されました」という情報を含めることさえできます。そうすれば、特定のクライアントが見ている階層のレベルに応じて、クライアントは質問するかしないかを決めることができます。

必要に応じて、更新をまとめてバッチ処理できます。クライアントを 1 秒に 1 回だけ更新する必要がある場合は、最後の 1 秒間の変更を蓄積して、一度にすべて送信できます。

タスクによっては、ピア ツー ピア バインディングを使用することもできます。おそらく、あなたのビジネスの特定の分野のクライアントは、お互いが何に取り組んでいるのか、そのようなことについて少し知りたがっています。

于 2009-07-17T16:37:27.450 に答える