4
votes

Erreur "Impossible d'obtenir l'allocation des emplacements" sur AWS ElastiCach (Redis) à l'aide de Node.js

J'ai pu me connecter à Amazon ElastiCache (Redis) en utilisant les bibliothèques Node.js, qui sont redis et redis-clustr sans aucune erreur. Mais l'erreur n'a pas pu obtenir d'allocation d'emplacements chaque fois que j'essayais de définir une paire clé et valeur dans l'application Node.js exécutée sur l'instance Amazon EC2. Mon Amazon ElastiCache a un nœud principal et une réplique (soit deux nœuds).

Voici l'exemple de code utilisé pour la connexion:

gRedisClient.mget(['run:123', 'walk:123'], (err, replies) => {...});

Après avoir établi un connexion à Amazon ElastiCach, l'exemple de code ci-dessous montre comment je récupère les valeurs de Redis:

const redis_cluster = require('redis-clustr');
const redis_client = require('redis');

let redis = new redis_cluster({
    servers: [
        {
             host: global.gConfig.redis.redis_host,
             port: global.gConfig.redis.redis_port
        }
    ],
    createClient: (port, host) => {
        return redis_client.createClient(port, host);
    }
});

// connection error
redis.on('error', err => {
    // log the error to log file
    global.gLogger.log('error', err.message, {stack: err.stack});
});

// add to global variables
global.gRedisClient = redis;

J'utilise Redis multi () pour les opérations bach et mget () pour récupérer les valeurs à la fois. Je suis nouveau dans l'utilisation d'Amazon ElastiCach, toute aide sera appréciée. Merci.


0 commentaires

3 Réponses :


0
votes

J'ai vécu la même chose. Ma raison était que mon ElastiCache était configuré comme maître-esclave, et donc redis-clustr n'est pas nécessaire. Connectez-vous en utilisant par exemple ioredis:

const Redis = require('ioredis');
const opts = {
    host: "your_host",
    port: 6379,
    autoResubscribe: true,
    maxRetriesPerRequest: 5
};
const redis = new Redis(opts);


0 commentaires

0
votes

Continuez simplement à essayer ping () ou d'autres commandes jusqu'à ce que redis-clustr renvoie la bonne réponse.


0 commentaires

0
votes

L'erreur n'a pas pu obtenir d'allocation d'emplacements peut être générée si le serveur utilise tls mais n'est pas configurée dans le client. Vous pouvez l'activer avec redisOptions :

let redis = new redis_cluster({
    servers: [
        {
             host: global.gConfig.redis.redis_host,
             port: global.gConfig.redis.redis_port
        }
    ],
    redisOptions: {
        tls: {} // an empty object is enough to enable it with defaults
    },
    createClient: (port, host) => {
        return redis_client.createClient(port, host);
    }
});


1 commentaires

Merci pour votre contribution. Ma configuration utilisait en fait un nœud, pas deux. J'ai corrigé l'erreur.