【问题标题】:Which, if any, of the NoSQL databases can provide stream of *changes* to a query result set?哪些 NoSQL 数据库(如果有)可以为查询结果集提供 *changes* 流?
【发布时间】:2011-07-12 13:06:51
【问题描述】:

哪些 NoSQL 数据库(如果有)可以为查询结果集提供更改流?

谁能指点我一些例子?

首先,我认为没有一个 SQL 数据库提供此功能 - 我说的对吗?

我需要能够指定任意的、简单的查询,在 SQL 中的等价物可以写成:

SELECT * FROM accounts WHERE balance < 0 and balance > -1000;

我想要一个初始结果集:

id: 100, name: Fred, balance: -10
id: 103, name: Mary, balance: -200

但是我想要一连串的变化永远跟随,直到我阻止它们:

meta: remove, id: 100
meta: add,    id: 104, name: Alice, balance: -300
meta: remove, id: 103
meta: modify, id: 104, name: Alice, balance: -400
meta: modify, id: 104, name: Alison, balance: -400
meta: add,    id: 101, name: Clive, balance: -200
meta: modify, id: 104, name: Alison, balance: -100
...

注意:我不是在谈论流式传输大型结果集。我正在寻找软实时的变化流。

此外,如果可能,它需要向外扩展。

谢谢,

克里斯。

【问题讨论】:

  • 注意:在向 barricane-db (github.com/chrisdew/barricane-db) 添加这样的功能之前,这个问题确实是尽职调查。重新发明轮子没有意义。

标签: mongodb redis couchdb riak nosql


【解决方案1】:

不确定这是否正是您正在寻找的东西,但认为它可能足够相关,值得一提!

如果在 MongoDB 中使用复制,所有的写操作都存储在一个 oplog(操作日志)中。因此,每个插入/更新/删除都记录在那里,以便可以在辅助节点上重播。这是一个有上限的集合,因此循环并覆盖自身(您可以设置它的大小)。但理论上,这个 oplog 可以用作检索更改流的一种方式 - 我自己没有尝试过,但也许你可以轮询那个 oplog。

【讨论】:

  • 谢谢,已经完成了一半 - 但不是我正在寻找的干净、集成的解决方案。
【解决方案2】:

CouchDB 有一个更改提要。基本上它是一个区块链,或者说是数据库自成立以来的每一次变化的历史。您可以通过 JSON、JSONP、长轮询或作为连续流获取提要,并编写响应数据库更改的应用程序。

Here's the changes feed from my blog

要了解更多信息,请查看 CouchDB 指南的 this section

【讨论】:

  • 谢谢,但我很困惑。 视图的更改是否可用,还是只是所有更改?
  • CouchDB 团队一直在努力解决这个问题。我相信 Benoit 甚至可能已经在他的分支中实现了它。对于当前的 CouchDB,唯一的方法是查看 filtered 更改提要,并且过滤器仅显示会影响视图的更改(例如,它调用与 map-reduce 相同的代码)。当您获得 _changes 更新时,您可以 ping 视图 URL。
【解决方案3】:

只有头脑风暴的答案:

让我们以 MongoDB 为例,并且不想像上面描述的那样访问更改源。 是的,与其他答案相比,这听起来很糟糕,但这是我在写作时出现这些答案之前的第一个想法......

与此问题相关的当前功能是 Capped Collections (http://www.mongodb.org/display/DOCS/Capped+Collections) 和服务器端代码执行 (http://www.mongodb.org/display/DOCS/Server-side+Code+Execution)。

使用上限集合,写入大量数据但读取更少(如日志文件)会更容易 - 这种集合类型适用于这种情况。 服务器端脚本可用于外包大量处理(更少的应用程序代码),但如果您想将逻辑完全集成到应用程序中,则可以省略这一点。

不知道是否有带有“钩子”的 NoSQL 数据库。我知道这在 postgres (SQL) 中是可能的。

目前流逻辑必须在应用程序代码 AFAIK 中实现。

在 CouchDB 中,可以使用 MongoDB 中未实现的“视图”(如果这不正确,请给我一个链接,这也是一个有趣的话题!)。

不知道这是否有帮助。这是我在 SO 上第一次尝试回答。

【讨论】:

  • 顺便说一句:应用程序中的挂钩/过滤器是关键。你必须挂钩到你想要的模型的数据库写入。
【解决方案4】:

如果接收所有更改(不仅仅是对查询结果集的更改)是可以接受的,那么您可以创建 mongodb 复制从属服务器,并从主服务器接收所有更改。我见过用 php 写的 mongodb replication slave,所以实现起来应该不会太难。

【讨论】:

    【解决方案5】:

    mongoDB 实现了一个可尾游标,但仅适用于有上限的集合。见the docs。根据您的具体要求,它可能有用。

    【讨论】:

      【解决方案6】:

      虽然一个答案已被接受,但还有另一个答案可以触及您问题背后假设的核心。

      与获取数据更改列表有关的业务问题是什么?如果您收到的不仅仅是数据更改列表,而是一组告诉您为什么以及数据如何更改的事件。

      这个概念是“CQRS”作为一种架构背后的根本原因之一。基本上,您存储导致数据更改的所有事件,例如FundsDeposited、FundsWithdrawn 等,您就可以“重播”这些事件,不仅可以了解您的数据如何随时间变化,还可以了解原因。

      沿着这条路走下去,您就可以将事件存储为流,而不再局限于少数几个存储引擎。相反,您可以使用任何存储引擎来完成工作。

      【讨论】:

      【解决方案7】:

      这类事情应该在应用程序中完成,而不是在数据库中。

      意思是,每次你做出改变,都应该被记录为一个新的记录。不是对记录的修改。 如果您这样做,您可以为您的应用添加更多智能

      【讨论】:

        【解决方案8】:

        从 v.3.6 开始,MongoDB 使用 Change Streams 允许应用程序订阅实时更改列表:

        更改流允许应用程序访问实时数据更改,而不会出现拖尾 oplog 的复杂性和风险。应用程序可以使用更改流订阅集合上的所有数据更改并立即对其做出反应。

        更改流可以使具有依赖业务系统的架构受益,一旦数据更改持久,就会通知下游系统。例如,在实现提取、转换和加载 (ETL) 服务、跨平台同步、协作功能和通知服务时,变更流可以为开发人员节省时间。

        默认情况下,流返回对集合中所有文档的更改,但您可以添加聚合管道以仅过滤与查询结果集匹配的文档。

        【讨论】:

          猜你喜欢
          • 2021-01-14
          • 1970-01-01
          • 2019-10-15
          • 1970-01-01
          • 1970-01-01
          • 2014-09-01
          • 2023-03-08
          • 2019-06-30
          • 2011-10-01
          相关资源
          最近更新 更多