可扩展性Azure Function / AWS Lambda

问题描述 投票:0回答:2

我正在考虑将Azure Function / AWS Lambda / Serverless用于后端。它如何扩展到数百万个请求,代码必须打开数据库。我明白它不重用连接?

例如,呼叫是这样的。

using (var db = new Database(..,))
{
  // db calls
}

它如何扩展,是否有效?

azure amazon-web-services aws-lambda scalability azure-functions
2个回答
2
投票

你的问题有点不精确。我对Azure知之甚少,但对于AWS Lambda,它可以很好地扩展。如果您有100万个并发请求,Lambda将为每个请求创建一个实例。请注意,每个区域有1000个并发执行的a default limit,但这些可以通过支持请求来增加。

在第一次请求完成后,可以重用容器。有一个blog post解释它是如何工作的。虽然不建议您尝试缓冲容器内的连接。根据数据库和驱动程序,您的连接可能会在冻结期间失效,或者仍可能仍然有效。对于其中一个Lambdas,我使用缓冲工作非常好。您应该知道当您没有正确关闭连接时,这可能会导致数据库服务器上的泄漏,当然您应该在再次使用之前验证连接。

使用Java我将连接放入类的范围内,并在我的处理程序中检查连接是否已经初始化,例如:

public class LambdaHandler implements RequestStreamHandler {
  private Connection con = null;

  public void handleRequest(InputStream inputStream,
      OutputStream outputStream, Context context) {
    if (con == null) {
      con = getConnection(context);
    } else {
      con = validateConnection(context, con);
    }
  }

您可以使用您使用的语言执行相同的操作。如果Azure Functions与AWS Lambda非常相似,我不会感到惊讶,但您最好检查文档以进行验证。


2
投票

在AWS中使用lambda中的数据库连接时,您应该阅读lambda的container execution model。调用lambda时,AWS会旋转一个容器来运行处理函数内的代码。因此,如果您在处理程序函数之外定义数据库连接,它将在Lambda函数的调用之间共享。您可以在上面的链接中找到它。

Lambda函数代码中的任何声明(在处理程序代码之外,请参阅编程模型)仍然初始化,在再次调用函数时提供额外的优化。例如,如果Lambda函数建立数据库连接,而不是重新建立连接,则在后续调用中使用原始连接。您可以在代码中添加逻辑,以在创建连接之前检查连接是否已存在。

const pg = require('pg');
const client = new pg.Client(<connection_string>);

exports.handler = (event, context, cb) => {  
  client.query('SELECT * FROM users WHERE ', (err, users) => {
    // Do stuff with users
    cb(null); // Finish the function cleanly
});
};

请参阅this博客文章。

但有一点需要注意。

编写Lambda函数代码时,不要假设AWS Lambda始终重用容器,因为AWS Lambda可能选择不重用容器。根据各种其他因素,AWS Lambda可能只是创建一个新容器而不是重用现有容器。

此外,您可以创建预定作业来预热lambda函数。 (每5分钟运行一次)

© www.soinside.com 2019 - 2024. All rights reserved.