В « Приступая к работе с SignalR » я подробно рассказал о SignalR с несколькими простыми и практичными примерами. Огромный ответ показал, что я не одинок в своем мнении , что это удивительная технология, обеспечивающая push-уведомления в реальном времени через Интернет.
Веб-приложения часто сталкиваются с необходимостью масштабирования для обработки большого количества клиентов, и приложения SignalR не являются исключением. В этом примере мы увидим один из способов масштабирования приложений SignalR с использованием так называемой объединительной платы.
Масштабирование в SignalR
« Введение в масштабирование в SignalR » (официальная документация) описывает, как приложения SignalR могут использовать несколько серверов для обработки растущего числа клиентов. Когда серверу необходимо отправить обновление, он сначала передает его через шину сообщений, называемую объединительной платой . Это доставляет его на другие серверы, которые затем могут переслать обновление своим соответствующим клиентам.
Согласно официальной документации, масштабирование поддерживается с использованием Azure, Redis или SQL Server в качестве объединительных плат. Существуют сторонние пакеты для поддержки других каналов, таких как SignalR.RabbitMq .
Пример Scaleout с использованием Redis
« Введение в масштабирование в SignalR » (официальная документация) описывает, как использовать SignalR в качестве объединительной панели. Чтобы продемонстрировать это, я буду опираться на код примера чата из моей статьи « Начало работы с SignalR ».
Все, что нам нужно для масштабирования с помощью Redis — это установить пакет NuGet Microsoft.AspNet.SignalR.Redis , а затем настроить его в классе Startup следующим образом:
public void Configuration(IAppBuilder app)
{
GlobalHost.DependencyResolver.UseRedis("192.168.1.66", 6379, null, "SignalRChat");
app.MapSignalR();
}
В приведенном выше коде я указываю хост и порт сервера Redis, пароль (в данном случае нулевой, потому что у меня его нет) и имя канала pub / sub, который SignalR будет использовать для распространения сообщений.
Чтобы проверить это, вы можете получить сервер Redis со страницы загрузки Redis . Выпуски Redis для Windows существуют и отлично подходят для тестирования, но помните, что они официально не поддерживаются для рабочих сред.
Теперь, чтобы проверить его, я установил одно и то же приложение чата с расширенным масштабированием на двух разных машинах и подписался на канал / паб Redis:
Наблюдение за пабом / субканалом показывает, что SignalR делает под капотом. Есть определенные сообщения, проходящие, когда приложение инициализируется на каждой машине, и вы также можете видеть фактические сообщения данных, проходящие через. Поэтому, когда вы пишете сообщение в чате, вы также можете увидеть его в пабе / подканале.
Но, что еще лучше, вы также увидите это на клиенте (браузере), подключенном к другой машине:
Волшебство, которое вы должны оценить, заключается в том, что это не два браузера, подключенные к одному серверу; на самом деле они общаются с разными серверами на разных машинах. И, несмотря на это, сообщения достигают всех клиентов благодаря объединительной плате, в данном случае Redis.
Предостережения
Итак, я показал, как действительно легко масштабировать SignalR на несколько серверов: вам нужно установить пакет NuGet и добавить строку кода. И я действительно проверил это на двух машинах.
Но это не совсем масштаб. У меня нет ресурсов для проведения масштабного тестирования, и я только хотел показать, как масштабирование реализовано в этой статье. Фактические преимущества масштабирования зависят от приложения. Как указывается в официальной документации , добавление объединительной платы приводит к накладным расходам и может стать узким местом в некоторых сценариях. Вы действительно должны изучить, подходит ли ваше приложение для такого рода масштабирования, прежде чем идти на это.