2016-04-10 5 views
4

WebアプリケーションとデスクトップWinformsアプリケーションの間に通知システムを構築したいと思います。Webアプリケーションからデスクトップウィンドウへの通知の実行可能性SignalRを使用したアプリケーションのフォームアプリケーション

WebアプリケーションでWindowsフォームデスクトップアプリケーションに通知をプッシュすると同時に、ユーザーに配信されるメッセージをフィルタしたいと思っています。接続されたすべてのユーザーがすべてのメッセージを受信するわけではありません。誰が何を受け取るかを決定するために、サーバー側(Webアプリケーション)で行われるフィルタ処理が行われます。

すでに接続されている場合は、デスクトップアプリケーションに通知を送信し、通知がない場合は何も受信しません。私は、アプリケーションが接続されていない、または実行されていない場合、サーバーから来る通知を保存したくありません。プッシュされた通知は瞬時に行われ、クライアント側には保存されず、表示されます。

また、私は心配しています:複数のユーザーが接続しており、同時にサーバーから要求している場合、それはサーバーのパフォーマンスに影響しますか?

たとえば、Windowsフォームアプリケーションを使用してサーバー側(Webアプリケーション)からカテゴリに応じて通知を受信するなど、20,000人のユーザーがいます。

このシナリオをサポートしていますか?

+0

あなたは(20.000ユーザー、WinFormsのにASP.NETプッシュ)シナリオのための***しようとした高パフォーマンスで***最終的な溶液を得たのですか?あなたは*共有する* _良いパターンと習慣_を望みますか? – Kiquenet

答えて

5

SignalRはこのシナリオをサポートしていますか?

はいサポートされており、ライブ通知に適しています。

groupsを使用して、接続されたクライアントの指定されたサブセットにメッセージをブロードキャストできます。しかし、感覚データにグループを使用しないでください。

接続されたクライアントはtrack/mapになり、connectionId/connectionIdsによって特定のユーザ/ユーザ通知にメッセージを送信することができます。

私たちがパフォーマンスに来るなら、20000人の同時接続(私は同時に並んでいる)が本当にたくさんあります。まず、change IIS configurationを使用して、5000を超える同時リクエストをサポートする必要があります。

optimize signalr for performanceです。メッセージサイズは小さくする必要があります。メッセージあたりの最大値は4Kbです(これは多くの同時接続数を減らすためです)。

SignalrはJsonを使用するので、JsonPropertyを使用してメッセージサイズを減らすことができます。

[JsonProperty("op")] 
public decimal OrderPrice 

なぜメッセージサイズが重要なのですか?すべての接続にはサーバ側のバッファがあるためです。クライアントが1つのメッセージを得ることができるが、その時点でサーバが2つのメッセージを送信すると、メッセージはバッファに書き込まれる。これらのバッファはメモリを使用します。したがって、20000件の同時接続ではさらに慎重に作業する必要があります。さもなければ、あなたはメモリ消費に苦しんでいます。

ただし、メッセージサイズが不十分な場合でも、このバッファ制限を減らす必要があります。

DefaultMessageBufferSize:デフォルトでは、SignalRは、接続ごとにハブあたり メモリに1000件のメッセージを保持します。大きなメッセージが使用されている場合は、この はこの 値を小さくすることによって軽減することができるメモリの問題を作成することができます。この設定は、ASP.NETアプリケーションで、またはOWIN スタートアップクラスの設定方法で自己ホスト型アプリケーションでのApplication_Startイベントハンドラ に設定することができます。次のサンプル が使用されているサーバー メモリの量を削減するために、アプリケーションのメモリ フットプリントを削減するために、この値を小さくする方法を示しています。

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     // Any connection or hub wire up and configuration should go here 
     GlobalHost.Configuration.DefaultMessageBufferSize = 500; 
     app.MapSignalR(); 
    } 
} 

私はあなたがそれを100使用することをお勧めします。バッファー限界を下げることの欠点は何ですか?バッファがいっぱいになると、新しいメッセージが得られません。これは、クライアントがあなたの通知の一部を失うことを意味します。したがって、あなたの通知がトランザクションである場合(ユーザは受信しなければならない)、多くのバッファサイズを減らさないでください。しかし、そうでなければ、あなたは減らすことができます(Minumumは32でなければなりません)。

あなたは、サーバーとクライアントの両側にネット4.5以上の両方を使用する必要がありますし、あなたのクライアントがWebSocketのをサポートするためにwindows8以上が必要です。

した後、これらの手順を適用し、あなたのメモリ消費量を追跡し、messsagesのmesssageサイズ/バッファ制限/周波数を変更します。

ボーナス: 20000の同時要求はあまりにも多くのです。したがって、パフォーマンスの問題が発生した場合は、ロードバランサ/スケールアップとSignalr BackPlaneを使用することをお勧めします。そうです、あなたは1つのWebサーバーを持っていないでしょう.4つはそれぞれ平均5000の同時リクエストを持っています。サーバー上で1つのメッセージを送信すると、他のサーバー(クライアントも含む)がバックプレーンでメッセージを取得します。何が欠点ですか? connectionIdsを使用してユーザーを追跡/マッピングするには、共有リソース(例:データベース)を使用する必要があります。

関連する問題