我正在考虑使用Azure Function/AWS Lambda/Serverless作为后端。它如何扩展到数百万个请求,代码必须打开数据库。我知道它不会重用连接?例如,调用是这样的。
using (var db = new Database(..,)) { // db calls }
它是如何横向扩展的,是否高效?
wr98u20j1#
你的问题有点不精确。我对Azure了解不多,但对于AWS Lambda来说,它的伸缩性很好。如果你有100万个并发请求,Lambda会为每个请求创建一个示例。请注意,每个区域有1000个并发执行a default limit,但可以通过支持请求来增加。第一次请求发出后,容器可能被重用。有一个blog post解释了它是如何工作的。虽然不推荐你尝试在容器中缓冲你的连接。根据数据库和驱动程序,你的连接可能在冻结期间失效,也可能仍然工作。对于我使用的Lambda之一,缓冲工作得很好。当你不这样做时,你应该注意。t正确关闭连接,这可能会导致数据库服务器上的泄漏,当然,您应该在再次使用连接之前验证连接。使用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非常相似,我不会感到惊讶,但你最好检查文档以进行验证。
igetnqfo2#
当谈到在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条答案
按热度按时间wr98u20j1#
你的问题有点不精确。我对Azure了解不多,但对于AWS Lambda来说,它的伸缩性很好。如果你有100万个并发请求,Lambda会为每个请求创建一个示例。请注意,每个区域有1000个并发执行a default limit,但可以通过支持请求来增加。
第一次请求发出后,容器可能被重用。有一个blog post解释了它是如何工作的。虽然不推荐你尝试在容器中缓冲你的连接。根据数据库和驱动程序,你的连接可能在冻结期间失效,也可能仍然工作。对于我使用的Lambda之一,缓冲工作得很好。当你不这样做时,你应该注意。t正确关闭连接,这可能会导致数据库服务器上的泄漏,当然,您应该在再次使用连接之前验证连接。
使用Java,我将连接放入类的作用域中,并在处理程序中检查连接是否已经初始化,例如:
你可能可以使用你使用的语言做同样的事情。如果Azure Functions的工作原理与AWS Lambda非常相似,我不会感到惊讶,但你最好检查文档以进行验证。
igetnqfo2#
当谈到在AWS的lambda中使用DB连接时,你应该阅读一下lambda的container execution model。当调用lambda时,AWS会启动一个容器来运行处理函数内部的代码。因此,如果你在处理函数外部定义数据库连接,它将在Lambda函数的调用中共享。你可以在上面的链接中找到。
Lambda函数代码中的任何声明(在处理程序代码之外,请参见编程模型)将保持初始化状态,从而在再次调用函数时提供额外的优化。例如,如果Lambda函数建立了数据库连接,则在后续调用中将使用原始连接,而不是重新建立连接。您可以在代码中添加逻辑,以便在创建连接之前检查连接是否已存在。
参考this博客文章。
但有一个警告。
编写Lambda函数代码时,不要假设AWS Lambda总是重用容器,因为AWS Lambda可能选择不重用容器。根据各种其他因素,AWS Lambda可能只是创建一个新容器,而不是重用现有容器。
此外,您可以创建一个预定的作业来预热lambda函数。(每5分钟运行一次)