如何使用node.js应用程序中的RethinkDB管理多个用户更改进程

时间:2017-02-08 20:38:39

标签: javascript node.js rethinkdb

我需要一些关于如何在我的node.js应用中为多个用户使用rethinkDb的更改源的建议。

基本上我想要当用户登录我们的Web应用程序时,我想为该特定用户设置更改源,以监视由用户组织筛选的特定表的更改。

我在想,当用户连接时,他们也会通过socketio连接,我可以在连接时为用户分配更改源。然后在断开连接时关闭用户光标。

可能是这样的:

io.on('connection', (socket)=> { 
    //Assume user information is in socket.user
    r.db('database').table('entries').filter({organization: socket.user.organization}).changes().run(conn, (err, cursor){
        cursor_holder[socket.user.id] = cursor //Maybe hold the cursors in memory while the user is connected?
        cursor.each((err, entry)=>{
            socket.emit('update', entry);
        })
    })

    socket.on('disconnect', ()=>{
        cursor_holder[socket.user.id].close() //I dont know what the exact close method is for the feed.
    })
}

请原谅代码中的任何错误,但这是我必须处理我的最终目标的最初想法。

我很好奇你有什么建议可以如何正确处理我之前说过的最终目标。

提前感谢大家的时间和建议。非常感谢。

3 个答案:

答案 0 :(得分:0)

我也在寻找一些关于此的提示。我看到了另一种方法 - 使用您的数据订阅表以进行更改,然后让您的代码使用一些新数据更新特定用户。

如果为每个用户创建一个新的更改源,我恐怕最终会有大量的同时更改。不确定有多少可以同时运行。 如果用户通过简单地关闭浏览器注销会发生什么?我相信,改变饲料将继续运行。数据库将充满非封闭的更改源,并且永远不会得到用户不再对接收更改感兴趣的反馈。

答案 1 :(得分:0)

您可以使用它在rethinkdb中查询以检测任何更改,并记住它只适用于rethinkdb上下文希望这会提供一些帮助

  yield r.table('Us').filter(function (S) {
                    return S  //your rethinkdb query
                })
                .changes().merge(function () {
                    return {
                        total: r.table('Us').filter(function (x) {
                            return x    //your rethinkdb query
                        }).count(),
                    };
                })

答案 2 :(得分:0)

如果所有用户都订阅了相同的更改源,并且您不需要将includeInitial设置为true,则只能为服务器创建一个更改源(与每个服务器连接相反)并推送更改源到socket.io房间,然后将用户添加到连接房间。这样做的好处是可以在重新思考集群中保留cpu资源

服务器端:

var io = require('socket.io')(httpApp, {options});

r.table('cats')
.filter({location : 'kitchen'})
.changes({includeTypes : true})
.run(rethinkConnection, function(err, cursor) {
    if (err) {
        // error handling
    } else {
        cursor.each(function(err, row) {
            if (err) {
                // error handling
            } else {
                io.to('kitcatFeed').emit('kitcatChange', row);
            }
        });
    }
});

io.on('connection', function(socket) {
    socket.join('kitcatFeed');
});