Google cloud platform 性能设计模式:来自无服务器/云函数/lambda的SQL连接

Google cloud platform 性能设计模式:来自无服务器/云函数/lambda的SQL连接,google-cloud-platform,aws-lambda,google-cloud-functions,serverless,Google Cloud Platform,Aws Lambda,Google Cloud Functions,Serverless,在传统的基于服务器的web应用程序中,应用程序可以在启动时汇集大量数据库连接,并在应用程序的整个生命周期内使用这些连接来处理客户端请求。性能优势,因为创建/销毁数据库连接的开销只在启动/终止时支付一次 在无服务器模型(如google cloud function/AWS lambda等)中,启动应用程序,处理请求,关闭应用程序。因此,应用程序无法将连接池化,以在多个请求上使用 在无服务器模型中,要提高数据库连接性能,适当的设计模式(如果有的话)是什么?最后,如果不存在解决方案,那么来自无服务器体

在传统的基于服务器的web应用程序中,应用程序可以在启动时汇集大量数据库连接,并在应用程序的整个生命周期内使用这些连接来处理客户端请求。性能优势,因为创建/销毁数据库连接的开销只在启动/终止时支付一次

在无服务器模型(如google cloud function/AWS lambda等)中,启动应用程序,处理请求,关闭应用程序。因此,应用程序无法将连接池化,以在多个请求上使用


在无服务器模型中,要提高数据库连接性能,适当的设计模式(如果有的话)是什么?最后,如果不存在解决方案,那么来自无服务器体系结构的数据库请求是否会降低性能?预计会出现什么样的减速?

亚马逊RDS有一项专门为解决此问题而构建的新服务。

亚马逊RDS有一项专门为解决此问题而构建的新服务。

当您查看无服务器解决方案时,如云运行、云函数甚至Lambda(但我不会谈论它,因为我真的不知道AWS)实例是根据流量创建的

我同意你的看法,你不需要管理实例的创建和终止时间,但不会在每个请求中创建实例。事实上,实例是重用的。顺便说一下,创建实例时,你只需支付冷启动的1倍,包括数据库池创建。同一实例上的后续请求(称为热启动)可以重复使用池,直到基础平台终止实例。顺便说一句,将此池存储在全局变量中,以便在同一实例上请求后重复使用。

为了优化您的池大小,请仔细查看平台行为。例如,云功能(我认为是Lambda,没有承诺)每个实例只能同时处理一个请求。顺便说一句,当您创建池时,创建一个只有一个数据库连接的池,更多的池是无用的,因为不会使用更多的池连接!例如,在Java中,我知道默认池会为每个默认池创建50个连接,请注意这一点。

为什么?因为您的数据库有可能的连接数量限制。这就是为什么,您还可以限制云上并行实例的最大数量,以避免任何数据库连接问题(
--max instances
param)。如果您的数据库接受400个连接,则您不能同时拥有超过400个云功能

现在,看看Cloud Run(和AppEngine,相同的行为)。使用Cloud Run,您可以在同一时间在同一实例上处理多达80个并发请求。。这一次,将您的池大小和/或Cloud Run上的
并发性
参数设置为相等。例如,将并发性设置为40,将池大小设置为40个连接

对于云函数,建议使用接受400个连接的数据库,在最后一个示例中,这次将
--max instances
param on Cloud Run设置为10


这个限制对于通过池保存数据库连接很重要,但如果访问API或其他方面有相同的限制,您也可以使用它。

当您查看无服务器解决方案时,例如Cloud Run、Cloud Function甚至Lambda(但我不会谈论它,因为我真的不知道AWS)实例是根据流量创建的

我同意你的看法,你不需要管理实例的创建和终止时间,但不会在每个请求中创建实例。事实上,实例是重用的。顺便说一下,创建实例时,你只需支付冷启动的1倍,包括数据库池创建。同一实例上的后续请求(称为热启动)可以重复使用池,直到基础平台终止实例。顺便说一句,将此池存储在全局变量中,以便在同一实例上请求后重复使用。

为了优化您的池大小,请仔细查看平台行为。例如,云功能(我认为是Lambda,没有承诺)每个实例只能同时处理一个请求。顺便说一句,当您创建池时,创建一个只有一个数据库连接的池,更多的池是无用的,因为不会使用更多的池连接!例如,在Java中,我知道默认池会为每个默认池创建50个连接,请注意这一点。

为什么?因为您的数据库有可能的连接数量限制。这就是为什么,您还可以限制云上并行实例的最大数量,以避免任何数据库连接问题(
--max instances
param)。如果您的数据库接受400个连接,则您不能同时拥有超过400个云功能

现在,看看Cloud Run(和AppEngine,相同的行为)。使用Cloud Run,您可以在同一时间在同一实例上处理多达80个并发请求。。这一次,将您的池大小和/或Cloud Run上的
并发性
参数设置为相等。例如,将并发性设置为40,将池大小设置为40个连接

对于云函数,建议使用接受400个连接的数据库,在最后一个示例中,这次将
--max instances
param on Cloud Run设置为10


此限制对于通过池保存数据库连接很重要,但如果您对访问API或其他内容有相同的限制,也可以使用此限制。

对于云函数,您所说的不是真的。分配服务器实例时,它将处理