Настройка серверного плана Redis для горизонтального масштабирования ASP.NET Core SignalR

Эндрю Стэнтон-Медсестра, Брэди Гастер и Том Дайкстра.

В этой статье описываются SignalRконкретные аспекты настройки сервера Redis для масштабирования приложения ASP.NET Core SignalR .

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

В этой статье показано использование строк подключения. При использовании локальной базы данных для разработки и тестирования проверка подлинности пользователя базы данных через строку подключения не требуется. В рабочих средах строки подключения иногда включают пароль для проверки подлинности доступа к базе данных или операций базы данных. Учетные данные владельца ресурса (ROPC) в строке подключения представляют собой риск безопасности в производственных приложениях. Рабочие приложения должны использовать самый безопасный поток проверки подлинности. Дополнительные сведения о проверке подлинности для приложений, развернутых в тестовых или рабочих средах, см. в ASP.NET разделах по безопасности Core.

Настройка серверного плана Redis

  • Разверните сервер Redis.

    Внимание

    Для использования в рабочей среде рекомендуется бэкплейн Redis, только если он работает в том же центре обработки данных, что и приложение SignalR. В противном случае задержка сети снижает производительность. Если ваше SignalR приложение работает в облаке Azure, рекомендуется использовать службу Azure SignalR вместо серверной части Redis.

    Дополнительные сведения см. на следующих ресурсах:

  • SignalR В приложении установите следующий пакет NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Добавьте следующую строку перед строкой, которая вызывает AddStackExchangeRedis, в файле builder.Build(), чтобы вызвать Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Настройте параметры по мере необходимости:

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

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

    builder.Services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = RedisChannel.Literal("MyApp");
      });
    

    В приведенном выше коде options.Configuration инициализируется тем, что было указано в строке подключения.

    Сведения о параметрах Redis см. в документации по StackExchange Redis.

  • Если вы используете один сервер Redis для нескольких SignalR приложений, используйте для каждого приложения префикс канала SignalR .

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

  • Настройте программное обеспечение балансировки нагрузки фермы серверов для липких сеансов. Ниже приведены некоторые примеры документации о том, как это сделать:

Ошибки сервера Redis

Когда сервер Redis выходит из строя, вызывает исключения, указывающие, SignalR что сообщения не будут доставлены. Некоторые типичные сообщения об исключениях:

  • Ошибка записи сообщения
  • Не удалось вызвать метод концентратора "MethodName"
  • Сбой подключения к Redis

SignalR не буферизирует сообщения для их отправки, когда сервер снова заработает. Все сообщения, отправленные во время простоя сервера Redis, теряются.

SignalR автоматически повторно подключается, когда сервер Redis снова доступен.

Настраиваемое поведение при сбоях подключения

Ниже приведен пример обработки событий сбоя подключения Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Кластер Redis

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

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

SignalR В приложении включите все возможные узлы Redis с помощью любого из следующих подходов:

  • Перечислите узлы в строке подключения, разделённые запятыми.
  • Если вы используете настраиваемое поведение для сбоев подключения, добавьте узлы в ConfigurationOptions.Endpoints.

Следующие шаги

Дополнительные сведения см. на следующих ресурсах:

В этой статье описываются SignalRконкретные аспекты настройки сервера Redis для масштабирования приложения ASP.NET Core SignalR .

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

В этой статье показано использование строк подключения. При использовании локальной базы данных для разработки и тестирования проверка подлинности пользователя базы данных через строку подключения не требуется. В рабочих средах строки подключения иногда включают пароль для проверки подлинности доступа к базе данных или операций базы данных. Учетные данные владельца ресурса (ROPC) в строке подключения представляют собой риск безопасности в производственных приложениях. Рабочие приложения должны использовать самый безопасный поток проверки подлинности. Дополнительные сведения о проверке подлинности для приложений, развернутых в тестовых или рабочих средах, см. в ASP.NET разделах по безопасности Core.

Настройка серверного плана Redis

  • Разверните сервер Redis.

    Внимание

    Для использования в рабочей среде рекомендуется бэкплейн Redis, только если он работает в том же центре обработки данных, что и приложение SignalR. В противном случае задержка сети снижает производительность. Если ваше SignalR приложение работает в облаке Azure, рекомендуется использовать службу Azure SignalR вместо серверной части Redis.

    Дополнительные сведения см. на следующих ресурсах:

  • SignalR В приложении установите следующий пакет NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Добавьте следующую строку перед строкой, которая вызывает AddStackExchangeRedis, в файле builder.Build(), чтобы вызвать Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Настройте параметры по мере необходимости:

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

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

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    В приведенном выше коде options.Configuration инициализируется тем, что было указано в строке подключения.

    Сведения о параметрах Redis см. в документации по StackExchange Redis.

  • Если вы используете один сервер Redis для нескольких SignalR приложений, используйте для каждого приложения префикс канала SignalR .

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

  • Настройте программное обеспечение балансировки нагрузки фермы серверов для липких сеансов. Ниже приведены некоторые примеры документации о том, как это сделать:

Ошибки сервера Redis

Когда сервер Redis выходит из строя, вызывает исключения, указывающие, SignalR что сообщения не будут доставлены. Некоторые типичные сообщения об исключениях:

  • Ошибка записи сообщения
  • Не удалось вызвать метод концентратора "MethodName"
  • Сбой подключения к Redis

SignalR не буферизирует сообщения для их отправки, когда сервер снова заработает. Все сообщения, отправленные во время простоя сервера Redis, теряются.

SignalR автоматически повторно подключается, когда сервер Redis снова доступен.

Настраиваемое поведение при сбоях подключения

Ниже приведен пример обработки событий сбоя подключения Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Кластер Redis

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

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

SignalR В приложении включите все возможные узлы Redis с помощью любого из следующих подходов:

  • Перечислите узлы в строке подключения, разделённые запятыми.
  • Если вы используете настраиваемое поведение для сбоев подключения, добавьте узлы в ConfigurationOptions.Endpoints.

Следующие шаги

Дополнительные сведения см. на следующих ресурсах:

В этой статье описываются SignalRконкретные аспекты настройки сервера Redis для масштабирования приложения ASP.NET Core SignalR .

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

В этой статье показано использование строк подключения. При использовании локальной базы данных для разработки и тестирования проверка подлинности пользователя базы данных через строку подключения не требуется. В рабочих средах строки подключения иногда включают пароль для проверки подлинности доступа к базе данных или операций базы данных. Учетные данные владельца ресурса (ROPC) в строке подключения представляют собой риск безопасности в производственных приложениях. Рабочие приложения должны использовать самый безопасный поток проверки подлинности. Дополнительные сведения о проверке подлинности для приложений, развернутых в тестовых или рабочих средах, см. в ASP.NET разделах по безопасности Core.

Настройка серверного плана Redis

  • Разверните сервер Redis.

    Внимание

    Для использования в рабочей среде рекомендуется бэкплейн Redis, только если он работает в том же центре обработки данных, что и приложение SignalR. В противном случае задержка сети снижает производительность. Если ваше SignalR приложение работает в облаке Azure, рекомендуется использовать службу Azure SignalR вместо серверной части Redis.

    Дополнительные сведения см. на следующих ресурсах:

  • SignalR В приложении установите следующий пакет NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Добавьте следующую строку перед строкой, которая вызывает AddStackExchangeRedis, в файле builder.Build(), чтобы вызвать Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Настройте параметры по мере необходимости:

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

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

    builder.Services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = RedisChannel.Literal("MyApp");
      });
    

    В приведенном выше коде options.Configuration инициализируется тем, что было указано в строке подключения.

    Сведения о параметрах Redis см. в документации по StackExchange Redis.

  • Если вы используете один сервер Redis для нескольких SignalR приложений, используйте для каждого приложения префикс канала SignalR .

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

  • Настройте программное обеспечение балансировки нагрузки фермы серверов для липких сеансов. Ниже приведены некоторые примеры документации о том, как это сделать:

Ошибки сервера Redis

Когда сервер Redis выходит из строя, вызывает исключения, указывающие, SignalR что сообщения не будут доставлены. Некоторые типичные сообщения об исключениях:

  • Ошибка записи сообщения
  • Не удалось вызвать метод концентратора "MethodName"
  • Сбой подключения к Redis

SignalR не буферизирует сообщения для их отправки, когда сервер снова заработает. Все сообщения, отправленные во время простоя сервера Redis, теряются.

