2012-07-25 21 views
7

Tenemos un concentrador SignalR llamado StatusUpdateHub. Este concentrador es actualizado por un cliente .NET llamado HubClient. Este cliente será (en producción) llamado por usuarios múltiples alrededor de 1000 veces por segundo para diferentes transacciones. Aquí está el código de cliente:Problema de escalabilidad del hub SignalR

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 
      } 
     }); 
    } 
} 

Cuando este código se llama con 100 usuarios al mismo tiempo que está funcionando bien, pero cuando se aumenta el número de usuarios simultáneos a 250 entonces estamos viendo el siguiente 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()

Háganos saber cómo podemos hacer que el código sea más escalable?

+0

¿Por casualidad tiene un límite de conexiones simultáneas en el servidor? – Stilgar

+0

¿También supervisa el consumo de memoria durante las ejecuciones? Eres tú. Tengo curiosidad por saber cuáles son las tendencias que está viendo con un mayor número de usuarios conectados/desconectados. Estaba viendo una memoria inédita en nuestra aplicación, y me preguntaba si se debía a SignalR u otra cosa. – ElHaix

+0

@Stilgar no hemos establecido ningún límite. ¿Qué configuración debo cambiar en machine.config? –

Respuesta

9

Si ese es el método que se llama 1000 veces por segundo, no debe llamar al connection.Start() cada vez.

Abra la conexión solo una vez, luego solo invoque métodos en ella.

Editar, lo que quiero decir es, al menos, hacer que su código de hacer algo como esto:

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 
     } 
    }); 
}