【问题标题】:DocumentDB Change Feed - How to see all changes to a documentDocumentDB Change Feed - 如何查看文档的所有更改
【发布时间】:2016-12-16 01:48:25
【问题描述】:

DocumentDB 提供的这个新的Change Feed 功能非常酷。但是,文档指出:

对文档的每个更改仅在更改源中出现一次。更改日志中仅包含给定文档的最新更改。中间更改可能不可用。

基本上,如果文档从修订版 A->B->C 开始,当轮询更改提要时,我们只会得到“C”。 - 我有一种情况,我也想看到“A”和“B”。

我知道一些现有的模式可以解决这个问题,但我真的希望利用这个新的 Change Feed 功能。我希望它会返回 A、B 和 C。

此功能的目的是让“工作人员”非常频繁地轮询服务吗?显然,工作人员轮询的频率越高,他们越不可能跳过对文档的修订。但是,我不希望因此对集合的性能产生不利影响。

【问题讨论】:

  • 只是大声思考,您不能为此目的使用 DocumentDB 触发器吗 - docs.microsoft.com/en-us/azure/documentdb/…?您可以在每次文档更新后触发触发器,该触发器将具有识别更改并在某处记录更改的代码。
  • 正确,触发器可以让我捕获差异。然后,我会将更改嵌入到文档本身或单独的文档中。两者都是相当常见的模式,具体取决于预期的更新数量。但是,出于数据仓库的目的,我有一个外部系统需要查看所有版本。这就是触发器+sproc的问题。
  • 但是为了其他人的利益阅读本文...绝对有可能 1) 使用触发器捕获差​​异,2) 将差异嵌入文档中,3) 检测更新的文档更改 Feed,4) 处理您已经“处理”更新 0-[i-1] 的情况和 5) 处理您在同一迭代中看到多个“新”更新的情况。 - 这只是更多的维护+编码。自上次调用更改提要以来,我希望只有一个文档的所有更新流。

标签: azure azure-cosmosdb


【解决方案1】:

DocumentDB 团队成员在这里。我首先要说,请在此处提议/投票支持对文档的所有版本/世代的支持:http://feedback.azure.com/forums/263030-documentdb

Change Feed 支持最新版本的目的有两个原因:

  1. 数据同步、流处理等很多问题都依赖最新版本,不需要中间版本
  2. 这种方法的优点是不需要额外的存储空间来存储所有版本,也不需要一段时间来提供更改源。

您提到您已经知道解决方法,但我只是为了其他人的利益而说明这一点:这个问题可以通过反转存储在 DocumentDB 中的内容来解决。也就是说,您可以通过创建新文档将所有版本存储在 DocumentDB 中,然后通过更新提要更新最新版本来合并它们。

要在 cmets 中回答问题,您必须绝对使用 Change Feed 而不是按时间戳查询,原因如下:

  1. 更改 Feed 效率更高。跨分布式数据集查询“按时间戳排序”执行全局排序,而更改提要在分区时间戳内局部排序。此外,没有查询解析开销
  2. 由于时钟偏差,时钟时间在分布式系统中的意义不大,区分一秒/毫秒内的多个更新可能很重要。相反,您需要表示数据库中确切提交顺序的“逻辑时间”。使用更改提要,分区键中的更新按照提交的确切顺序进行,并且您可以在事务中更新所有文档,并标记相同的逻辑时间戳。
  3. 与查询不同,更改源可以在多个工作人员之间以分布式方式使用。这在使用 Apache Storm 或 Azure Functions 等下游可扩展计算框架时非常有用。

【讨论】:

  • 嗨阿拉文德。感谢您的答复。我认为原因是额外的存储成本。
  • Aravind - 与不断运行针对自动更新时间戳进行选择的查询的客户端相比,您是否有机会阐明此功能的优势?可能存在性能差异吗?似乎成本是一个因素。查询会产生运行查询的 RU 成本,而 Change Feed 声称除了通过网络传输文档之外不会产生其他成本?
  • 很多原因。 1)效率更高。与部分在分区/键范围内按时间戳排序相比,在分布式数据集中查询“按时间戳排序”效率较低。此外,没有查询解析开销...
  • @AravindKrishnaR。交易呢?假设一个源集合包含所有版本,如何将生成多个文档的新版本的事务以原子方式传播到“合并的”第二个集合?
  • @CristiDiaconescu 在同一事务中更新的所有文档都将被标记相同的 _lsn 值并在同一结果页面中返回,您可以将它们以事务方式应用到目的地
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 2012-02-03
  • 2017-08-24
  • 2010-09-15
相关资源
最近更新 更多