AWS Lambda: Redis ElastiCache bağlantı zaman aşımı hatası

0

Soru

Düğüm 12'yi kullanan bir lambda işlevim var.

AWS Elasticache'de barındırılan bir Redis veritabanına yeni bir bağlantı eklemem gerekiyor.

Her ikisi de bir özel vpc'dedir ve güvenlik grupları / alt ağları düzgün şekilde yapılandırılmıştır.

Çözünme:

küresel.js:

const redis = require('redis');
const redisClient = redis.createClient(
  `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}/${process.env.REDIS_DB}`,
);
redisClient.on('error', (err) => {
  console.log('REDIS CLIENT ERROR:' + err);
});
module.exports.globals = {
  REDIS: require('../helpers/redis')(redisClient),
};

indeks.js (dış işleyici):

const { globals } = require('./config/globals');
global.app = globals;

const lambda_handler = (event, context, callback) => { ... }
exports.handler = lambda_handler;

yardımcılar / redis / dizin.js:

const get = require('./get');
module.exports = (redisClient) => {
  return {
    get:  get(redisClient)
  };
};

yardımcılar / redis / get.js:

module.exports = (redisClient) => {
  return (key, cb) => {
    redisClient.get(key, (err, reply) => {
      if (err) {
        cb(err);
      } else {
        cb(null, reply);
      }
    });
  };
};

İşlev çağrısı:

app.REDIS.get(redisKey, (err, reply) => {
  console.log(`REDIS GET: ${err} ${reply}`);
});

Sorun: Lambda zaman aşımını Redis zaman aşımından daha büyük bir değere yükseltirken bu hatayı alıyorum:

REDİS İSTEMCİ HATASI: Hata: Redis bağlantısı ... başarısız - ETİMEDOUT'U bağlayın ...

Ek:

Her işlemden sonra bağlantıyı kesmeyi/kapatmayı denedim:

module.exports = (redisClient) => {

  return (cb) => {

    redisClient.quit((err, reply) => {
      if (err) {
        cb(err);
      } else {
        cb(null, reply);
      }
    });
  };
};
app.REDIS.get(redisKey, (err, reply) => {
  console.log(`REDIS GET: ${err} ${reply}`);
  if (err) {
    cb(err);
  } else {
    if (reply) {
      app.REDIS.quit(() => {
        cb()
      });
    }
  }
})

Hata:

REDİS GET: AbortError: GET işlenemiyor. Bağlantı zaten kapalı.

Ekstra Notlar:

  • Geri aramaları kullanmak zorundayım, bu yüzden yukarıdaki örneklerde geçiyorum
  • Kullanıyorum "redis": "^3.0.2"
  • Önbelleğe küçük bir süre içinde yüzlerce kez erişildiğinden yapılandırma sorunu değil, ancak zaman aşımı hataları vermeye başladı.
  • Her şey normal olarak yerel olarak çalışır
1

En iyi cevabı

2

Önbelleğe küçük bir süre içinde yüzlerce kez erişildiğinden yapılandırma sorunu değil, ancak zaman aşımı hataları vermeye başladı.

sorunun kaynağı olduğunu düşünüyorum, muhtemelen redis veritabanı boyutu boyut sınırına ulaştı ve yeni verileri işleyemiyor mu?

İçindeki eski verileri silebilir misin?

Ayrıca, Elastik Önbelleğin yeni TCP istemcilerinin bağlantılarında sınırları olması mümkündür ve tükenirse, bahsettiğiniz benzer hata iletisiyle yeni bağlantılar reddedilir.

Aws lambda işlevindeki redis istemcisi bağlantı kuramazsa aws lambda işlevi başarısız olur ve yenisi başlatılır. Yeni lambda işlevi redis'e bir bağlantı daha yapar, redis onu işleyemez ve bir lambda işlevi daha başlatılır...

Yani, bir anda, aktif redis bağlantılarının sınırına ulaştık ve sistem kilitlendi.

Tüm lambda işlevlerini geçici olarak durdurabileceğinizi ve Elastik Önbellek redis veritabanını ölçeklendirebileceğinizi düşünüyorum.

2021-11-23 20:45:33

Redis düğümleri için tek tek ElastiCache, 65.000'e kadar eşzamanlı istemci bağlantısını destekler. Diğer olası nedenleri kontrol edebileceğim bazı yararlı yapılandırma / metrikler hakkında bir fikriniz var mı?
Majed Badawi

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................