RethinkDB和Node.js / Express – 为并行查询打开多个连接?

使用RethinkDB节点驱动程序运行并行查询比每个请求打开多个连接更好吗? 或者,这实际上是一个很好的方式去做我需要的东西? 我宁愿远离连接池/第三方软件包。 有问题的应用程序有一个单独的包含RethinkDB查询的函数。 这些函数处理创build和closures连接。 这种模式允许我以最小的开销在多个路由器中请求数据库服务,而不必知道每个请求。 被解释的例子来解释被查询的数据如何不相关:

database.js

var r = require('rethinkdb'); module.exports = { getApples: function(callback) { r.connect(/* config */) .then(function(conn){ r.db('fruitDatabase').table('apples').run(conn) .then(function(cursor){ return cursor.toArray(); }) .then(function(apples){ return callback(null, apples); }) .finally(function(){ return conn.close(); }); }); }, getPotatoes: function(callback) { r.connect(/* config */) .then(function(conn){ r.db('vegetableDatabase').table('potatoes').run(conn) .then(function(cursor){ return cursor.toArray(); }) .then(function(potatoes){ return callback(null, potatoes); }) .finally(function(){ return conn.close(); }); }); } }; 

现在,我需要创build一个显示所有苹果和所有土豆的页面/端点,所以我现在通过async.parallel在我的页面路由器中调用这两个函数:

pages.js

 var pages = require('express').Router(), async = require('async'), db = require('./database'); pages.route('/food') .get(function(req, res, next){ async.parallel({ apples: db.getApples, potatoes: db.getPotatoes }, function(err, data){ if(err) return next(err); res.render('food', { apples: data.apples, potatoes: data.potatoes }); }); }); 

思考? 如果4个连接并行(或更多)打开呢?

如果您不能等待官方驱动程序获取连接池,则也可以使用中间件为每个请求打开一个连接,如本示例中的官方文档所示:

 app.use(createConnection); // Create a RethinkDB connection function createConnection(req, res, next) { r.connect(config.rethinkdb, function(error, conn) { if (error) { handleError(res, error); } else { // Save the connection in `req` req._rdbConn = conn; // Pass the current request to the next middleware next(); } }); } 

我认为RethinkDB可以处理很多并行连接。 这也可能更容易处理。 如果你使用共享连接,我们必须在连接中断时重新尝试连接,并且必须确保它在请求或服务器的生命周期中是开放的。

这个RethinkDB驱动程序https://github.com/neumino/rethinkdbdash在它自己的连接上运行每个查询。

驱动程序每个连接执行一个查询。 现在rethinkdb / rethinkdb#3296已解决,将来可能会更改此行为。

更重要的是,如果您将更改Feed添加到您的应用中,则很可能需要根据http://docs.rethinkdb.com/2.1/api/javascript/changes/在自己的连接上更改Feed

在自己的连接上打开更改进度是一个好主意。 如果不这样做,其他查询将在同一个连接上运行,当连接发生更多更改时,会遇到不可预知的延迟峰值。

所以,换句话说,我想说一下,通过使用许多并行连接让我们变得简单和容易。