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

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

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

Настройка серверного плана 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 .

Настройка серверного плана 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 .

Настройка серверного плана 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 .

Настройка серверного плана 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 .

Настройка серверного плана 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 .

Настройка серверного плана 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 .

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

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

    Важно!

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

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

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

  • В методе 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в .

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

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