MongoDb:如何构建基于订阅的实时通知系统

MongoDb: How to build realtime subscription based notification system

本文关键字:于订阅 实时 系统 通知 构建 何构建 MongoDb      更新时间:2023-10-16

问题

我正在构建一个基于订阅的软件系统,当查询结果因添加/删除/更新而更改时,该系统会根据提供的查询提供通知源。例如,

  1. 订阅

    void mySystem.subscribe(collection, QUERY("name" << "abc"), callBack);
    

    其中回调定义为:

    void Client::Callback(ChangedDocuments, Operation)
    {
    // handle the change
    }
    
  2. 如果有人调用mySystem.Add(collection, documentsNameIsAbc),则会调用回调,以便向订阅客户端通知更改。

这需要尽快完成,所以像扫描重做日志这样的东西对我来说不起作用。

可能性

a) 一种简单的方法是记住所有查询的结果,在每次添加/删除/更新之后,再次运行所有查询,然后将diff作为通知发送。

b) 更聪明的方法是(在任何数据库操作之前)获取正在更改的文档,检查它是否"匹配"任何查询。如果是,请发送通知。但是,听起来不支持这种"匹配"。

c) 获取regex格式的查询,将更改后的文档序列化为json格式,然后运行regex-match。

我使用的是C++,尽管这个问题听起来与语言无关。

欢迎任何意见。

如果你是语言不可知论者,你可能想看看流星框架。它实现了oplog跟踪,巧合的是,昨天发布了一个新版本,它正专注于此:

Meteor 0.7.1:oplog支持复杂查询/缩放Meteor使用oplog尾随