Задать вопрос

Как минимизировать нагрузку на сервер для чата на ASP.NET MVC с SignalR?

Есть игровой чат на ASP.NET MVC с использованием SignalR. Есть БД с диалогами, репликами и пользователями (AspNet.Identity). Есть четыре конроллера (BaseController который наследуется от Controller и в котором создаётся контекст диалогов и реплик, стандартный AccountController который наследуется от BaseController, HomeController который наследуется от BaseController и VerseController который тоже наследуется от BaseController) и сигналар хаб в котором тоже нужно создать инстанс базы данных что бы записывать в неё новые реплики не перезагружая страничку.

Если я не ошибаюсь (а я могу, запросто) то каждый раз когда пользователь открывает сайт, на сервере создаётся инстанс контроллера в котором создаётся контекст и запускается функция которая обрабатывает контекст и выдёт его в View. То есть если тысяча пользователей одновременно пользуются чатом то на сервере тысяча раз создаётся инстанс БД. Я бы хотел что бы во время пользования чатом на сервере инсианс БД создавался только один раз. Вопрос где? WCF? Web API? Только в SignalR хабе? Как лучше всего сделать что бы минимизировать нагрузку на сервер и что бы у большого кол-ва пользователей чат работал быстро и без задержек?
  • Вопрос задан
  • 927 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
Не инстанс контекста, а не самой БД - разные вещи!
Используй dependencyInjection и переиспользуй инстанс контекста БД в каждом последующем контроллере, подойдет NInject.
Где хостится сервер? IIS? Katana? Если IIS, то стоит помнить про то, что пул может убиваться, соответственно объекты не вечные, в отличие от self-hosted.

Чтобы минимизировать нагрузку и не завязываться на БД стоит продумать кэш в оперативной памяти, продумать сценарии рефреша страницы и подгрузки недавней истории. И, конечно же, корректно использовать entity для чтения (Не трэкать всё подряд) и записи (вставка пачками - bulkinsert по таймеру, если требуется ну очень много вставок).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kttotto
пофиг на чем писать
У меня точно такой же вопрос стоит уже вторую неделю, только в другом контексте. Мониторинг GPS трекеров. Есть серверная часть, которая по UDP протоколу получает сообщение от трекера и которая так же имеет доступ к БД, чтоб понять кому принадлежит трекер, затем сообщение уходит на хаб SignalR для отсылки веб-клиенту. Получается что у меня два конекшина к базе, от сервера с сайтом (ASP.NET MVC) и от сервера с хабом. И тоже думаю как сделать одно соединение, чтоб базу меньше напрягать, и тоже кручусь вокруг WCF или Web API.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы