引言
我托管了一个由gorilla/mux
实现的web服务器,它公开了供用户访问数据库的API端点。
我将服务器放在AWS Lambda函数中,并使用API向服务器发送Lambda代理请求。请求流程是:
服务器代码
import (
"github.com/gorilla/mux"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"github.com/awslabs/aws-lambda-go-api-proxy/core"
"github.com/awslabs/aws-lambda-go-api-proxy/gorillamux"
)
var (
muxLambda *gorillamux.GorillaMuxAdapter
router = mux.NewRouter().StrictSlash(true)
// Register handler functions
)
func init() {
muxLambda = gorillamux.New(router)
}
func LambdaHandler(
ctx context.Context,
req events.APIGatewayProxyRequest,
) (*core.SwitchableAPIGatewayResponse, error) {
response, err := muxLambda.ProxyWithContext(ctx, *core.NewSwitchableAPIGatewayRequestV1(&req))
if err != nil {
panic(fmt.Sprintf("Proxy encountered an error: %s", err.Error()))
}
return response, nil
}
func main() {
lambda.Start(LambdaHandler)
}
import "database/sql"
database, err := sql.Open("postgres", connStr)
问题
在测试此服务器(siege -c 250 -d 0.5 -r 10 'http://<api url>/
)的负载性能时,我遇到了这么多到RDS实例的连接(在AWS控制台中大约有400个连接),并且Lambda函数为几乎所有事务返回超时(30秒)。如果我降低了进程的数量,来自服务器的响应就会像预期的那样工作。
,造成这种情况的可能原因是什么?
从我的搜索中,我发现这可能是由于:
这可能类似于这个问题,但我认为RDS代理可以为我处理连接池?还是我重载了RDS代理?
如果原因是重载,在AWS设置中我可以做什么配置?扩展RDS实例?或增加max_connections
设置,如本文章中所述
谢谢你读了这么多。如有任何反馈,将不胜感激。
更新: RDS和RDS代理的连接度量
发布于 2022-08-03 07:56:28
我发现Lambda超时可能是由于太多的RDS连接造成的。因此,RDS代理队列或限制来自Lambda (参考)的传入连接。
根本原因是API服务器发送给RDS的SQL查询太多,RDS阻塞了连接。在我的例子中,查询包括两个步骤:
select row from table where id = 1;
在此设置中,如果列表中有200个id,则API服务器将发送总计200 +1的查询,从而阻塞连接。
解决方案
select row from table where id in (1, 2, 3, ....);
Db.Query
(来自database/sql
)调用中的行,以避免连接泄漏:rows, err := Db.Query(query, params)
defer rows.Close()
总之,这是由于对database/sql
go包和SQL的理解不足所致。希望这能帮助那些遇到这件事的人。
https://stackoverflow.com/questions/73151310
复制相似问题