当前位置: 首页 > 知识库问答 >
问题:

使用RDS代理对AWS Lambda上的http服务器进行负载测试时,RDS连接过多

子车安和
2023-03-14

我正在托管一个由gorilla/mux实现的web服务器,它为用户访问数据库提供APIendpoint。

我将服务器置于AWS Lambda函数中,并使用API网关向服务器发送Lambda代理请求。请求流为:

  • API网关-
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)
}
    < li >我通过以下方式打开与数据库的连接:
import "database/sql"
database, err := sql.Open("postgres", connStr)

在测试这个服务器的负载性能的同时(si借-c 250-d 0.5-r 10'超文本传输协议://

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

从我的搜索中,我发现也许这是由于:

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

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

如果原因是过载,我可以在AWS设置中做什么配置?扩展RDS实例?或者增加本文中提到的< code>max_connections设置?

或者只是更改此 SO 问题或此 SO 问题中提到的代码结构?

感谢您阅读本文。欢迎任何反馈。

    < Li > RDS实例的数据库连接 < Li > RDS代理的CloudWatch指标

共有2个答案

司空叶五
2023-03-14

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

根本原因是因为太多的SQL查询从API服务器发送到RDS,这阻碍了连接。在我的例子中,查询包括2个步骤:

  1. 获取 id 列表
  2. 为每个 id 发送查询,例如:
select row from table where id = 1;

在这个设置中,如果列表中有200个id,那么API服务器将总共发送200个1查询,这将保持连接。

  • 我修改了API服务器以发送单个查询,例如:
select row from table where id in (1, 2, 3, ....);
  • 关闭<code>Db中的行。查询(来自数据库/sql)调用以避免连接泄漏:
rows, err := Db.Query(query, params)
defer rows.Close()

总之,这是由于对database/sqlgo包和sql的理解不足。希望这能帮助那些遇到这种情况的人。

麹培
2023-03-14

增加max_connections的值不是最佳实践。我认为,更好的方法是使用Lambda函数初始化阶段来预先配置RDS连接。这个连接将被几个lambda函数重用。这个解决方案减少了到RDS数据库的连接数量。如何做到这一点有很好的例子。

 类似资料:
  • 我在RDS中有两个Postgres 9.3.5实例,都在一个安全组中,允许安全组内的所有入站流量和所有出站流量。我正在尝试设置一个数据库,以便能够通过postgres_fdw从另一个数据库中的几个表中进行选择。 我已经创建了服务器 - 以及必要的用户映射和外表 - 然而,一个简单的< code > select count(*)from condition _ fdw 给出了我 我可以从EC2实例

  • 所以我有我的 Amazon RDS 实例,我允许我的 EC2 组让所有内容都连接,并且可以在脚本从我自己的机器运行时(使用 XAMPP 安装)完全建立 PDO 连接。 然而,当我从服务器上运行时,我得到一个 错误 从我自己的机器上运行脚本时不会出现此错误,我可以在那里很好地连接到数据库,进行插入和选择等。但是一旦我在我的实际EC2服务器上,blip总是无法连接。此外,它无法连接到任何MySQL实例

  • 我无法连接到我创建的MySQL Amazon RDS实例。 我正在按照AWS RDS教程进行连接并进入: 工作台上“主机”中的endpoint 包括用户名和密码的凭据 端口设置为3306 我得到了一个错误: 无法连接到数据库服务器 您尝试将用户“master”连接到xxxx的MySQL服务器失败。rds。亚马逊。com:3306: 无法连接到xxxx上的MySQL服务器。亚马逊。com'(1006

  • 问题内容: 我正在尝试使用连接到RDS数据库的Node.js编写Lambda函数。该数据库正在运行,并且可以从我的Elastic Beanstalk环境访问。当我运行该函数时,它将返回超时错误。 尝试将超时延长到5分钟,结果完全相同。 经过一些研究,我得出的结论是,这可能是一个安全问题,但无法在Amazon文档或此答案中找到解决方案(这是我只能在该主题上找到的解决方案)。 以下是安全性详细信息:

  • 我正在尝试使用 Node 编写一个 Lambda 函数.js该函数连接到我的 RDS 数据库。该数据库正在运行,可以从我的 Elastic Beanstalk 环境访问。当我运行该函数时,它返回超时错误。 尝试将超时增加到 5 分钟,结果完全相同。 经过一些研究,我得出的结论是,这可能是一个安全问题,但在亚马逊的留档或这个答案中找不到解决方案(这是我在这个话题上唯一能找到的答案)。 以下是安全详细