首页 > 解决方案 > 在 AWS 上使用 MySQL 操作时出现随机 ETIMEDOUT 错误

问题描述

我有一个在 NodeJS 上编写的本地应用程序,它与托管在 AWS 上的 MySQL 数据库一起运行。该应用程序已经运行了几个月,没有任何问题。最近,显然是随机的,我得到:

(node:86784) UnhandledPromiseRejectionWarning: Error: connect ETIMEDOUT XX.XX.XX.XX:3306
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1137:16)

在堆栈跟踪中,我看到:

at Protocol._enqueue (/Users/x/y/z/f/node_modules/mysql/lib/protocol/Protocol.js:144:48)
at Protocol.handshake (/Users/x/y/z/f/node_modules/mysql/lib/protocol/Protocol.js:51:23)
at Connection.connect (/Users/x/y/z/f/node_modules/mysql/lib/Connection.js:116:18)
at Connection._implyConnect (/Users/x/y/z/f/node_modules/mysql/lib/Connection.js:454:10)
at Connection.query (/Users/x/y/z/f/node_modules/mysql/lib/Connection.js:196:8)
at internal/util.js:297:30
at new Promise (<anonymous>)
at Connection.subQuery (internal/util.js:296:12)
at _callee3$ (/Users/x/y/z/f/src/persistence/logic.js:84:13)
at tryCatch (/Users/x/y/z/f/node_modules/regenerator-runtime/runtime.js:45:40)

在堆栈跟踪的末尾,可以看到引发错误的 logic.js 文件。

我试图找到引用相同错误的其他帖子,但我看不到与我个人情况的联系。我在几个地方得到了超时,但这段代码可能是一个例子:

export const doThing = async (x, y, z) => {
  const connection = getConnection();

  const query = util.promisify(connection.query).bind(connection);

  const info = {
    x: x,
    y: y,
    z: z,
    started_at: new Date()
  }

  const sql = SQL`INSERT INTO table SET ?`;

  try {
    await query(sql, info);
  }
  finally {
    connection.end();
  }
}

我一直在考虑几个选择:

该应用程序已经运行了一段时间,我想不出它现在会失败的原因。尽管应用程序确实执行了一些复杂的查询,但它在琐碎的插入/更新查询上也会失败。最后,谈到安全性,我确实获得了我的 IP,我可以使用 Sequel Pro 访问实例而不会出现问题。我也切换到另一个网络,没有运气。

我不明白发生了什么变化。我最近更新到 macOS Big Sur,但我没有找到类似问题的参考。

标签: node.jsamazon-web-servicesamazon-rds

解决方案


推荐阅读