【问题标题】:Reuse Redis connections for NodeJS Lambda function为 NodeJS Lambda 函数重用 Redis 连接
【发布时间】:2017-10-17 15:21:06
【问题描述】:

我编写了以下 Lambda 函数:

exports.handler = (event, context, callback) => {
    const redis = require('redis');
    const redis_client = redis.createClient({
        host: 'hostname',
        port: 6379
    });

    redis_client.set("foo", "bar");

    redis_client.get("foo", function(err, reply) {
        redis_client.quit();
        callback(null, reply);
    });
};

这很好用。但是,我想在 Lambda 调用之间重用 Redis 连接来提高性能。理论上,这可以通过将 createClient() 移到处理程序之外来实现。但是,由于“redis_client.quit()”行,该连接被终止。如果我不退出客户端,Lambda 函数将会超时。

在使用 AWS Lambda 时,在 NodeJS 中重用 Redis 的正确方法是什么?

【问题讨论】:

标签: node.js lambda redis


【解决方案1】:

要重用 Redis 客户端连接,请将其定义为处理程序之外的全局。

const redis = require('redis');
const redis_client = redis.createClient({
    host: 'hostname',
    port: 6379
});

exports.handler = (event, context, callback) => {
    redis_client.set("foo", "bar");

    redis_client.get("foo", function(err, reply) {
        redis_client.unref();
        callback(null, reply);
    });
};

【讨论】:

  • unref() 是一种实验性方法,所以我建议在准备好生产之前避免使用。
【解决方案2】:

正如您已经提到的那样,您的方法是正确的方法,但您必须记住您的 Redis 实例有连接限制,例如 AWS Elasticache maxclients 设置为 65000。AWS 目前允许并行执行 1k Lambda,因此请注意外部连接。

目前,Lambda 外部数据库连接没有灵丹妙药。一种可能的解决方案是创建内部 Web API 服务来处理数据库之间的通信。

【讨论】:

    【解决方案3】:

    为避免超时,请在 Lambda 的 AWS 上下文中将 callbackWaitsForEmptyEventLoop 设置为 false。这样您就不必关闭 redis 连接,并且您的 lambda 不会等待它(或其他连接,即 db 连接)在返回之前关闭:

    https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html

    【讨论】:

      【解决方案4】:

      而不是为每次调用创建连接。更好的模式是在全局范围内声明一个变量,然后检查处理程序内是否为空。

      这样您就可以在每个执行环境中建立一次连接。

      const redis = require('redis');
      
      let redisClient;
      
      exports.handler = (event, context, callback) => {
        context.callbackWaitsForEmptyEventLoop = false;
      
        if (!redisClient) {
          redisClient = redis.createClient({
            host: 'hostname',
            port: 6379
          });
        }
      
        redisClient.set("foo", "bar");
      
        ...
      }
      

      https://docs.aws.amazon.com/lambda/latest/operatorguide/global-scope.html https://github.com/sequelize/sequelize/issues/4938#issuecomment-245211042

      【讨论】:

        猜你喜欢
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 1970-01-01
        • 2020-06-20
        • 2016-08-06
        • 2019-12-21
        相关资源
        最近更新 更多