SignalR автоматически повторно подключается, когда сервер Redis снова доступен.

Настраиваемое поведение при сбоях подключения

Ниже приведен пример обработки событий сбоя подключения Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Кластер Redis

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

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

SignalR В приложении включите все возможные узлы Redis с помощью любого из следующих подходов:

  • Перечислите узлы в строке подключения, разделённые запятыми.
  • Если вы используете настраиваемое поведение для сбоев подключения, добавьте узлы в ConfigurationOptions.Endpoints.

Следующие шаги

Дополнительные сведения см. на следующих ресурсах:

В этой статье описываются SignalRконкретные аспекты настройки сервера Redis для масштабирования приложения ASP.NET Core SignalR .

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

В этой статье показано использование строк подключения. При использовании локальной базы данных для разработки и тестирования проверка подлинности пользователя базы данных через строку подключения не требуется. В рабочих средах строки подключения иногда включают пароль для проверки подлинности доступа к базе данных или операций базы данных. Учетные данные владельца ресурса (ROPC) в строке подключения представляют собой риск безопасности в производственных приложениях. Рабочие приложения должны использовать самый безопасный поток проверки подлинности. Дополнительные сведения о проверке подлинности для приложений, развернутых в тестовых или рабочих средах, см. в ASP.NET разделах по безопасности Core.

Настройка серверного плана Redis

  • Разверните сервер Redis.

    Внимание

    Для использования в рабочей среде рекомендуется бэкплейн Redis, только если он работает в том же центре обработки данных, что и приложение SignalR. В противном случае задержка сети снижает производительность. Если ваше SignalR приложение работает в облаке Azure, рекомендуется использовать службу Azure SignalR вместо серверной части Redis.

    Дополнительные сведения см. на следующих ресурсах:

  • SignalR В приложении установите следующий пакет NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • В методе Startup.ConfigureServices вызовите AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Настройте параметры по мере необходимости:

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

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

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    В приведенном выше коде options.Configuration инициализируется тем, что было указано в строке подключения.

    Сведения о параметрах Redis см. в документации по StackExchange Redis.

  • Если вы используете один сервер Redis для нескольких SignalR приложений, используйте для каждого приложения префикс канала SignalR .

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

  • Настройте программное обеспечение балансировки нагрузки фермы серверов для липких сеансов. Ниже приведены некоторые примеры документации о том, как это сделать:

Ошибки сервера Redis

Когда сервер Redis выходит из строя, вызывает исключения, указывающие, SignalR что сообщения не будут доставлены. Некоторые типичные сообщения об исключениях:

  • Ошибка записи сообщения
  • Не удалось вызвать метод концентратора "MethodName"
  • Сбой подключения к Redis

SignalR не буферизирует сообщения для их отправки, когда сервер снова заработает. Все сообщения, отправленные во время простоя сервера Redis, теряются.

SignalR автоматически повторно подключается, когда сервер Redis снова доступен.

Настраиваемое поведение при сбоях подключения

Ниже приведен пример обработки событий сбоя подключения Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Кластер Redis

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

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

SignalR В приложении включите все возможные узлы Redis с помощью любого из следующих подходов:

  • Перечислите узлы в строке подключения, разделённые запятыми.
  • Если вы используете настраиваемое поведение для сбоев подключения, добавьте узлы в ConfigurationOptions.Endpoints.

Следующие шаги

Дополнительные сведения см. на следующих ресурсах:

В этой статье описываются SignalRконкретные аспекты настройки сервера Redis для масштабирования приложения ASP.NET Core SignalR .

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

В этой статье показано использование строк подключения. При использовании локальной базы данных для разработки и тестирования проверка подлинности пользователя базы данных через строку подключения не требуется. В рабочих средах строки подключения иногда включают пароль для проверки подлинности доступа к базе данных или операций базы данных. Учетные данные владельца ресурса (ROPC) в строке подключения представляют собой риск безопасности в производственных приложениях. Рабочие приложения должны использовать самый безопасный поток проверки подлинности. Дополнительные сведения о проверке подлинности для приложений, развернутых в тестовых или рабочих средах, см. в ASP.NET разделах по безопасности Core.

Настройка серверного плана Redis

  • Разверните сервер Redis.

    Внимание

    Для использования в рабочей среде рекомендуется бэкплейн Redis, только если он работает в том же центре обработки данных, что и приложение SignalR. В противном случае задержка сети снижает производительность. Если ваше SignalR приложение работает в облаке Azure, рекомендуется использовать службу Azure SignalR вместо серверной части Redis.

    Дополнительные сведения см. на следующих ресурсах:

  • SignalR В приложении установите следующий пакет NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • В методе Startup.ConfigureServices вызовите AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Настройте параметры по мере необходимости:

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

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

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    В приведенном выше коде options.Configuration инициализируется тем, что было указано в строке подключения.

    Сведения о параметрах Redis см. в документации по StackExchange Redis.

  • Если вы используете один сервер Redis для нескольких SignalR приложений, используйте для каждого приложения префикс канала SignalR .

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

  • Настройте программное обеспечение балансировки нагрузки фермы серверов для липких сеансов. Ниже приведены некоторые примеры документации о том, как это сделать:

Ошибки сервера Redis

Когда сервер Redis выходит из строя, вызывает исключения, указывающие, SignalR что сообщения не будут доставлены. Некоторые типичные сообщения об исключениях:

  • Ошибка записи сообщения
  • Не удалось вызвать метод концентратора "MethodName"
  • Сбой подключения к Redis

SignalR не буферизирует сообщения для их отправки, когда сервер снова заработает. Все сообщения, отправленные во время простоя сервера Redis, теряются.

SignalR автоматически повторно подключается, когда сервер Redis снова доступен.

Настраиваемое поведение при сбоях подключения

Ниже приведен пример обработки событий сбоя подключения Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Кластер Redis

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

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

SignalR В приложении включите все возможные узлы Redis с помощью любого из следующих подходов:

  • Перечислите узлы в строке подключения, разделённые запятыми.
  • Если вы используете настраиваемое поведение для сбоев подключения, добавьте узлы в ConfigurationOptions.Endpoints.

Следующие шаги

Дополнительные сведения см. на следующих ресурсах:

В этой статье описываются SignalRконкретные аспекты настройки сервера Redis для масштабирования приложения ASP.NET Core SignalR .

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

В этой статье показано использование строк подключения. При использовании локальной базы данных для разработки и тестирования проверка подлинности пользователя базы данных через строку подключения не требуется. В рабочих средах строки подключения иногда включают пароль для проверки подлинности доступа к базе данных или операций базы данных. Учетные данные владельца ресурса (ROPC) в строке подключения представляют собой риск безопасности в производственных приложениях. Рабочие приложения должны использовать самый безопасный поток проверки подлинности. Дополнительные сведения о проверке подлинности для приложений, развернутых в тестовых или рабочих средах, см. в ASP.NET разделах по безопасности Core.

Настройка серверного плана Redis

  • Разверните сервер Redis.

    Внимание

    Для использования в рабочей среде рекомендуется бэкплейн Redis, только если он работает в том же центре обработки данных, что и приложение SignalR. В противном случае задержка сети снижает производительность. Если ваше SignalR приложение работает в облаке Azure, рекомендуется использовать службу Azure SignalR вместо серверной части Redis.

    Дополнительные сведения см. на следующих ресурсах:

  • SignalR В приложении установите один из следующих пакетов NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis — зависит от StackExchange.Redis 2.X.X. Это рекомендуемый пакет для ASP.NET Core 2.2 или более поздней версии.
    • Microsoft.AspNetCore.SignalR.Redis — зависит от StackExchange.Redis 1.X.X. Этот пакет не включен в ASP.NET Core 3.0 или более поздней версии.
  • В методе Startup.ConfigureServices вызовите AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    

При использовании Microsoft.AspNetCore.SignalR.Redisвызовите AddRedis.

  • Настройте параметры по мере необходимости:

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

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

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

При использовании Microsoft.AspNetCore.SignalR.Redisвызовите AddRedis.

В приведенном выше коде options.Configuration инициализируется тем, что было указано в строке подключения.

Сведения о параметрах Redis см. в документации по StackExchange Redis.

  • Если вы используете один сервер Redis для нескольких SignalR приложений, используйте для каждого приложения префикс канала SignalR .

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

  • Настройте программное обеспечение балансировки нагрузки фермы серверов для липких сеансов. Ниже приведены некоторые примеры документации о том, как это сделать:

Ошибки сервера Redis

Когда сервер Redis выходит из строя, вызывает исключения, указывающие, SignalR что сообщения не будут доставлены. Некоторые типичные сообщения об исключениях:

  • Ошибка записи сообщения
  • Не удалось вызвать метод концентратора "MethodName"
  • Сбой подключения к Redis

SignalR не буферизирует сообщения для их отправки, когда сервер снова заработает. Все сообщения, отправленные во время простоя сервера Redis, теряются.

SignalR автоматически повторно подключается, когда сервер Redis снова доступен.

Настраиваемое поведение при сбоях подключения

Ниже приведен пример обработки событий сбоя подключения Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Кластер Redis

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

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

SignalR В приложении включите все возможные узлы Redis с помощью любого из следующих подходов:

  • Перечислите узлы в строке подключения, разделённые запятыми.
  • Если вы используете настраиваемое поведение для сбоев подключения, добавьте узлы в ConfigurationOptions.Endpoints.

Следующие шаги

Дополнительные сведения см. на следующих ресурсах:

В этой статье описываются SignalRконкретные аспекты настройки сервера Redis для масштабирования приложения ASP.NET Core SignalR .

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

В этой статье показано использование строк подключения. При использовании локальной базы данных для разработки и тестирования проверка подлинности пользователя базы данных через строку подключения не требуется. В рабочих средах строки подключения иногда включают пароль для проверки подлинности доступа к базе данных или операций базы данных. Учетные данные владельца ресурса (ROPC) в строке подключения представляют собой риск безопасности в производственных приложениях. Рабочие приложения должны использовать самый безопасный поток проверки подлинности. Дополнительные сведения о проверке подлинности для приложений, развернутых в тестовых или рабочих средах, см. в ASP.NET разделах по безопасности Core.

Настройка серверного плана Redis

  • Разверните сервер Redis.

    Внимание

    Для использования в рабочей среде рекомендуется бэкплейн Redis, только если он работает в том же центре обработки данных, что и приложение SignalR. В противном случае задержка сети снижает производительность. Если ваше SignalR приложение работает в облаке Azure, рекомендуется использовать службу Azure SignalR вместо серверной части Redis.

    Дополнительные сведения см. на следующих ресурсах:

  • В приложении SignalR установите пакет NuGet Microsoft.AspNetCore.SignalR.Redis.

  • В методе Startup.ConfigureServices вызовите AddRedis после AddSignalR:

    services.AddSignalR().AddRedis("<your_Redis_connection_string>");
    
  • Настройте параметры по мере необходимости:

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

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

    services.AddSignalR()
      .AddRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    В приведенном выше коде options.Configuration инициализируется тем, что было указано в строке подключения.

  • Если вы используете один сервер Redis для нескольких SignalR приложений, используйте для каждого приложения префикс канала SignalR .

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

  • Настройте программное обеспечение балансировки нагрузки фермы серверов для липких сеансов. Ниже приведены некоторые примеры документации о том, как это сделать:

Ошибки сервера Redis

Когда сервер Redis выходит из строя, вызывает исключения, указывающие, SignalR что сообщения не будут доставлены. Некоторые типичные сообщения об исключениях:

  • Ошибка записи сообщения
  • Не удалось вызвать метод концентратора "MethodName"
  • Сбой подключения к Redis

SignalR не буферизирует сообщения для их отправки, когда сервер снова заработает. Все сообщения, отправленные во время простоя сервера Redis, теряются.

SignalR автоматически повторно подключается, когда сервер Redis снова доступен.

Настраиваемое поведение при сбоях подключения

Ниже приведен пример обработки событий сбоя подключения Redis.

services.AddSignalR()
        .AddRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Кластер Redis

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

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

SignalR В приложении включите все возможные узлы Redis с помощью любого из следующих подходов:

  • Перечислите узлы в строке подключения, разделённые запятыми.
  • Если вы используете настраиваемое поведение для сбоев подключения, добавьте узлы в ConfigurationOptions.Endpoints.

Следующие шаги

Дополнительные сведения см. на следующих ресурсах: