設定 ASP.NET Core SignalR 向外延展的 Redis 後擋板

安德魯·斯坦頓-護士佈雷迪·加斯特湯姆·戴克斯特拉

本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。

設定 Redis 後擋板

  • 部署 Redis 伺服器。

    重要

    若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 Redis 後擋板。

    如需詳細資訊,請參閱以下資源:

  • 在 SignalR 應用程式中,安裝下列 NuGet 套件:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • 在檔案中Program.cs呼叫 的行前面加入下列這一行,以呼叫 。AddStackExchangeRedisbuilder.Build()

    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 文件

  • 如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。

    設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。

  • 為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:

Redis 伺服器錯誤

當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:

  • 寫入訊息失敗
  • 無法叫用中樞方法 'MethodName'
  • 對 Redis 的連線失敗

SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。

當 Redis 伺服器再次可用時,SignalR 會自動重新連線。

連線失敗的自訂行為

以下是示範如何處理 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

下一步

如需詳細資訊,請參閱以下資源:

本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。

設定 Redis 後擋板

  • 部署 Redis 伺服器。

    重要

    若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 Redis 後擋板。

    如需詳細資訊,請參閱以下資源:

  • 在 SignalR 應用程式中,安裝下列 NuGet 套件:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • 在檔案中Program.cs呼叫 的行前面加入下列這一行,以呼叫 。AddStackExchangeRedisbuilder.Build()

    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 文件

  • 如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。

    設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。

  • 為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:

Redis 伺服器錯誤

當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:

  • 寫入訊息失敗
  • 無法叫用中樞方法 'MethodName'
  • 對 Redis 的連線失敗

SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。

當 Redis 伺服器再次可用時,SignalR 會自動重新連線。

連線失敗的自訂行為

以下是示範如何處理 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

下一步

如需詳細資訊,請參閱以下資源:

本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。

設定 Redis 後擋板

  • 部署 Redis 伺服器。

    重要

    若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 Redis 後擋板。

    如需詳細資訊,請參閱以下資源:

  • 在 SignalR 應用程式中,安裝下列 NuGet 套件:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • 在檔案中Program.cs呼叫 的行前面加入下列這一行,以呼叫 。AddStackExchangeRedisbuilder.Build()

    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 文件

  • 如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。

    設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。

  • 為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:

Redis 伺服器錯誤

當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:

  • 寫入訊息失敗
  • 無法叫用中樞方法 'MethodName'
  • 對 Redis 的連線失敗

SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。

當 Redis 伺服器再次可用時,SignalR 會自動重新連線。

連線失敗的自訂行為

以下是示範如何處理 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

下一步

如需詳細資訊,請參閱以下資源:

本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。

設定 Redis 後擋板

  • 部署 Redis 伺服器。

    重要

    若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 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 文件

  • 如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。

    設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。

  • 為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:

Redis 伺服器錯誤

當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:

  • 寫入訊息失敗
  • 無法叫用中樞方法 'MethodName'
  • 對 Redis 的連線失敗

SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。

當 Redis 伺服器再次可用時,SignalR 會自動重新連線。

連線失敗的自訂行為

以下是示範如何處理 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

下一步

如需詳細資訊,請參閱以下資源:

本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。

設定 Redis 後擋板

  • 部署 Redis 伺服器。

    重要

    若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 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 文件

  • 如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。

    設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。

  • 為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:

Redis 伺服器錯誤

當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:

  • 寫入訊息失敗
  • 無法叫用中樞方法 'MethodName'
  • 對 Redis 的連線失敗

SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。

當 Redis 伺服器再次可用時,SignalR 會自動重新連線。

連線失敗的自訂行為

以下是示範如何處理 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

下一步

如需詳細資訊,請參閱以下資源:

本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。

設定 Redis 後擋板

  • 部署 Redis 伺服器。

    重要

    若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 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。此套件不包含在 Core 3.0 和更新版本中 ASP.NET。
  • 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 文件

  • 如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。

    設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。

  • 為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:

Redis 伺服器錯誤

當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:

  • 寫入訊息失敗
  • 無法叫用中樞方法 'MethodName'
  • 對 Redis 的連線失敗

SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。

當 Redis 伺服器再次可用時,SignalR 會自動重新連線。

連線失敗的自訂行為

以下是示範如何處理 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

下一步

如需詳細資訊,請參閱以下資源:

本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。

設定 Redis 後擋板

  • 部署 Redis 伺服器。

    重要

    若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 Redis 後擋板。

    如需詳細資訊,請參閱以下資源:

  • 在 SignalR 應用程式中,安裝 Microsoft.AspNetCore.SignalR.Redis NuGet 套件。

  • Startup.ConfigureServices 方法中,呼叫 AddSignalR 之後的 AddRedis

    services.AddSignalR().AddRedis("<your_Redis_connection_string>");
    
  • 視需要設定選項:

    大部分選項都可以在連接字串或 ConfigurationOptions 物件中設定。 ConfigurationOptions 中指定的選項會覆寫連接字串中設定的選項。

    下列範例示範如何在 ConfigurationOptions 物件中設定選項。 此範例會新增通道前置詞,讓多個應用程式可以共用相同的 Redis 執行個體,如下列步驟所述。

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

    在上述程式碼中,options.Configuration 會使用連接字串中指定的任何項目初始化。

  • 如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。

    設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。

  • 為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:

Redis 伺服器錯誤

當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:

  • 寫入訊息失敗
  • 無法叫用中樞方法 'MethodName'
  • 對 Redis 的連線失敗

SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。

當 Redis 伺服器再次可用時,SignalR 會自動重新連線。

連線失敗的自訂行為

以下是示範如何處理 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

下一步

如需詳細資訊,請參閱以下資源: