首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用RDS代理在AWS Lambda上加载测试http服务器时,RDS连接过多

在使用RDS代理在AWS Lambda上加载测试http服务器时,RDS连接过多
EN

Stack Overflow用户
提问于 2022-07-28 10:29:02
回答 2查看 187关注 0票数 0

引言

我托管了一个由gorilla/mux实现的web服务器,它公开了供用户访问数据库的API端点。

我将服务器放在AWS Lambda函数中,并使用API向服务器发送Lambda代理请求。请求流程是:

  • API网关-> (API代理集成) -> Lambda函数-> RDS代理-> RDS实例

服务器代码

代码语言:javascript
运行
复制
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)
}
  • 我通过以下方式打开到数据库的连接:
代码语言:javascript
运行
复制
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秒)。如果我降低了进程的数量,来自服务器的响应就会像预期的那样工作。

,造成这种情况的可能原因是什么?

从我的搜索中,我发现这可能是由于:

  • 对于每个请求,一个新的Lambda实例将启动并打开到RDS代理的新数据库连接。由于已经有太多连接,Lambda在30秒后等待并返回超时。

这可能类似于这个问题,但我认为RDS代理可以为我处理连接池?还是我重载了RDS代理?

如果原因是重载,在AWS设置中我可以做什么配置?扩展RDS实例?或增加max_connections设置,如本文章中所述

或者简单地更改这个问题这个问题中提到的代码结构。

谢谢你读了这么多。如有任何反馈,将不胜感激。

更新: RDS和RDS代理的连接度量

EN

Stack Overflow用户

回答已采纳

发布于 2022-08-03 07:56:28

我发现Lambda超时可能是由于太多的RDS连接造成的。因此,RDS代理队列或限制来自Lambda (参考)的传入连接。

根本原因是API服务器发送给RDS的SQL查询太多,RDS阻塞了连接。在我的例子中,查询包括两个步骤:

  1. 得到一个id列表
  2. 为每个id发送一个查询,例如:
代码语言:javascript
运行
复制
select row from table where id = 1;

在此设置中,如果列表中有200个id,则API服务器将发送总计200 +1的查询,从而阻塞连接。

解决方案

  • 我修改了API服务器以发送一个查询,如下所示:
代码语言:javascript
运行
复制
select row from table where id in (1, 2, 3, ....);
  • 关闭Db.Query (来自database/sql)调用中的行,以避免连接泄漏:
代码语言:javascript
运行
复制
rows, err := Db.Query(query, params)
defer rows.Close()

总之,这是由于对database/sql go包和SQL的理解不足所致。希望这能帮助那些遇到这件事的人。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73151310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档