ユーザー間のリアルタイム通信を提供するREST APIを書いています。db.orders
コレクションがあるとしましょう。そして私は api を持っていGET /order/{id}
ます。この API は、ドキュメントの変更を待つ必要がありorder
ます。たとえば、 is の場合にのみ何らかのデータを返す必要order.status
がありready
ます。ロングポーリングの方法は知っていますが、データベースでデータが表示/変更されることを確認する方法がわかりません。アプリ インスタンスが 1 つあれば簡単です。次のように、メモリ内でこれを行うことができます。
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
、2 番目のハンドラーはデータのステータスを に設定しますready
。これは単なる疑似コードであり、多くのものが欠落しています (タイムアウトなど)。
問題は、そのようなアプリの多くのインスタンスを使用したい場合です。インスタンス間でリアルタイムで通信できるメッセージングメカニズムが必要です。
REDIS PUB/SUB について読みましたが、この方法で使用できるかどうかわかりません...
今のところ、node.js + restify + mongoDB を使用しています。