SignalR 集線器可擴展性問題
我們有一個名為 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 => { if (task.IsFaulted && task.Exception != null) { // log error } }); }