【问题标题】:Scalability Azure Function/AWS Lamda可扩展性 Azure 函数/AWS Lambda
【发布时间】:2018-01-27 18:08:00
【问题描述】:

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

例如调用是这样的。

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

它是如何横向扩展的,它是否有效?

【问题讨论】:

    标签: azure amazon-web-services aws-lambda scalability azure-functions


    【解决方案1】:

    当谈到在 AWS 的 lambda 中使用 DB 连接时,您应该阅读有关 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 分钟运行一次)

    【讨论】:

      【解决方案2】:

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

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

      使用 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 非常相似,我不会感到惊讶,但您最好查看文档以进行验证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-28
        • 1970-01-01
        • 1970-01-01
        • 2018-09-23
        • 2019-08-01
        • 2017-06-13
        • 2019-06-02
        • 1970-01-01
        相关资源
        最近更新 更多