繁体   English   中英

AWS Lambda:Redis ElastiCache 连接超时错误

[英]AWS Lambda: Redis ElastiCache connection timeout error

我有一个使用节点 12 的 lambda function。

我需要添加到 AWS ElastiCache 中托管的 Redis 数据库的新连接。

两者都在一个私有 VPC 中,并且安全组/子网配置正确。

解决方案:

globals.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),
};

index.js(外部处理程序):

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

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

助手/redis/index.js:

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

助手/redis/get.js:

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

Function 致电:

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

问题:当将 lambda 超时增加到大于 Redis 超时的值时,我收到此错误:

REDIS 客户端错误:错误:Redis 连接到...失败 - 连接 ETIMEDOUT...

添加:

我尝试在每次交易后退出/关闭连接:

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()
      });
    }
  }
})

错误:

REDIS GET:AbortError:GET 无法处理。 连接已经关闭。

额外说明:

  • 我必须使用回调,这就是我在上面的示例中传递回调的原因
  • 我正在使用"redis": "^3.0.2"
  • 这不是配置问题,因为缓存在短时间内被访问了数百次,但随后开始出现超时错误。
  • 在本地一切正常

这不是配置问题,因为缓存在短时间内被访问了数百次,但随后开始出现超时错误。

我认为这是问题的根源,可能是 redis 数据库大小达到大小限制,它无法处理新数据?

可以删除里面的旧数据吗?

此外,Elastic Cache 可能对新的 TCP 客户端的连接有限制,如果其耗尽,新连接将被拒绝并出现您提到的类似错误消息。

If redis client in aws lambda function cannot establish connection, aws lambda function fails - and new one is started. New lambda function makes one more connection to redis, redis cannot process it, and one more lambda function is started...

因此,在某一时刻,我们达到了活动 redis 连接的限制,系统陷入了死锁。

我认为您可以暂时停止所有 lambda 功能,并扩展 Elastic Cache redis 数据库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM