Ölçeğini daha fazla ölçeklendirmek için redis ASP.NET Core SignalR planı ayarlama

Andrew Stanton-Brady, Brady Gasterve Tom Dykstra tarafından,

Bu makalede, SignalR bir redis sunucusunu bir uygulamanın ölçeğini genişletmede kullanmak üzere ayarlamanın belirli ASP.NET Core SignalR açıklanmıştır.

Redis arka plan ayarlama

  • Bir Redis sunucusu dağıtın.

    Önemli

    Üretimde kullanım için redis arka plan yalnızca uygulamayla aynı veri merkezinde çalıştırıldıklarında SignalR önerilir. Aksi takdirde, ağ gecikmesi performansı düşürebilir. Uygulamanız SignalR Azure bulut üzerinde çalışıyorsa Redis arka planı yerine Azure SignalR Hizmeti'nin kullanılması önerilir.

    Daha fazla bilgi için aşağıdaki kaynaklara bakın:

  • Uygulamada, SignalR NuGet Microsoft.AspNetCore.SignalR.Redis yükleyin.

  • yönteminde Startup.ConfigureServices çağrısının AddRedis AddSignalR ardından:

    services.AddSignalR().AddRedis("<your_Redis_connection_string>");
    
  • Seçenekleri gereken şekilde yapılandırma:

    Çoğu seçenek bağlantı dizesinde veya ConfigurationOptions nesnesinde ayarlanabilirsiniz. içinde belirtilen ConfigurationOptions seçenekler, bağlantı dizesinde ayarlanmış olanları geçersiz kılar.

    Aşağıdaki örnekte, nesnesinde seçeneklerin nasıl ayarlay olduğu ConfigurationOptions gösterir. Bu örnek, aşağıdaki adımda açıklanan şekilde birden çok uygulamanın aynı Redis örneğini paylaşarak bir kanal ön eki ekler.

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

    Yukarıdaki kodda, options.Configuration bağlantı dizesinde belirtilen değerle başlatılır.

  • Uygulamada SignalR aşağıdaki paketlerden birini NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis - StackExchange.Redis 2.X.X'e bağlıdır. Bu, 2.2 ve ASP.NET Core için önerilen pakettir.
    • Microsoft.AspNetCore.SignalR.Redis - StackExchange.Redis 1.X.X'e bağlıdır. Bu paket, 3.0 ve ASP.NET Core pakete dahil değildir.
  • yönteminde Startup.ConfigureServices çağrısında: AddStackExchangeRedis

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

kullanırken Microsoft.AspNetCore.SignalR.Redis çağrısı. AddRedis

  • Seçenekleri gereken şekilde yapılandırma:

    Çoğu seçenek bağlantı dizesinde veya ConfigurationOptions nesnesinde ayarlanabilirsiniz. içinde belirtilen ConfigurationOptions seçenekler, bağlantı dizesinde ayarlanmış olanları geçersiz kılar.

    Aşağıdaki örnekte, nesnesinde seçeneklerin nasıl ayarlay olduğu ConfigurationOptions gösterir. Bu örnek, aşağıdaki adımda açıklanan şekilde birden çok uygulamanın aynı Redis örneğini paylaşarak bir kanal ön eki ekler.

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

kullanırken Microsoft.AspNetCore.SignalR.Redis çağrısı. AddRedis

Yukarıdaki kodda, options.Configuration bağlantı dizesinde belirtilen değerle başlatılır.

Redis seçenekleri hakkında bilgi için StackExchange Redis belgelerine bakın.

  • Uygulamada, SignalR aşağıdaki NuGet yükleyin:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • yönteminde Startup.ConfigureServices çağrısında: AddStackExchangeRedis

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Seçenekleri gereken şekilde yapılandırma:

    Çoğu seçenek bağlantı dizesinde veya ConfigurationOptions nesnesinde ayarlanabilirsiniz. içinde belirtilen ConfigurationOptions seçenekler, bağlantı dizesinde ayarlanmış olanları geçersiz kılar.

    Aşağıdaki örnekte, nesnesinde seçeneklerin nasıl ayarlay olduğu ConfigurationOptions gösterir. Bu örnek, aşağıdaki adımda açıklanan şekilde birden çok uygulamanın aynı Redis örneğini paylaşarak bir kanal ön eki ekler.

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

    Yukarıdaki kodda, options.Configuration bağlantı dizesinde belirtilen değerle başlatılır.

    Redis seçenekleri hakkında bilgi için StackExchange Redis belgelerine bakın.

  • Birden çok uygulama için bir Redis sunucusu SignalR kullanıyorsanız, her uygulama için farklı bir kanal ön eki SignalR kullanın.

    Kanal ön eki ayarı, bir SignalR uygulamayı farklı kanal ön ekleri kullanan diğer uygulamalardan yalıtır. Farklı ön ekler atamayacaksanız, bir uygulamanın kendi istemcilerinin tamamlarına gönderilen bir ileti, Redis sunucusunu kullanan tüm uygulamaların tüm istemcilerine bir arka plan olarak gider.

  • Sunucu grubu yük dengeleme yazılımınızı yapışkan oturumlar için yapılandırma. Bunun nasıl yap örnekleri aşağıda verilmiştir:

Redis sunucusu hataları

Bir Redis sunucusu SignalR kapatılana kadar iletilerin teslim olmadığını belirten özel durumlar oluşturur. Bazı tipik özel durum iletileri:

  • İleti yazılamadı
  • 'MethodName' hub yöntemi çağrılaamadı
  • Redis bağlantısı başarısız oldu

SignalR , sunucu geri geldiğinde iletileri göndermek için arabelleğe almaz. Redis sunucusu çalışırken gönderilen iletiler kaybolur.

SignalR Redis sunucusu yeniden kullanılabilir olduğunda otomatik olarak yeniden bağlanır.

Bağlantı hataları için özel davranış

Redis bağlantı hatası olaylarını işlemeyi gösteren bir örnek burada veserdedir.

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 Kümeleme

Redis Kümeleme, birden çok Redis sunucusu kullanarak yüksek kullanılabilirlik elde etmek için kullanılan bir yöntemdir. Kümeleme resmi olarak desteklenmez, ancak işe de kullanılabilir.

Sonraki adımlar

Daha fazla bilgi için aşağıdaki kaynaklara bakın: