7

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](String メソッド、Object[] args) で 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)
で System.Threading.Tasks.Task.Execute()

コードをよりスケーラブルにする方法を教えてください。

4

2 に答える 2

10

それが毎秒 1000 回呼び出されるメソッドである場合、connection.Start()毎回呼び出すべきではありません。

接続を 1 回だけ開き、その上でメソッドを呼び出すだけです。

Edit、つまり、少なくとも、コードを次のようにすることです。

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
        }
    });
}
于 2012-07-25T16:56:15.610 に答える
5

デフォルトでは、.NET はクライアント アプリから 2 つの同時接続を許可し、ASP.NET アプリからは 10 の同時接続を許可します。この数を増やしたい場合は、http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspxをより大きな数に設定します。それが役立つかどうかを確認してください。

于 2012-07-25T20:56:27.637 に答える