等待数据在DB中出现/更改

时间:2013-08-12 14:53:32

标签: node.js mongodb rest redis

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

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。

1 个答案:

答案 0 :(得分:2)

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

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上的每个操作,您将收到一个文档,您可以在其中确定您感兴趣的内容是否已更改状态。