Dot-Net

SignalR 集線器可擴展性問題

  • July 29, 2012

我們有一個名為 StatusUpdateHub 的 SignalR 集線器。此集線器由名為 HubClient 的 .NET 客戶端更新。該客戶端將(在生產中)被多個使用者每秒呼叫大約 1000 次,用於不同的事務。這是客戶端程式碼:

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

當使用 100 個並髮使用者呼叫此程式碼時,它工作正常,但是當我們將並髮使用者數增加到 250 時,我們會看到以下錯誤:

UpdateBrowser 中出現意外錯誤:System.InvalidOperationException:尚未建立連接。在 SignalR.Client.Connection.SignalR.Client.IConnection.Send

$$ T $$SignalR.Client.Hubs.HubProxy.Invoke 處的(字元串數據)$$ T $$(字元串方法,對象$$ $$參數)在 SignalR.Client.Hubs.HubProxy.Invoke(字元串方法,對象$$ $$args) 在 Application.Services.HubClient.<>c_DisplayClass2.b _0 (Task task1) 在 c:\Build\Work\Application\Services\HubClient.cs:

System.Threading.Tasks.Task`1.InvokeFuture 的第 20 行(對象 futureAsObj)

在 System.Threading.Tasks.Task.Execute()

讓我們知道如何使程式碼更具可擴展性?

如果這是每秒呼叫 1000 次的方法,那麼您不應該connection.Start()每次都呼叫。

只打開一次連接,然後呼叫它的方法。

編輯,我的意思是,至少,讓你的程式碼做這樣的事情:

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

引用自:https://stackoverflow.com/questions/11646854