web-dev-qa-db-fra.com

StackExchange.Redis ConnectionMultiplexer.Connect () fonctionne par intermittence

J'utilise StackExchange.Redis pour parler à 3 instances Redis différentes: 1 sur le même sous-réseau et 2 à distance. Voici mon code de configuration:

var configurationOptions = new ConfigurationOptions
{
    EndPoints =
    {
        { Host, port }
    },
    KeepAlive = 180,
    Password = password,
    DefaultVersion = new Version("2.8.5"),
    // Needed for cache clear
    AllowAdmin = true
};

var connectionMultiplexer = ConnectionMultiplexer.Connect(configurationOptions );

la dernière ligne lève une exception de connexion environ 70% du temps:

Il n'a pas été possible de se connecter au (x) serveur (s) redis; pour créer un multiplexeur déconnecté, désactivez AbortOnConnectFail

Pourquoi est-ce intermittent et/ou qu'est-ce que je fais mal? Lorsque je lance une requête ping sur le serveur Redis dans une invite de commande, il y a 0% de perte de paquets et une réponse <1 ms. Le réseau est stable.

Merci!

MODIFIER

Voici ce que le journal génère en cas d'échec:

10.48.68.28:6379,keepAlive=180,version=2.8.5

1 unique nodes specified
Requesting tie-break from 10.48.68.28:6379 > __Booksleeve_TieBreak...
Allowing endpoints 00:00:01 to respond...
10.48.68.28:6379 did not respond
10.48.68.28:6379 failed to nominate (WaitingForActivation)
No masters detected
10.48.68.28:6379: Standalone v2.8.5, master; keep-alive: 00:03:00; int: Connecting; sub: ConnectedEstablished, 1 active; not in use: DidNotRespond
10.48.68.28:6379: int ops=0, qu=4, qs=0, qc=0, wr=0, socks=1; sub ops=2, qu=0, qs=0, qc=0, wr=0, subs=1, sync=2, socks=1
Circular op-count snapshot; int: 0 (0.00 ops/s; spans 10s); sub: 0+2=2 (0.20 ops/s; spans 10s)
Sync timeouts: 0; fire and forget: 0; last heartbeat: -1s ago
Starting heartbeat...
13
Haney

J'ai pu contourner ce problème en définissant un ConnectTimeouton sur le client lors de la connexion à Redis. Voici mon code

 ConnectionMultiplexer connection = 
        ConnectionMultiplexer.Connect("endpoint,password=password,ConnectTimeout=10000");
7
pranav rastogi

Cela semble être un problème quelque peu courant: https://github.com/StackExchange/StackExchange.Redis/issues/42

Je viens de télécharger la nouvelle version et je n'ai pas revu le problème. Encore.

5
shawn.r.stevens

Je pourrais résoudre ce qui précède en faisant ceci:

L'erreur que vous obtenez est généralement un signe que vous n'avez pas défini abortConnect = false dans votre chaîne de connexion. La valeur par défaut pour abortConnect est true, ce qui fait que StackExchange.Redis ne se reconnectera pas automatiquement au serveur dans certaines conditions. Nous vous recommandons fortement de définir abortConnect = false dans votre chaîne de connexion afin que SE.Redis se reconnecte automatiquement en arrière-plan si un blip réseau se produit.

Source: https://stackoverflow.com/a/30918632/2236811

Donc mon init () ressemblait à ça

 ConfigurationOptions co = new ConfigurationOptions()
        {
            SyncTimeout = 500000,
            EndPoints =
            {
                {url,portNumber }
            },
            AbortOnConnectFail = false // this prevents that error
        };

        seClient = ConnectionMultiplexer.Connect(co);

merci

4
ankur

Pour moi, cette erreur était due au nombre total de connexions atteint à sa limite maximale, c'est-à-dire 10K. Le redémarrage du client et la suppression de certains d'entre eux ont résolu le problème. Vous pouvez vérifier le portail Azure et déterminer si vous avez atteint la limite maximale pour l'une des ressources.

3
Rocks