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

时间:2015-09-05 02:49:43

标签: javascript node.js express rethinkdb

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

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();
                    });
            });
    }
};

现在,我需要创建一个显示所有苹果和所有土豆的页面/端点,所以我目前通过页面路由器中的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个并联(或更多)连接打开怎么办?

3 个答案:

答案 0 :(得分: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();
        }
    });
}

答案 1 :(得分:0)

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

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

  

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

更重要的是,如果您将更改Feed添加到您的应用中,您很可能希望根据http://docs.rethinkdb.com/2.1/api/javascript/changes/

在自己的连接上更改Feed
  

在自己的连接上打开更改源是个好主意。如果不这样做,那么在同一连接上运行的其他查询将遇到不可预测的延迟峰值,而连接会阻止更多更改。

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

答案 2 :(得分:-1)

我相信这个答案的信息已经过时了。我已经开了一个新问题here