问题
我正在构建一个基于订阅的软件系统,当查询结果因添加/删除/更新更改的文档而发生更改时,该系统会根据提供的查询提供通知提要。例如,
订阅
void mySystem.subscribe(collection, QUERY("name" << "abc"), callBack);
其中回调定义为:
void Client::Callback(ChangedDocuments, Operation)
{
// handle the change
}
如果有人调用mySystem.Add(collection, documentsNameIsAbc)
,将调用回调,以便通知订阅客户端更改。
这需要尽快完成,所以像扫描重做日志这样的东西对我来说不起作用。
可能性
a)一种天真的方式是记住所有查询的结果,在每次添加/删除/更新后,再次运行所有查询,然后发送差异作为通知。
b)更聪明的方法是更改文档(在任何数据库操作之前),检查它是否与任何查询“匹配”。如果是,请发送通知。但是,不支持这种“匹配”的声音。
c)以正则表达式格式化查询,将更改文档序列化为json格式,并运行正则表达式匹配。
我正在使用C ++,虽然问题听起来是语言中立的。
欢迎任何意见。
答案 0 :(得分:0)
如果您与语言无关,则可能需要查看meteor框架。它实现了oplog拖尾,巧合的是,昨天发布了一个新版本,正好关注它:
Meteor 0.7.1: oplog support for complex queries / scaling Meteor using oplog tailing