2012-07-25 21 views
7

StatusUpdateHub adlı bir SignalR hub'ımız var. Bu hub, HubClient adında bir .NET istemcisi tarafından güncelleştirildi. Bu müşteri (üretimde), farklı işlemler için birden fazla kullanıcı tarafından saniyede yaklaşık 1000 kere çağrılacaktır. İşte istemci kodu:SignalR hub ölçeklenebilirlik sorunu

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

:

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

bu kod gayet iyi çalışıyor fakat 100 eşzamanlı kullanıcı ile çağrılır biz o zaman aşağıdaki hatayı görüyoruz 250 eşzamanlı kullanıcı sayısını artırmak olduğunda

Kodu nasıl daha ölçeklendirebiliriz?

+0

Sunucuda simultanious bağlantılarda herhangi bir şansınız var mı? – Stilgar

+0

Ayrıca, çalışma boyunca hafıza tüketimini mi izliyorsunuz? Sen. Trendlerin ne olduğunu bağlı # bağlı/bağlantısız kullanıcı sayısıyla gördüğünüzü merak ediyorum. Bizim app bazı yayınlanmamış bellek görüyordum ve bunun SignalR veya başka bir şey nedeniyle olup olmadığını merak ediyordum. – ElHaix

+0

@Stilgar herhangi bir limit belirlemedik. Machine.config dosyasında hangi ayarı değiştirmeliyim? –

cevap

9

Bu, saniyede 1000 kez çağrılan yöntemse, her seferinde connection.Start() numaralı telefonu aramamalısınız.

Bağlantıyı yalnızca bir kez açın, ardından yalnızca yöntemleri çağırın.

Düzenleme, ben en azından, kodunuzu yapmak olduğunu ne anlama geldiğini böyle bir şey yapmak: Varsayılan .NET ile

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 
     } 
    }); 
} 
İlgili konular