Member 13204693 Ответов: 0

Как исправить проблему, когда signalr заставляет веб-страницу замедляться до полной остановки из-за слишком большого количества соединений, вызванных обратными связями.


С небольшим количеством пользователей (< 20)проблем нет. Мой сервер может отправлять обновления на страницу, когда это необходимо,и пользователи могут взаимодействовать со страницей без замедления. Когда я делаю страницу доступной для большого количества пользователей (> 200), страница перестает работать или время загрузки становится невыносимым. Я думаю, что использование памяти SignalR и соединения слишком высоки для обработки сервером, потому что новые соединения создаются каждый раз, когда происходит обратная передача, а сборка мусора SignalR происходит слишком медленно, чтобы очистить устаревшие соединения.

серверный:
public class MyHub : Hub
{
    public void joinGroup(string groupName)
    {
        this.Groups.Add(this.Context.ConnectionId, groupName);
    }

    public void removeFromGroup(string groupName)
    {
        this.Groups.Remove(this.Context.ConnectionId, groupName);
    }

    public void broadcastUpdateToGroup(string groupName, string command, string message)
    {
        Clients.Group(groupName).updateTest(command + "~" + message);
    }
}


Я бы использовал этот код для отправки сообщения:
var hubConnection = new HubConnection(liveHubURL);
var liveHub = hubConnection.CreateHubProxy("liveHub");
hubConnection.Start().Wait();
liveHub.Invoke("broadcastUpdateToGroup", "my group", "Alert", "Hello");
Task.Run(() => hubConnection.Dispose());


Что я уже пробовал:

Я попробовал изменить производительность SignalR Wiki, но все еще есть проблема. К вашему сведению, сначала у меня была проблема с небольшим количеством пользователей, но я увеличил количество процессоров с 4 до 16, и это заставило все работать гладко. Я не думаю, что увеличение процессоров до чего-то более высокого-это тот способ, которым я хочу продолжать исправлять это, потому что это не будет масштабируемо для гораздо большего числа пользователей.

Dave Kreskowiak

Это было бы похоже на проблему кода на стороне сервера. Поскольку мы ничего не знаем о вашем серверном коде, практически никто не может сказать вам, что это будет.

Member 13204693

Я обновил вопрос, включив в него очень простой серверный код. Существует процедура, которая время от времени создает сообщения, которые она отправляет через broadcastUpdateToGroup(groupName, command, message). Любая помощь будет оценена по достоинству.

Dave Kreskowiak

Этого недостаточно. Вы сказали, что используете этот код ,чтобы "отправить сообщение". Итак, вы создаете новый хаб каждый раз, когда отправляете сообщение? Сколько сообщений в секунду вы отправляете?

Member 13204693

Ух ты! Дэйв, спасибо. Я переместил первые три строки hubConnection в инициализирующую часть моего класса и удалил строку hubconnection disposing. Таким образом, единственный код для отправки сообщений сейчас-это liveHub.Вызовите линию, и все кажется более гладким. До вашего последнего ответа я не понимал, что мне не нужно создавать и уничтожать концентратор каждый раз, когда я отправляю сообщение. Я попробую его с большим количеством пользователей и посмотрю, как он работает, но, похоже, вы привели меня к решению. Спасибо снова.

0 Ответов