【问题标题】:waiting for data to appear/change in DB等待数据在数据库中出现/更改
【发布时间】:2013-08-12 14:53:32
【问题描述】:

我正在编写 REST api,它必须提供用户之间的实时通信。可以说我有db.orders 收藏。我有 api GET /order/{id}。这个 api 应该等待 order 文档中的一些变化。例如,它应该只在order.statusready 时返回一些数据。我知道如何进行长轮询,但我不知道如何检查数据库中出现/更改的数据。如果有一个应用程序实例会很容易 - 然后我可以在内存中执行此操作,如下所示:

var queue = []

// GET /order/{id}
function(req,res,next) {
    var data = getDataFromDb();
    if(data && data.status == 'ready') {
        res.send(data);
        return;
    }
    queue.push({id: req.params.id, req: req, res: res, next: next});
}

// POST /order/{id}
function(req,res,next) {
    req.params.data.status = 'ready'
    saveToDb(req.params.data);
    var item = findInQueue(queue,req.params.id); 
    if(item) item.res.send(req.params.data);
}

第一个处理程序等待数据状态为ready,第二个处理程序将数据状态设置为ready。它只是一个伪代码,缺少很多东西(例如超时)。

问题是当我想使用此类应用程序的许多实例时 - 我需要一些消息传递机制来允许跨实例实时通信。

我阅读了有关 REDIS PUB/SUB 的信息,但我不确定是否可以以这种方式使用它...

我现在正在使用 node.js + restify + mongoDB。

【问题讨论】:

    标签: node.js mongodb rest redis


    【解决方案1】:

    您正在寻找操作日志。这是一个特殊的上限集合,其中存储了数据库上的所有操作。要在单个服务器上启用它们,您可以这样做。

    mongod --dbpath=./data --oplogSize=100 --replSet test
    

    然后使用控制台连接到服务器并写入

    rs.initiate()
    

    使用控制台并做

    use local
    show collections
    

    注意集合 oplog.rs。它包含已应用于服务器的所有操作。如果您使用的是 node.js,您可以通过以下方式监听更改

    var local = db.db("local");
    var steam = local.collection("oplog.rs").find({}, {tailable:true, awaitdata:true}).stream();
    stream.on('data', function(doc) {
    });
    

    对于 mongodb 上的每个操作,您都会收到一个文档,您可以在其中确定您是否对更改状态感兴趣的内容。

    【讨论】:

    • 非常感谢,这似乎是我在寻找的东西 - 但它有效吗?您如何看待将 redis 与 pub/sub 一起使用?我已经用 redis 实现了原型,它似乎可以工作,但我还不知道它的性能......
    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2021-10-06
    • 2023-03-10
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多