Couchdb 在聚类模式下监视更改源,返回相同自值的随机更改



根据互联网。 您请求/_changes?since=0&limit=1对更改执行所需的操作,然后使用last_seq值并传递给since并再次请求。

我的问题是,这跳过了更改。 您可以不断请求/_changes?since=0&limit=1并一遍又一遍地进行不同的更改。 只是偶尔实际获得对数据库的第一次更改。 有时你会得到第 7 个更改,或第 4 个更改,依此类推。 如果您然后重复但使用last_seq值,它会进一步跳过,据我所知,它永远不会返回并获得它跳过的更改。

在使用集群时,是否有一种正确的方法来定期观察 couchdb 更改提要,而无需使用套接字方法?

我们现在拥有的是一个 php 脚本,它运行在 cron 任务上并请求最后 1000 次更改,然后它通过它们工作并同步 SQL 数据库以匹配 couchdb 中的内容。 使用 couchdb 跳过更改,这是一个大问题。

CouchDB 2.x doc 指出(参见):

">_changes返回的结果是部分有序的。换句话说,不能保证多次调用时保留订单。

因此,当您调用/_changes?since=0&limit=1 时,您会得到不同的结果,因为无法保证订单。

_changes响应包含一个挂起属性,其中包含响应之外的元素数。如果您从上一个请求中获取last_seq值,并在下一个请求中将该值用作 since 属性,您将获得下一组更改,并且挂起的值会持续减少。

此外,您应该小心下一个文档说明:

如果任何给定自值中分片的指定副本不可用,则选择备用副本,并使用它们之间的最后一个已知检查点。如果发生这种情况,您可能会再次看到以前看到的变化。因此,使用_changes源的应用程序应该是"幂等的",即能够安全地多次接收相同的数据。

批量读取更改是 CouchDB 兼容客户端用作 Cloudant Sync 的 CouchDB 复制协议 (请参阅) 的建议,因此您描述的方法应该是正确的。

请不要使用更改序列的数值作为参考来推断有遗漏的更改,因为此数字是根据集群状态计算的,该状态在调用之间可能会有所不同。您可以查看此答案以获取更多详细信息。

最新更新