Масштабирование SignalR с Redis (SignalR 1.x)

Патрик Флетчер

Предупреждение

Эта документация не подходит для последней версии SignalR. Взгляните на ASP.NET Core SignalR.

В этом руководстве вы будете использовать Redis для распространения сообщений в приложении SignalR, развернутом на двух отдельных экземплярах IIS.

Redis — это хранилище ключей-значений в памяти. Она также поддерживает систему обмена сообщениями с моделью публикации и подписки. Серверная планка SignalR Redis использует функцию pub/sub для пересылки сообщений на другие серверы.

Схема, демонстрирующая взаимосвязь между сервером Redis, который подписывается на виртуальные машины, и компьютерами, которые затем публикуют виртуальные машины на серверах Redis.

В этом руководстве вы будете использовать три сервера:

  • Два сервера под управлением Windows, которые будут использоваться для развертывания приложения SignalR.
  • Один сервер под управлением Linux, который будет использоваться для запуска Redis. На снимках экрана, описанных в этом руководстве, использовался TLS Ubuntu 12.04.

Если у вас нет трех физических серверов, можно создать виртуальные машины в Hyper-V. Другим вариантом является создание виртуальных машин в Azure.

Хотя в этом руководстве используется официальная реализация Redis, существует также порт Redis для Windows от MSOpenTech. Настройка и конфигурация отличаются, но в остальном действия одинаковы.

Замечание

Масштабирование SignalR с использованием Redis не поддерживает кластеры Redis.

Обзор

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

  1. Установите Redis и запустите сервер Redis.

  2. Добавьте эти пакеты NuGet в приложение:

  3. Создайте приложение SignalR.

  4. Добавьте следующий код в Global.asax, чтобы сконфигурировать бекплейн:

    protected void Application_Start()
    {
        GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
    
        RouteTable.Routes.MapHubs();
        // ...
    }
    

Ubuntu на Hyper-V

С помощью Windows Hyper-V можно легко создать виртуальную машину Ubuntu на Windows Server.

Скачайте ISO-файл Ubuntu из http://www.ubuntu.com.

В Hyper-V добавьте новую виртуальную машину. На шаге "Подключить виртуальный жесткий диск" выберите "Создать виртуальный жесткий диск".

Снимок экрана: мастер создания виртуальной машины с выделенной областью

На шаге "Параметры установки" выберите файл образа (.iso), нажмите кнопку "Обзор" и перейдите к ISO установки Ubuntu.

Снимок экрана: мастер создания виртуальной машины с выделенной областью

Установка Redis

Чтобы скачать и создать Redis, выполните действия, описанные в http://redis.io/download статье о загрузке и сборке Redis.

wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz
tar xzf redis-2.6.12.tar.gz
cd redis-2.6.12
make

Это создает двоичные файлы Redis в каталоге src .

По умолчанию Redis не требует пароля. Чтобы задать пароль, измените redis.conf файл, расположенный в корневом каталоге исходного кода. (Создайте резервную копию файла перед его редактированием!) Добавьте следующую директиву redis.conf:

requirepass YourStrongPassword1234

Теперь запустите сервер Redis:

src/redis-server redis.conf

Снимок экрана: окно сервера Redis пользователя Azure, в котором отображаются сведения о сервере, включая время запуска сервера и состояние памяти.

Откройте порт 6379, который является портом по умолчанию, на котором слушает Redis. (Номер порта можно изменить в файле конфигурации.)

Создание приложения SignalR

Создайте приложение SignalR, выполнив одно из следующих руководств:

Затем мы изменим приложение чата для поддержки масштабирования с помощью Redis. Сначала добавьте в проект пакет NuGet SignalR.Redis. В Visual Studio в меню "Сервис" выберите диспетчер пакетов NuGet, а затем консоль диспетчера пакетов. В окне консоли диспетчера пакетов введите следующую команду:

Install-Package Microsoft.AspNet.SignalR.Redis

Затем откройте файл Global.asax. Добавьте следующий код в метод Application_Start :

protected void Application_Start()
{
    GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");

    RouteTable.Routes.MapHubs();
}
  • "server" — это имя сервера, на котором выполняется Redis.
  • порт — номер порта
  • "password" — это пароль, определенный в файле redis.conf.
  • "AppName" — это любая строка. SignalR создает pub/sub channel Redis с таким именем.

Рассмотрим пример.

GlobalHost.DependencyResolver.UseRedis("redis-server.cloudapp.net", 6379,
    "MyStrongPassword1234", "ChatApp");

Развертывание и запуск приложения

Подготовьте экземпляры Windows Server для развертывания приложения SignalR.

Добавьте роль IIS. Включите функции "Разработка приложений", включая протокол WebSocket.

Снимок экрана мастера добавления ролей и функций с выделенными параметрами ролей сервера и протокола веб-сокетов.

Также включите службу управления (указанную в разделе "Средства управления").

Снимок экрана мастера добавления ролей и компонентов с выделенными ролями сервера и параметрами скриптов и инструментов управления IIS.

Установите Web Deploy 3.0. При запуске диспетчера IIS появится запрос на установку Microsoft Web Platform или вы можете скачать установщик. В Установщике платформы найдите Web Deploy и установите Web Deploy 3.0.

Снимок экрана: экран результатов поиска Инсталлятора веб-платформ 4.5 с выделенным параметром

Убедитесь, что служба веб-управления запущена. Если это не так, запустите службу. (Если вы не видите веб-службу управления в списке служб Windows, убедитесь, что вы установили службу управления при добавлении роли IIS.)

По умолчанию служба веб-управления прослушивает TCP-порт 8172. В брандмауэре Windows создайте новое правило для входящего трафика, чтобы разрешить tcp-трафик через порт 8172. Дополнительные сведения см. в разделе "Настройка правил брандмауэра". (Если вы размещаете виртуальные машины в Azure, это можно сделать непосредственно на портале Azure. Узнайте , как настроить конечные точки на виртуальной машине.)

Теперь вы готовы развернуть проект Visual Studio с компьютера разработки на сервере. В обозревателе решений щелкните правой кнопкой мыши решение и нажмите кнопку "Опубликовать".

Дополнительные сведения о веб-развертывании см. в статье "Карта содержимого веб-развертывания" для Visual Studio и ASP.NET.

При развертывании приложения на двух серверах можно открыть каждый экземпляр в отдельном окне браузера и увидеть, что каждый из них получает сообщения SignalR от другого. (Конечно, в рабочей среде два сервера будут находиться за подсистемой балансировки нагрузки.)

Снимок экрана: сообщения Signal R, отображаемые в веб-браузере Internet Explorer, на экране

Если вам интересно увидеть сообщения, отправляемые в Redis, можно использовать клиент redis-cli , который устанавливается с Redis.

redis-cli -a password
SUBSCRIBE ChatApp

Снимок экрана: экран вывода пользователя Azure, в котором отображаются сведения обо всех отправленных сообщениях и сопровождаемом коде.