2012-07-25 8 views
7

StatusUpdateHubと呼ばれるSignalRハブがあります。このハブは、HubClientという.NETクライアントによって更新されます。このクライアントは、さまざまなトランザクションに対して、複数のユーザーが毎秒約1000回呼び出されます(運用中)。ここでは、クライアントコードは次のとおりです。SignalRハブスケーラビリティの問題

このコードは、それが正常に動作しているが、我々は250に同時ユーザーの数を増やすときに私たちは、次のエラーが表示されている100人の同時ユーザーと呼ばれている
public static class HubClient 
{ 
    private static readonly string statusUpdateUrl = ConfigurationManager.AppSettings["StatusUpdateUrl"]; 
    private static readonly HubConnection connection = new HubConnection(statusUpdateUrl); 
    private static readonly IHubProxy hub = connection.CreateProxy("StatusUpdateHub"); 

    internal static void UpdateBrowser(long transactionId) 
    { 
     connection.Start().ContinueWith(task => hub.Invoke("UpdateTransactionStatus", transactionId)).ContinueWith(task => 
     { 
      if (task.IsFaulted && task.Exception != null) 
      { 
       // log error 
      } 
     }); 
    } 
} 

Unexpected error in UpdateBrowser: System.InvalidOperationException: The connection has not been established. at SignalR.Client.Connection.SignalR.Client.IConnection.Send[T](String data) at SignalR.Client.Hubs.HubProxy.Invoke[T](String method, Object[] args) at SignalR.Client.Hubs.HubProxy.Invoke(String method, Object[] args) at Application.Services.HubClient.<>c_DisplayClass2.b_0(Task task1) in c:\Build\Work\Application\Services\HubClient.cs:line 20
at System.Threading.Tasks.Task`1.InvokeFuture(Object futureAsObj)
at System.Threading.Tasks.Task.Execute()

コードをよりスケーラブルにする方法を教えてください。

+0

多分、サーバー上の同時接続に制限がありますか? – Stilgar

+0

実行中のメモリ消費も監視していますか?あなたですか?あなたの接続数/切断数の増加に伴ってどのようなトレンドが見られているのか不思議です。私は、アプリで未発表のメモリがいくつか見えていて、それがSignalRなのか他のものなのか不思議に思っていました。 – ElHaix

+0

@Stilgar私たちは何の制限も設定していません。 machine.configでどのような設定を変更する必要がありますか? –

答えて

9

これが1秒間に1000回呼び出されるメソッドの場合、毎回connection.Start()を呼び出すべきではありません。

接続を1回だけ開いてから、メソッドを呼び出します。

編集は、私は、非常に少なくとも、あなたのコードを作成している何を意味するか、このような何かを:デフォルトの.NETによって

internal static void UpdateBrowser(long transactionId) 
{ 
    lock (connection) 
    { 
     if (connection.State == ConnectionState.Disconnected){ 
      connection.Start().Wait(); 
     } 
    } 
    hub.Invoke("UpdateTransactionStatus", transactionId).ContinueWith(task => 
    { 
     if (task.IsFaulted && task.Exception != null) 
     { 
      // log error 
     } 
    }); 
} 
関連する問題