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 查找具有多个多个缺失条件的所有文档

不向 rethinkdb 插入数据

开源项目 RethinkDB 关闭,创始人总结失败教训(市场定位错误)

如何在 Ubuntu 上卸载 RethinkDB?