mysql 连接池如何与 Node 微服务一起使用?
How does mysql connection pooling works with Node microservices?
我有两个节点微服务与一个公共 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'; returns 200)。
- 将每个微服务的池连接限制设置为 10,在哪些情况下或场景中任何微服务的连接数会超过 10?
即节点服务何时以及如何能够维持比预期更多的连接?
- 如果我有 3 个实例 运行 相同的微服务,那么池 connectionLimit 是如何工作的?每个微服务实例的连接限制是多少?
- 在其中一个微服务中说我有两个 api,它们执行数据库事务并且都通过两个不同的函数连接到数据库(获取连接)
mysql.createPool({}) 的实现与上面相同。如果同时调用两个 api 并且每秒为每个 api 发出的请求数为 100 或更多,会发生什么情况?
可用连接数是 10 还是 20(因为创建了两个 mysql 池,每个池的连接限制为 10)?
理想情况下不会;但它可以超过 10;如果假设某些连接变得陈旧,即它们从客户端关闭但在服务器端仍然打开。
如果您在多个 VM 或 docker 容器中部署了同一微服务的多个实例;它们就像独立的服务……它们之间没有任何联系……因此,它们每个人都会创建自己的 10 个连接。
首先如果你设置连接池限制为10;这并不意味着在第一时刻将创建 10 个连接。在创建池时;您还指定初始连接参数 assume 5.. 因此,当服务启动时,将仅创建 5 个连接.. 并且仅在需要时创建更多连接.. 设置了由参数 max_connections 定义的 UPPER Limit。回到你的问题;好吧,如果您没有正确实现同步等,那么是的,两个池都可能会初始化它们的 INITIAL_CONNECTIONS..
我有两个节点微服务与一个公共 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'; returns 200)。
- 将每个微服务的池连接限制设置为 10,在哪些情况下或场景中任何微服务的连接数会超过 10? 即节点服务何时以及如何能够维持比预期更多的连接?
- 如果我有 3 个实例 运行 相同的微服务,那么池 connectionLimit 是如何工作的?每个微服务实例的连接限制是多少?
- 在其中一个微服务中说我有两个 api,它们执行数据库事务并且都通过两个不同的函数连接到数据库(获取连接) mysql.createPool({}) 的实现与上面相同。如果同时调用两个 api 并且每秒为每个 api 发出的请求数为 100 或更多,会发生什么情况? 可用连接数是 10 还是 20(因为创建了两个 mysql 池,每个池的连接限制为 10)?
理想情况下不会;但它可以超过 10;如果假设某些连接变得陈旧,即它们从客户端关闭但在服务器端仍然打开。
如果您在多个 VM 或 docker 容器中部署了同一微服务的多个实例;它们就像独立的服务……它们之间没有任何联系……因此,它们每个人都会创建自己的 10 个连接。
首先如果你设置连接池限制为10;这并不意味着在第一时刻将创建 10 个连接。在创建池时;您还指定初始连接参数 assume 5.. 因此,当服务启动时,将仅创建 5 个连接.. 并且仅在需要时创建更多连接.. 设置了由参数 max_connections 定义的 UPPER Limit。回到你的问题;好吧,如果您没有正确实现同步等,那么是的,两个池都可能会初始化它们的 INITIAL_CONNECTIONS..