SignalR集线器可扩展性问题

Ach*_*khi 7 .net signalr signalr-hub

我们有一个名为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
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

当使用100个并发用户调用此代码时它工作正常但是当我们将并发用户数增加到250时,我们看到以下错误:

UpdateBrowser中出现意外错误:System.InvalidOperationException:尚未建立连接.位于SignalR.Client.Hubs的SignalR.Client.Hubs.HubProxy.Invoke [T](String方法,Object [] args)上的SignalR.Client.Connection.SignalR.Client.IConnection.Send [T](字符串数据).位于C:\ Build\Work\Application\Services\HubClient.cs 中的Application.Services.HubClient.<> c_ DisplayClass2.b _0(任务task1)中的HubProxy.Invoke(String方法,Object [] args):
系统中的第20行
System.Threading.Tasks.Task.Execute()中的.Threading.Tasks.Task`1.InvokeFuture(Object futureAsObj )

让我们知道如何使代码更具可扩展性?

and*_*ecu 10

如果这是每秒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
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


dav*_*owl 5

默认情况下,.NET允许从客户端应用程序传出2个并发连接,从ASP.NET应用程 如果要增加此数字,请将http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx设置为更大的数字.看看是否有帮助.