RethinkDB 和 Node.js/Express - 为并行查询打开多个连接?
Posted
技术标签:
【中文标题】RethinkDB 和 Node.js/Express - 为并行查询打开多个连接?【英文标题】:RethinkDB and Node.js/Express - Opening multiple connections for parallel queries? 【发布时间】:2015-09-05 02:49:43 【问题描述】:有没有比每个请求打开多个连接更好的方法来使用 RethinkDB 节点驱动程序运行并行查询?或者这实际上是解决我需要的好方法吗?我宁愿远离连接池/第三方包。有问题的应用程序有一个包含包装 RethinkDB 查询的函数的单例。这些函数处理创建和关闭连接。这种模式允许我以最小的开销在多个路由器中要求数据库服务,而不必知道每个请求。人为的例子来解释被查询的数据可能是多么不相关:
数据库.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();
);
);
;
现在,我需要创建一个显示所有苹果和所有土豆的页面/端点,因此我目前在我的页面路由器中通过 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 个连接(或更多)会怎样?
【问题讨论】:
【参考方案1】:如果你等不及官方驱动获取连接池,你也可以使用中间件为每个请求打开一个连接,如官方文档中的this example:
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();
);
【讨论】:
【参考方案2】:我认为 RethinkDB 可以很好地处理许多并行连接。它也可能更容易使用。如果大家使用共享连接,我们必须处理连接断开时重新尝试连接,并且必须确保它在请求或服务器的生命周期中是开放的。
这个 RethinkDB 驱动程序https://github.com/neumino/rethinkdbdash 在自己的连接上运行每个查询。
驱动程序对每个连接执行一个查询。现在 rethinkdb/rethinkdb#3296 已经解决了,这种行为以后可能会改变。
更重要的是,如果您将更改提要带入您的应用程序,您很可能希望根据http://docs.rethinkdb.com/2.1/api/javascript/changes/在自己的连接上更改提要
最好在自己的连接上打开更改源。否则,在同一连接上运行的其他查询将遇到不可预知的延迟峰值,而连接会阻塞更多更改。
所以,换句话说,我说继续,让我们通过使用许多并行连接使其变得简单和容易。
【讨论】:
啊,确实可以处理多个并行连接就好了。我应该在我的问题中澄清我指的是每个请求的多个连接,而不是典型的每个请求一个模式或连接池。编辑问题以反映这一点。感谢您的回复!【参考方案3】:我认为有关此答案的信息已过时。我开了一个新问题here
【讨论】:
以上是关于RethinkDB 和 Node.js/Express - 为并行查询打开多个连接?的主要内容,如果未能解决你的问题,请参考以下文章
RethinkDB 和 Node.js/Express - 为并行查询打开多个连接?
socket.io vs RethinkDB changefeed
rethinkdb - hasFields 查找具有多个多个缺失条件的所有文档