Partager via


Configurer un fond de panier Redis pour scale-out d'ASP.NET Core SignalR

Par Andrew Stanton-Nurse, Brady Gaster et Tom Dykstra.

Cet article explique les SignalR-aspects spécifiques de la configuration d'un serveur Redis à utiliser pour la mise à l'échelle d'une application ASP.NET Core SignalR.

Avertissement

Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.

Configurer un fond de panier Redis

  • Déployez un serveur Redis.

    Important

    Pour une utilisation en production, un fond de panier Redis est recommandé uniquement lorsqu'il s'exécute dans le même centre de données que l'application SignalR. Sinon, la latence du réseau dégrade les performances. Si votre application SignalR s'exécute dans le cloud Azure, nous recommandons le service SignalR Azure au lieu d'un fond de panier Redis.

    Pour plus d’informations, consultez les ressources suivantes :

  • Dans l'application SignalR, installez le package NuGet suivant :

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Appelez AddStackExchangeRedis en ajoutant la ligne suivante avant la ligne qui appelle builder.Build()) dans le fichier Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configurez les options selon vos besoins :

    La plupart des options peuvent être définies dans la chaîne de connexion ou dans l'objet ConfigurationOptions. Les options spécifiées dans ConfigurationOptions remplacent celles définies dans la chaîne de connexion.

    L'exemple suivant montre comment définir des options dans l'objet ConfigurationOptions. Cet exemple ajoute un préfixe de canal afin que plusieurs applications puissent partager la même instance Redis, comme expliqué à l'étape suivante.

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

    Dans le code précédent, options.Configuration est initialisé avec tout ce qui a été spécifié dans la chaîne de connexion.

    Pour plus d'informations sur les options Redis, consultez la documentation StackExchange Redis.

  • Si vous utilisez un serveur Redis pour plusieurs applications SignalR, utilisez un préfixe de canal différent pour chaque application SignalR.

    La définition d'un préfixe de canal isole une application SignalR des autres qui utilisent des préfixes de canal différents. Si vous n'attribuez pas de préfixes différents, un message envoyé d'une application à tous ses propres clients ira à tous les clients de toutes les applications qui utilisent le serveur Redis comme fond de panier.

  • Configurez le logiciel d'équilibrage de charge de votre batterie de serveurs pour les sessions permanentes. Voici quelques exemples de documentation sur la façon de procéder :

Erreurs du serveur Redis

Lorsqu'un serveur Redis tombe en panne, SignalR lève des exceptions qui indiquent que les messages ne seront pas remis. Quelques messages d'exception typiques :

  • Échec de l'écriture du message
  • Échec de l'appel de la méthode de concentrateur 'MethodName'
  • La connexion à Redis a échoué

SignalR ne met pas les messages en mémoire tampon pour les envoyer lorsque le serveur revient. Tous les messages envoyés pendant que le serveur Redis est en panne sont perdus.

SignalR se reconnecte automatiquement lorsque le serveur Redis est à nouveau disponible.

Comportement personnalisé pour les échecs de connexion

Voici un exemple qui montre comment gérer les événements d'échec de connexion 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;
            };
        });

Grappe Redis

Redis Cluster utilise plusieurs serveurs Redis actifs simultanément pour atteindre une haute disponibilité. Lorsque Redis Cluster est utilisé comme fond de panier pour SignalR, les messages sont distribués à tous les nœuds du cluster sans modification du code de l'application.

Il existe un compromis entre le nombre de nœuds dans le cluster et le débit du fond de panier. L'augmentation du nombre de nœuds augmente la disponibilité du cluster mais diminue le débit car les messages doivent être transmis à tous les nœuds du cluster.

Dans l'application SignalR, incluez tous les nœuds Redis possibles en utilisant l'une des approches suivantes :

  • Répertoriez les nœuds dans la chaîne de connexion délimités par des virgules.
  • Si vous utilisez un comportement personnalisé pour les échecs de connexion, ajoutez les nœuds à ConfigurationOptions.Endpoints.

Étapes suivantes

Pour plus d’informations, consultez les ressources suivantes :

Cet article explique les SignalR-aspects spécifiques de la configuration d'un serveur Redis à utiliser pour la mise à l'échelle d'une application ASP.NET Core SignalR.

Avertissement

Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.

Configurer un fond de panier Redis

  • Déployez un serveur Redis.

    Important

    Pour une utilisation en production, un fond de panier Redis est recommandé uniquement lorsqu'il s'exécute dans le même centre de données que l'application SignalR. Sinon, la latence du réseau dégrade les performances. Si votre application SignalR s'exécute dans le cloud Azure, nous recommandons le service SignalR Azure au lieu d'un fond de panier Redis.

    Pour plus d’informations, consultez les ressources suivantes :

  • Dans l'application SignalR, installez le package NuGet suivant :

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Appelez AddStackExchangeRedis en ajoutant la ligne suivante avant la ligne qui appelle builder.Build()) dans le fichier Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configurez les options selon vos besoins :

    La plupart des options peuvent être définies dans la chaîne de connexion ou dans l'objet ConfigurationOptions. Les options spécifiées dans ConfigurationOptions remplacent celles définies dans la chaîne de connexion.

    L'exemple suivant montre comment définir des options dans l'objet ConfigurationOptions. Cet exemple ajoute un préfixe de canal afin que plusieurs applications puissent partager la même instance Redis, comme expliqué à l'étape suivante.

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

    Dans le code précédent, options.Configuration est initialisé avec tout ce qui a été spécifié dans la chaîne de connexion.

    Pour plus d'informations sur les options Redis, consultez la documentation StackExchange Redis.

  • Si vous utilisez un serveur Redis pour plusieurs applications SignalR, utilisez un préfixe de canal différent pour chaque application SignalR.

    La définition d'un préfixe de canal isole une application SignalR des autres qui utilisent des préfixes de canal différents. Si vous n'attribuez pas de préfixes différents, un message envoyé d'une application à tous ses propres clients ira à tous les clients de toutes les applications qui utilisent le serveur Redis comme fond de panier.

  • Configurez le logiciel d'équilibrage de charge de votre batterie de serveurs pour les sessions permanentes. Voici quelques exemples de documentation sur la façon de procéder :

Erreurs du serveur Redis

Lorsqu'un serveur Redis tombe en panne, SignalR lève des exceptions qui indiquent que les messages ne seront pas remis. Quelques messages d'exception typiques :

  • Échec de l'écriture du message
  • Échec de l'appel de la méthode de concentrateur 'MethodName'
  • La connexion à Redis a échoué

SignalR ne met pas les messages en mémoire tampon pour les envoyer lorsque le serveur revient. Tous les messages envoyés pendant que le serveur Redis est en panne sont perdus.

SignalR se reconnecte automatiquement lorsque le serveur Redis est à nouveau disponible.

Comportement personnalisé pour les échecs de connexion

Voici un exemple qui montre comment gérer les événements d'échec de connexion 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;
            };
        });

Grappe Redis

Redis Cluster utilise plusieurs serveurs Redis actifs simultanément pour atteindre une haute disponibilité. Lorsque Redis Cluster est utilisé comme fond de panier pour SignalR, les messages sont distribués à tous les nœuds du cluster sans modification du code de l'application.

Il existe un compromis entre le nombre de nœuds dans le cluster et le débit du fond de panier. L'augmentation du nombre de nœuds augmente la disponibilité du cluster mais diminue le débit car les messages doivent être transmis à tous les nœuds du cluster.

Dans l'application SignalR, incluez tous les nœuds Redis possibles en utilisant l'une des approches suivantes :

  • Répertoriez les nœuds dans la chaîne de connexion délimités par des virgules.
  • Si vous utilisez un comportement personnalisé pour les échecs de connexion, ajoutez les nœuds à ConfigurationOptions.Endpoints.

Étapes suivantes

Pour plus d’informations, consultez les ressources suivantes :

Cet article explique les SignalR-aspects spécifiques de la configuration d'un serveur Redis à utiliser pour la mise à l'échelle d'une application ASP.NET Core SignalR.

Avertissement

Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.

Configurer un fond de panier Redis

  • Déployez un serveur Redis.

    Important

    Pour une utilisation en production, un fond de panier Redis est recommandé uniquement lorsqu'il s'exécute dans le même centre de données que l'application SignalR. Sinon, la latence du réseau dégrade les performances. Si votre application SignalR s'exécute dans le cloud Azure, nous recommandons le service SignalR Azure au lieu d'un fond de panier Redis.

    Pour plus d’informations, consultez les ressources suivantes :

  • Dans l'application SignalR, installez le package NuGet suivant :

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Appelez AddStackExchangeRedis en ajoutant la ligne suivante avant la ligne qui appelle builder.Build()) dans le fichier Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configurez les options selon vos besoins :

    La plupart des options peuvent être définies dans la chaîne de connexion ou dans l'objet ConfigurationOptions. Les options spécifiées dans ConfigurationOptions remplacent celles définies dans la chaîne de connexion.

    L'exemple suivant montre comment définir des options dans l'objet ConfigurationOptions. Cet exemple ajoute un préfixe de canal afin que plusieurs applications puissent partager la même instance Redis, comme expliqué à l'étape suivante.

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

    Dans le code précédent, options.Configuration est initialisé avec tout ce qui a été spécifié dans la chaîne de connexion.

    Pour plus d'informations sur les options Redis, consultez la documentation StackExchange Redis.

  • Si vous utilisez un serveur Redis pour plusieurs applications SignalR, utilisez un préfixe de canal différent pour chaque application SignalR.

    La définition d'un préfixe de canal isole une application SignalR des autres qui utilisent des préfixes de canal différents. Si vous n'attribuez pas de préfixes différents, un message envoyé d'une application à tous ses propres clients ira à tous les clients de toutes les applications qui utilisent le serveur Redis comme fond de panier.

  • Configurez le logiciel d'équilibrage de charge de votre batterie de serveurs pour les sessions permanentes. Voici quelques exemples de documentation sur la façon de procéder :

Erreurs du serveur Redis

Lorsqu'un serveur Redis tombe en panne, SignalR lève des exceptions qui indiquent que les messages ne seront pas remis. Quelques messages d'exception typiques :

  • Échec de l'écriture du message
  • Échec de l'appel de la méthode de concentrateur 'MethodName'
  • La connexion à Redis a échoué

SignalR ne met pas les messages en mémoire tampon pour les envoyer lorsque le serveur revient. Tous les messages envoyés pendant que le serveur Redis est en panne sont perdus.

SignalR se reconnecte automatiquement lorsque le serveur Redis est à nouveau disponible.

Comportement personnalisé pour les échecs de connexion

Voici un exemple qui montre comment gérer les événements d'échec de connexion 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;
            };
        });

Grappe Redis

Redis Cluster utilise plusieurs serveurs Redis actifs simultanément pour atteindre une haute disponibilité. Lorsque Redis Cluster est utilisé comme fond de panier pour SignalR, les messages sont distribués à tous les nœuds du cluster sans modification du code de l'application.

Il existe un compromis entre le nombre de nœuds dans le cluster et le débit du fond de panier. L'augmentation du nombre de nœuds augmente la disponibilité du cluster mais diminue le débit car les messages doivent être transmis à tous les nœuds du cluster.

Dans l'application SignalR, incluez tous les nœuds Redis possibles en utilisant l'une des approches suivantes :

  • Répertoriez les nœuds dans la chaîne de connexion délimités par des virgules.
  • Si vous utilisez un comportement personnalisé pour les échecs de connexion, ajoutez les nœuds à ConfigurationOptions.Endpoints.

Étapes suivantes

Pour plus d’informations, consultez les ressources suivantes :

Cet article explique les SignalR-aspects spécifiques de la configuration d'un serveur Redis à utiliser pour la mise à l'échelle d'une application ASP.NET Core SignalR.

Avertissement

Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.

Configurer un fond de panier Redis

  • Déployez un serveur Redis.

    Important

    Pour une utilisation en production, un fond de panier Redis est recommandé uniquement lorsqu'il s'exécute dans le même centre de données que l'application SignalR. Sinon, la latence du réseau dégrade les performances. Si votre application SignalR s'exécute dans le cloud Azure, nous recommandons le service SignalR Azure au lieu d'un fond de panier Redis.

    Pour plus d’informations, consultez les ressources suivantes :

  • Dans l'application SignalR, installez le package NuGet suivant :

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Dans la méthode Startup.ConfigureServices, appelez AddStackExchangeRedis :

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configurez les options selon vos besoins :

    La plupart des options peuvent être définies dans la chaîne de connexion ou dans l'objet ConfigurationOptions. Les options spécifiées dans ConfigurationOptions remplacent celles définies dans la chaîne de connexion.

    L'exemple suivant montre comment définir des options dans l'objet ConfigurationOptions. Cet exemple ajoute un préfixe de canal afin que plusieurs applications puissent partager la même instance Redis, comme expliqué à l'étape suivante.

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

    Dans le code précédent, options.Configuration est initialisé avec tout ce qui a été spécifié dans la chaîne de connexion.

    Pour plus d'informations sur les options Redis, consultez la documentation StackExchange Redis.

  • Si vous utilisez un serveur Redis pour plusieurs applications SignalR, utilisez un préfixe de canal différent pour chaque application SignalR.

    La définition d'un préfixe de canal isole une application SignalR des autres qui utilisent des préfixes de canal différents. Si vous n'attribuez pas de préfixes différents, un message envoyé d'une application à tous ses propres clients ira à tous les clients de toutes les applications qui utilisent le serveur Redis comme fond de panier.

  • Configurez le logiciel d'équilibrage de charge de votre batterie de serveurs pour les sessions permanentes. Voici quelques exemples de documentation sur la façon de procéder :

Erreurs du serveur Redis

Lorsqu'un serveur Redis tombe en panne, SignalR lève des exceptions qui indiquent que les messages ne seront pas remis. Quelques messages d'exception typiques :

  • Échec de l'écriture du message
  • Échec de l'appel de la méthode de concentrateur 'MethodName'
  • La connexion à Redis a échoué

SignalR ne met pas les messages en mémoire tampon pour les envoyer lorsque le serveur revient. Tous les messages envoyés pendant que le serveur Redis est en panne sont perdus.

SignalR se reconnecte automatiquement lorsque le serveur Redis est à nouveau disponible.

Comportement personnalisé pour les échecs de connexion

Voici un exemple qui montre comment gérer les événements d'échec de connexion 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;
            };
        });

Grappe Redis

Redis Cluster utilise plusieurs serveurs Redis actifs simultanément pour atteindre une haute disponibilité. Lorsque Redis Cluster est utilisé comme fond de panier pour SignalR, les messages sont distribués à tous les nœuds du cluster sans modification du code de l'application.

Il existe un compromis entre le nombre de nœuds dans le cluster et le débit du fond de panier. L'augmentation du nombre de nœuds augmente la disponibilité du cluster mais diminue le débit car les messages doivent être transmis à tous les nœuds du cluster.

Dans l'application SignalR, incluez tous les nœuds Redis possibles en utilisant l'une des approches suivantes :

  • Répertoriez les nœuds dans la chaîne de connexion délimités par des virgules.
  • Si vous utilisez un comportement personnalisé pour les échecs de connexion, ajoutez les nœuds à ConfigurationOptions.Endpoints.

Étapes suivantes

Pour plus d’informations, consultez les ressources suivantes :

Cet article explique les SignalR-aspects spécifiques de la configuration d'un serveur Redis à utiliser pour la mise à l'échelle d'une application ASP.NET Core SignalR.

Avertissement

Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.

