2012-07-25 13 views
7

Abbiamo un hub SignalR chiamato StatusUpdateHub. Questo hub è aggiornato da un client .NET chiamato HubClient. Questo client sarà (in produzione) chiamato circa 1000 volte al secondo da più utenti per diverse transazioni. Ecco il codice del client:Problema di scalabilità 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 
      } 
     }); 
    } 
} 

Quando questo codice viene chiamato con 100 utenti simultanei si sta lavorando bene, ma quando si aumenta il numero di utenti simultanei a 250 allora che stiamo vedendo il seguente errore:

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()

Facci sapere come possiamo rendere il codice più scalabile?

+0

Avete per caso avuto un limite sulle connessioni simultanee sul server? – Stilgar

+0

Stai monitorando il consumo di memoria durante le esecuzioni? Tu sei. Sono curioso di sapere quali sono le tendenze che stai vedendo con un numero maggiore di utenti connessi/disconnessi. Stavo vedendo alcuni ricordi inediti nella nostra app e mi chiedevo se fosse dovuto a SignalR oa qualcos'altro. – ElHaix

+0

@Stilgar non abbiamo impostato alcun limite. Quale impostazione dovrei cambiare in machine.config? –

risposta

9

Se questo è il metodo chiamato 1000 volte al secondo, non si dovrebbe chiamare connection.Start() ogni volta.

Aprire la connessione solo una volta, quindi solo richiamare i metodi su di esso.

Modifica, quello che voglio dire è, per lo meno, rendere il codice fare qualcosa di simile:

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