基于AWS Lambda+RDS Proxy的HTTP服务器压测时RDS连接过多问题排查
引言
我部署了一个基于gorilla/mux实现的Web服务器,该服务器对外暴露API端点供用户访问数据库。
我将该服务器部署在AWS Lambda函数中,并使用API Gateway向其发送Lambda代理请求。请求流程如下:
- API Gateway ->(API Gateway Lambda代理集成)-> Lambda函数 -> RDS Proxy -> RDS实例
服务器代码
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) // 注册处理函数 ) 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地址>/'),我发现RDS实例的连接数过多(AWS控制台显示约400个连接),且Lambda函数几乎所有请求都返回超时(30秒)。若降低并发量,服务器响应则恢复正常。
请问导致该问题的可能原因是什么?
我查阅资料后猜测:
- 每个请求都会启动一个新的Lambda实例,并向RDS Proxy建立新的数据库连接。当连接数过多时,Lambda会等待连接直至超时。
这可能与社区讨论的类似问题情况一致,但我认为RDS Proxy应为我处理连接池管理?还是我已过载RDS Proxy?
若原因是过载,在AWS配置中可进行哪些调整?比如升级RDS实例规格?或者参考相关技术文章所述增加max_connections配置?
或是只需按照社区相关问题中的建议修改代码结构?
感谢您的阅读,期待任何反馈建议。
补充:RDS与RDS Proxy的连接指标
- RDS实例的数据库连接数(对应监控指标截图)
- RDS Proxy的CloudWatch指标(对应监控指标截图)
内容的提问来源于stack exchange,提问作者hcchang84
相关产品推荐
相关产品推荐