Configurer un fond de panier Redis

  • Déployez un serveur Redis.

    Important

    Pour une utilisation en production, un fond de panier Redis est recommandé uniquement lorsqu'il s'exécute dans le même centre de données que l'application SignalR. Sinon, la latence du réseau dégrade les performances. Si votre application SignalR s'exécute dans le cloud Azure, nous recommandons le service SignalR Azure au lieu d'un fond de panier Redis.

    Pour plus d’informations, consultez les ressources suivantes :

  • Dans l'application SignalR, installez le package NuGet suivant :

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Dans la méthode Startup.ConfigureServices, appelez AddStackExchangeRedis :

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configurez les options selon vos besoins :

    La plupart des options peuvent être définies dans la chaîne de connexion ou dans l'objet ConfigurationOptions. Les options spécifiées dans ConfigurationOptions remplacent celles définies dans la chaîne de connexion.

    L'exemple suivant montre comment définir des options dans l'objet ConfigurationOptions. Cet exemple ajoute un préfixe de canal afin que plusieurs applications puissent partager la même instance Redis, comme expliqué à l'étape suivante.

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

    Dans le code précédent, options.Configuration est initialisé avec tout ce qui a été spécifié dans la chaîne de connexion.

    Pour plus d'informations sur les options Redis, consultez la documentation StackExchange Redis.

  • Si vous utilisez un serveur Redis pour plusieurs applications SignalR, utilisez un préfixe de canal différent pour chaque application SignalR.

    La définition d'un préfixe de canal isole une application SignalR des autres qui utilisent des préfixes de canal différents. Si vous n'attribuez pas de préfixes différents, un message envoyé d'une application à tous ses propres clients ira à tous les clients de toutes les applications qui utilisent le serveur Redis comme fond de panier.

  • Configurez le logiciel d'équilibrage de charge de votre batterie de serveurs pour les sessions permanentes. Voici quelques exemples de documentation sur la façon de procéder :

Erreurs du serveur Redis

Lorsqu'un serveur Redis tombe en panne, SignalR lève des exceptions qui indiquent que les messages ne seront pas remis. Quelques messages d'exception typiques :

  • Échec de l'écriture du message
  • Échec de l'appel de la méthode de concentrateur 'MethodName'
  • La connexion à Redis a échoué

SignalR ne met pas les messages en mémoire tampon pour les envoyer lorsque le serveur revient. Tous les messages envoyés pendant que le serveur Redis est en panne sont perdus.

SignalR se reconnecte automatiquement lorsque le serveur Redis est à nouveau disponible.

Comportement personnalisé pour les échecs de connexion

Voici un exemple qui montre comment gérer les événements d'échec de connexion 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;
            };
        });

Grappe Redis

Redis Cluster utilise plusieurs serveurs Redis actifs simultanément pour atteindre une haute disponibilité. Lorsque Redis Cluster est utilisé comme fond de panier pour SignalR, les messages sont distribués à tous les nœuds du cluster sans modification du code de l'application.

Il existe un compromis entre le nombre de nœuds dans le cluster et le débit du fond de panier. L'augmentation du nombre de nœuds augmente la disponibilité du cluster mais diminue le débit car les messages doivent être transmis à tous les nœuds du cluster.

Dans l'application SignalR, incluez tous les nœuds Redis possibles en utilisant l'une des approches suivantes :

  • Répertoriez les nœuds dans la chaîne de connexion délimités par des virgules.
  • Si vous utilisez un comportement personnalisé pour les échecs de connexion, ajoutez les nœuds à ConfigurationOptions.Endpoints.

Étapes suivantes

Pour plus d’informations, consultez les ressources suivantes :

Cet article explique les SignalR-aspects spécifiques de la configuration d'un serveur Redis à utiliser pour la mise à l'échelle d'une application ASP.NET Core SignalR.

Avertissement

Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.

Configurer un fond de panier Redis

  • Déployez un serveur Redis.

    Important

    Pour une utilisation en production, un fond de panier Redis est recommandé uniquement lorsqu'il s'exécute dans le même centre de données que l'application SignalR. Sinon, la latence du réseau dégrade les performances. Si votre application SignalR s'exécute dans le cloud Azure, nous recommandons le service SignalR Azure au lieu d'un fond de panier Redis.

    Pour plus d’informations, consultez les ressources suivantes :

  • Dans l'application SignalR, installez l'un des packages NuGet suivants :

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis – Dépend de StackExchange.Redis 2.X.X. Il s'agit du package recommandé pour ASP.NET Core 2.2 et versions ultérieures.
    • Microsoft.AspNetCore.SignalR.Redis – Dépend de StackExchange.Redis 1.X.X. Ce package n'est pas inclus dans ASP.NET Core 3.0 et versions ultérieures.
  • Dans la méthode Startup.ConfigureServices, appelez AddStackExchangeRedis :

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

Lorsque vous utilisez Microsoft.AspNetCore.SignalR.Redis, appelez AddRedis.

  • Configurez les options selon vos besoins :

    La plupart des options peuvent être définies dans la chaîne de connexion ou dans l'objet ConfigurationOptions. Les options spécifiées dans ConfigurationOptions remplacent celles définies dans la chaîne de connexion.

    L'exemple suivant montre comment définir des options dans l'objet ConfigurationOptions. Cet exemple ajoute un préfixe de canal afin que plusieurs applications puissent partager la même instance Redis, comme expliqué à l'étape suivante.

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

Lorsque vous utilisez Microsoft.AspNetCore.SignalR.Redis, appelez AddRedis.

Dans le code précédent, options.Configuration est initialisé avec tout ce qui a été spécifié dans la chaîne de connexion.

Pour plus d'informations sur les options Redis, consultez la documentation StackExchange Redis.

  • Si vous utilisez un serveur Redis pour plusieurs applications SignalR, utilisez un préfixe de canal différent pour chaque application SignalR.

    La définition d'un préfixe de canal isole une application SignalR des autres qui utilisent des préfixes de canal différents. Si vous n'attribuez pas de préfixes différents, un message envoyé d'une application à tous ses propres clients ira à tous les clients de toutes les applications qui utilisent le serveur Redis comme fond de panier.

  • Configurez le logiciel d'équilibrage de charge de votre batterie de serveurs pour les sessions permanentes. Voici quelques exemples de documentation sur la façon de procéder :

Erreurs du serveur Redis

Lorsqu'un serveur Redis tombe en panne, SignalR lève des exceptions qui indiquent que les messages ne seront pas remis. Quelques messages d'exception typiques :

  • Échec de l'écriture du message
  • Échec de l'appel de la méthode de concentrateur 'MethodName'
  • La connexion à Redis a échoué

SignalR ne met pas les messages en mémoire tampon pour les envoyer lorsque le serveur revient. Tous les messages envoyés pendant que le serveur Redis est en panne sont perdus.

SignalR se reconnecte automatiquement lorsque le serveur Redis est à nouveau disponible.

Comportement personnalisé pour les échecs de connexion

Voici un exemple qui montre comment gérer les événements d'échec de connexion 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;
            };
        });

Grappe Redis

Redis Cluster utilise plusieurs serveurs Redis actifs simultanément pour atteindre une haute disponibilité. Lorsque Redis Cluster est utilisé comme fond de panier pour SignalR, les messages sont distribués à tous les nœuds du cluster sans modification du code de l'application.

Il existe un compromis entre le nombre de nœuds dans le cluster et le débit du fond de panier. L'augmentation du nombre de nœuds augmente la disponibilité du cluster mais diminue le débit car les messages doivent être transmis à tous les nœuds du cluster.

Dans l'application SignalR, incluez tous les nœuds Redis possibles en utilisant l'une des approches suivantes :

  • Répertoriez les nœuds dans la chaîne de connexion délimités par des virgules.
  • Si vous utilisez un comportement personnalisé pour les échecs de connexion, ajoutez les nœuds à ConfigurationOptions.Endpoints.

Étapes suivantes

Pour plus d’informations, consultez les ressources suivantes :

Cet article explique les SignalR-aspects spécifiques de la configuration d'un serveur Redis à utiliser pour la mise à l'échelle d'une application ASP.NET Core SignalR.

Avertissement

Cet article montre l’utilisation de chaîne de connexion s. Avec une base de données locale, l’utilisateur n’a pas besoin d’être authentifié, mais en production, les chaîne de connexion incluent parfois un mot de passe pour s’authentifier. Les informations d’identification de mot de passe du propriétaire de la ressource (ROPC) constituent un risque de sécurité qui doit être évité dans les bases de données de production. Les applications de production doivent utiliser le flux d’authentification le plus sécurisé disponible. Pour plus d’informations sur l’authentification des applications déployées pour tester ou produire des environnements, consultez Flux d’authentification sécurisés.

Configurer un fond de panier Redis

  • Déployez un serveur Redis.

    Important

    Pour une utilisation en production, un fond de panier Redis est recommandé uniquement lorsqu'il s'exécute dans le même centre de données que l'application SignalR. Sinon, la latence du réseau dégrade les performances. Si votre application SignalR s'exécute dans le cloud Azure, nous recommandons le service SignalR Azure au lieu d'un fond de panier Redis.

    Pour plus d’informations, consultez les ressources suivantes :

  • Dans l'application SignalR, installez le package NuGet Microsoft.AspNetCore.SignalR.Redis.

  • Dans la méthode Startup.ConfigureServices, appelez AddRedis après AddSignalR :

    services.AddSignalR().AddRedis("<your_Redis_connection_string>");
    
  • Configurez les options selon vos besoins :

    La plupart des options peuvent être définies dans la chaîne de connexion ou dans l'objet ConfigurationOptions. Les options spécifiées dans ConfigurationOptions remplacent celles définies dans la chaîne de connexion.

    L'exemple suivant montre comment définir des options dans l'objet ConfigurationOptions. Cet exemple ajoute un préfixe de canal afin que plusieurs applications puissent partager la même instance Redis, comme expliqué à l'étape suivante.

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

    Dans le code précédent, options.Configuration est initialisé avec tout ce qui a été spécifié dans la chaîne de connexion.

  • Si vous utilisez un serveur Redis pour plusieurs applications SignalR, utilisez un préfixe de canal différent pour chaque application SignalR.

    La définition d'un préfixe de canal isole une application SignalR des autres qui utilisent des préfixes de canal différents. Si vous n'attribuez pas de préfixes différents, un message envoyé d'une application à tous ses propres clients ira à tous les clients de toutes les applications qui utilisent le serveur Redis comme fond de panier.

  • Configurez le logiciel d'équilibrage de charge de votre batterie de serveurs pour les sessions permanentes. Voici quelques exemples de documentation sur la façon de procéder :

Erreurs du serveur Redis

Lorsqu'un serveur Redis tombe en panne, SignalR lève des exceptions qui indiquent que les messages ne seront pas remis. Quelques messages d'exception typiques :

  • Échec de l'écriture du message
  • Échec de l'appel de la méthode de concentrateur 'MethodName'
  • La connexion à Redis a échoué

SignalR ne met pas les messages en mémoire tampon pour les envoyer lorsque le serveur revient. Tous les messages envoyés pendant que le serveur Redis est en panne sont perdus.

SignalR se reconnecte automatiquement lorsque le serveur Redis est à nouveau disponible.

Comportement personnalisé pour les échecs de connexion

Voici un exemple qui montre comment gérer les événements d'échec de connexion 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;
            };
        });

Grappe Redis

Redis Cluster utilise plusieurs serveurs Redis actifs simultanément pour atteindre une haute disponibilité. Lorsque Redis Cluster est utilisé comme fond de panier pour SignalR, les messages sont distribués à tous les nœuds du cluster sans modification du code de l'application.

Il existe un compromis entre le nombre de nœuds dans le cluster et le débit du fond de panier. L'augmentation du nombre de nœuds augmente la disponibilité du cluster mais diminue le débit car les messages doivent être transmis à tous les nœuds du cluster.

Dans l'application SignalR, incluez tous les nœuds Redis possibles en utilisant l'une des approches suivantes :

  • Répertoriez les nœuds dans la chaîne de connexion délimités par des virgules.
  • Si vous utilisez un comportement personnalisé pour les échecs de connexion, ajoutez les nœuds à ConfigurationOptions.Endpoints.

Étapes suivantes

Pour plus d’informations, consultez les ressources suivantes :