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

我正在编写REST API,它必须提供用户之间的实时通信。 可以说我有db.orders集合。 我有API GET /order/{id} 。 这个API应该等一下order文件的变化。 例如,只有当order.status ready时,它才会返回一些数据。 我知道如何做长轮询,但我不知道如何检查数据在数据库中出现/更改。 如果有一个应用程序实例很容易 – 那么我可以在内存中执行此操作,如下所示:

 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。

你正在寻找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上的每个操作,您将收到一个文档,您可以在其中确定是否有兴趣改变状态的文档。