繁体   English   中英

从 Google Cloud Run 到数据库的间歇性连接失败

[英]Intermittend connection failures to databases from Google Cloud Run

我在 Google Cloud Run 中运行多个 NodeJS v16.16 应用程序。 These applications connect to a Google Cloud SQL server and a MongoDB Atlas cluster through a VPC connector with a static IP address that is whitelisted for both the MongoDB Atlas cluster and the SQL server.

当新实例启动时,我们会遇到与这些数据库的间歇性连接失败,就像 IP 地址未列入白名单一样。 对于使用mongoose的连接,我们MongooseServerSelectionError: Server selection timed out after 30000 ms at NativeConnection.Connection.openUri 对于使用sequalize的连接,我们得到一个Error connecting MySQL: SequelizeConnectionError: connect ETIMEDOUT

我通过测试、记录和检查配置建立的东西:

  • 在再次正常连接之前,故障似乎连续发生了几分钟。
  • 当 ZCCADCDEDB567ABAE643E15DCF0974E503Z 连接失败时,Sequalize 并不总是连接失败。 并且仅当 Mongoose 连接也失败时,Sequalize 连接才会失败。
  • 从正确的 IP 地址打开连接,并且连接到 Internet
    • 在连接到数据库并记录结果之前,我已经向https://api.ipify.org?format=json添加了一行 http 请求并记录了结果。
    • Cloud Run 应用程序配置为通过 VPC 连接器路由所有出口流量
  • VPC 连接器没有负担过重
    • 连接器配置为最多启动 10 个实例,只有 2 个处于活动状态。
    • 流量不会超过几个 KiB/s
  • MongoDB Atlas 集群有足够的空间用于新连接
    • 该集群的每个副本能够连接超过 1500 个连接,并且当前主节点上只有约 150 个连接,辅助节点上只有约 50 个连接。
    • 副本 CPU 的 go 不超过 25%,平均到 ~5%
  • 在我们的(也列入白名单的)VPN 中,使用笔记本电脑上的客户端应用程序连接到 MySQL 数据库或 MongoDB 集群似乎没有任何问题。

间歇性连接失败是一个问题,因为当这种情况发生时,实例无法启动并且用户会收到 503 错误作为响应。

版本:

  • 节点:v16.16.0
  • Mongoose:v6.4.0
  • 续集:v6.21.0

我们发现了问题。 在我们开始监听传入请求后,我们正在初始化与数据库的连接(下面的示例)。 我们将其更改为在侦听请求之前连接到数据库,此后没有出现错误。 为什么会发生这种情况尚不清楚,但我认为这与 Google Cloud Run 用于准备实例以处理请求的过程有关。

旧代码:

// start the Express server
app.listen(port, async () => {
    database.connect();
    console.log("Server started!");
});

新代码:

database.connect().then(() => {
    // start the Express server
    app.listen(port, async () => {
        console.log("Server started!");
    });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM