gpt4 book ai didi

.net - SignalR 集线器可扩展性问题

转载 作者:行者123 更新时间:2023-12-03 23:45:56 27 4
gpt4 key购买 nike

我们有一个名为 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 时,我们会看到以下错误:

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



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

最佳答案

如果那是每秒调用 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
}
});
}

关于.net - SignalR 集线器可扩展性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11646854/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com