Nastavení propojovacího roviny Redis pro ASP.NET Core SignalR horizontálního navýšení velikosti

Andrew Stanton-Nurse, Brady Gastera Tom Dykstra

Tento článek vysvětluje konkrétní aspekty nastavení serveru Redis pro horizontální navýšení SignalR kapacity ASP.NET Core SignalR aplikace.

Nastavení propojovacího roviny Redis

  • V SignalR aplikaci nainstalujte balíček Microsoft.AspNetCore.SignalR.Redis NuGet.

  • V Startup.ConfigureServices metodě volejte AddRedis po AddSignalR :

    services.AddSignalR().AddRedis("<your_Redis_connection_string>");
    
  • Podle potřeby nakonfigurujte možnosti:

    Většinu možností lze nastavit v připojovacím řetězci nebo v objektu ConfigurationOptions. Možnosti zadané v ConfigurationOptions přepíší ty, které jsou nastavené v připojovacím řetězci.

    Následující příklad ukazuje, jak nastavit možnosti v ConfigurationOptions objektu . Tento příklad přidá předponu kanálu, aby několik aplikací sdílelo stejnou instanci Redis, jak je vysvětleno v následujícím kroku.

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

    V předchozím kódu se inicializuje s options.Configuration čímkoli, co bylo zadáno v připojovacím řetězci.

  • V SignalR aplikaci nainstalujte jeden z následujících balíčků NuGet souborů:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis – Závisí na StackExchange.Redis 2.X.X. Toto je doporučený balíček pro ASP.NET Core 2.2 a novější.
    • Microsoft.AspNetCore.SignalR.Redis – Závisí na StackExchange.Redis 1.X.X. Tento balíček není součástí verze ASP.NET Core 3.0 a novější.
  • V Startup.ConfigureServices metodě volejte AddStackExchangeRedis :

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

Při použití Microsoft.AspNetCore.SignalR.Redis volejte AddRedis .

  • Podle potřeby nakonfigurujte možnosti:

    Většinu možností lze nastavit v připojovacím řetězci nebo v objektu ConfigurationOptions. Možnosti zadané v ConfigurationOptions přepíší ty, které jsou nastavené v připojovacím řetězci.

    Následující příklad ukazuje, jak nastavit možnosti v ConfigurationOptions objektu . Tento příklad přidá předponu kanálu, aby několik aplikací sdílelo stejnou instanci Redis, jak je vysvětleno v následujícím kroku.

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

Při použití Microsoft.AspNetCore.SignalR.Redis volejte AddRedis .

V předchozím kódu se inicializuje s options.Configuration čímkoli, co bylo zadáno v připojovacím řetězci.

Informace o možnostech Redis najdete v dokumentaci k StackExchange Redis.

  • V SignalR aplikaci nainstalujte následující NuGet balíčku:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • V Startup.ConfigureServices metodě volejte AddStackExchangeRedis :

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Podle potřeby nakonfigurujte možnosti:

    Většinu možností lze nastavit v připojovacím řetězci nebo v objektu ConfigurationOptions. Možnosti zadané v ConfigurationOptions přepíší ty, které jsou nastavené v připojovacím řetězci.

    Následující příklad ukazuje, jak nastavit možnosti v ConfigurationOptions objektu . Tento příklad přidá předponu kanálu, aby několik aplikací sdílelo stejnou instanci Redis, jak je vysvětleno v následujícím kroku.

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

    V předchozím kódu se inicializuje s options.Configuration čímkoli, co bylo zadáno v připojovacím řetězci.

    Informace o možnostech Redis najdete v dokumentaci k StackExchange Redis.

  • Pokud používáte jeden server Redis pro více aplikací, použijte pro každou aplikaci SignalR jinou předponu SignalR kanálu.

    Nastavení předpony kanálu izoluje SignalR jednu aplikaci od ostatních, které používají jiné předpony kanálu. Pokud přiřazování různých předpon nezadáte, zpráva odeslaná z jedné aplikace všem vlastním klientům se zobrazí všem klientům všech aplikací, které používají server Redis jako propojovací rozhraní.

  • Nakonfigurujte software pro vyrovnávání zatížení serverové farmy pro přichycené relace. Tady je několik příkladů dokumentace, jak to udělat:

Chyby serveru Redis

Když server Redis přejde do stavu dolů, SignalR vyvolá výjimky, které indikují, že zprávy nebudou doručeny. Některé typické zprávy o výjimce:

  • Neúspěšný zápis zprávy
  • Nepodařilo se vyvolat metodu centra MethodName.
  • Připojení k Redis selhalo

SignalR nenasauje zprávy do vyrovnávací paměti, aby je po návratu serveru posílala do vyrovnávací paměti. Všechny zprávy odeslané v době, kdy je server Redis mimo systém, se ztratí.

SignalR se automaticky znovu připojí, jakmile bude server Redis opět dostupný.

Vlastní chování při selhání připojení

Tady je příklad, který ukazuje, jak zpracovat události selhání připojení 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;
            };
        });
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 Clustering

Clustering Redis je metoda pro dosažení vysoké dostupnosti pomocí několika serverů Redis. Clustering se oficiálně nepodporuje, ale může to fungovat.

Další kroky

Další informace naleznete v následujících zdrojích: