Статьи

SignalR Scaleout с объединительной платой Redis

В « Приступая к работе с SignalR » я подробно рассказал о SignalR с несколькими простыми и практичными примерами. Огромный ответ показал, что я не одинок в своем мнении , что это удивительная технология, обеспечивающая push-уведомления в реальном времени через Интернет.

Веб-приложения часто сталкиваются с необходимостью масштабирования для обработки большого количества клиентов, и приложения SignalR не являются исключением. В этом примере мы увидим один из способов масштабирования приложений SignalR с использованием так называемой объединительной платы.

Масштабирование в SignalR

SignalRScaleout

« Введение в масштабирование в 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-scaleout-computer1

Наблюдение за пабом / субканалом показывает, что SignalR делает под капотом. Есть определенные сообщения, проходящие, когда приложение инициализируется на каждой машине, и вы также можете видеть фактические сообщения данных, проходящие через. Поэтому, когда вы пишете сообщение в чате, вы также можете увидеть его в пабе / подканале.

Но, что еще лучше, вы также увидите это на клиенте (браузере), подключенном к другой машине:

signalr-scaleout-computer2

Волшебство, которое вы должны оценить, заключается в том, что это не два браузера, подключенные к одному серверу; на самом деле они общаются с разными серверами на разных машинах. И, несмотря на это, сообщения достигают всех клиентов благодаря объединительной плате, в данном случае Redis.

Предостережения

Итак, я показал, как действительно легко масштабировать SignalR на несколько серверов: вам нужно установить пакет NuGet и добавить строку кода. И я действительно проверил это на двух машинах.

Притон-1-244250d58073b0ed1

Но это не совсем масштаб. У меня нет ресурсов для проведения масштабного тестирования, и я только хотел показать, как масштабирование реализовано в этой статье. Фактические преимущества масштабирования зависят от приложения. Как указывается в официальной документации , добавление объединительной платы приводит к накладным расходам и может стать узким местом в некоторых сценариях. Вы действительно должны изучить, подходит ли ваше приложение для такого рода масштабирования, прежде чем идти на это.