mysql - mysql 连接池如何与 Node 微服务一起工作?

标签 mysql node.js connection microservices connection-pooling

我有两个 Node 微服务与一个公共(public) mysql 数据库通信。两个微服务都有下面的代码来创建连接限制为 10 的连接池,如下所示:

//初始化池

var pool = mysql.createPool({
  connectionLimit: 10,
  host: 'localhost',
  port: '3306',
  user: 'root',
  password: 'root'
});

function addConnection(req, res) {
  pool.getConnection(function (err, connection) {
    if (err) {
      connection.release();
      res.json({ "code": 500, "status": "Error" });
      return;
    }

    connection.query("select * from user", function (err, rows) {
      connection.release();
      if (!err) {
        res.json(rows);
      }
    });

    connection.on('error', function (err) {
      res.json({ "code": 500, "status": "Error" });
      return;
    });
  });
}

对于 mysql 数据库,我将 max_connections 设置为 200(SHOW VARIABLES LIKE 'max_connections';返回 200)。

  1. 将每个微服务的池连接限制设置为 10,在哪些情况下或场景中任何微服务的连接数会超过 10? 即 Node 服务何时以及如何能够维持比预期更多的连接?
  2. 如果我有 3 个运行相同微服务的实例,那么池 connectionLimit 是如何工作的?每个微服务实例的连接限制是多少?
  3. 在其中一个微服务中说我有两个 api,它们执行数据库事务并且都通过两个不同的函数连接到数据库(获取连接) 与上面相同的 mysql.createPool({}) 实现。如果同时调用两个 api 并且每秒为每个 api 发出的请求数为 100 或更多,会发生什么情况? 可用的连接数是 10 还是 20(因为创建了两个 mysql 池,每个池的连接限制为 10)?

最佳答案

  1. 理想情况下不会;但它可以超过 10;如果假设某些连接变得陈旧,即它们从客户端关闭但在服务器端仍然打开。

  2. 如果您在多个 VM 或 docker 容器中部署了相同微服务的多个实例;它们就像独立的服务……它们之间没有任何联系……因此,它们每个人都会创建自己的 10 个连接。

  3. 首先,如果您将连接池限制设置为 10;这并不意味着在第一时刻将创建 10 个连接。在创建池时;您还指定初始连接参数假设 5.. 因此,当服务启动时,只会创建 5 个连接.. 并且仅在需要时创建更多连接.. 设置了由参数 max_connections 定义的 UPPER Limit。回到你的问题;好吧,如果您没有正确实现同步等,那么是的,两个池都可能会初始化它们的 INITIAL_CONNECTIONS..

关于mysql - mysql 连接池如何与 Node 微服务一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55578335/

相关文章:

javascript - socketIO 数据未定义

node.js - 如何在不同的文件中拆分 Bot Framework 对话框

.net - 来自 .NET 的快速数据库访问测试

node.js - Visual Studio Code 全局类型定义

PostgreSQL 连接被拒绝

json - 使用 NSURLSession 下载 JSON 不会返回任何数据

php - 如果 PDO 和 mysqli 不可用,使用 mysql_* 函数是否安全?

mysql - 如何在 Slick 2 中的连接表上使用字段和计数 (*) 进行排序?

mysql - 为什么这个查询使用 MySQL 这么慢?

php - 为什么 mysql 不能用我的 php 脚本查询?