Couchdb监视以群集模式提交的更改,并返回与值

时间:2019-07-17 14:50:25

标签: couchdb

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

我的问题是,这会跳过更改。您可以继续请求/_changes?since=0&limit=1,并不断获得不同的更改。仅偶尔偶尔对数据库进行第一次更改。有时您会得到第7个更改,或第4个更改,依此类推。如果您重复一次,但使用last_seq值,它会向前跳得更远,据我所知,它永远不会退后并得到跳过的更改。 / p>

在使用集群时,是否有一种适当的方法可以定期监视沙发床更改提要而不使用套接字方法而不是使用套接字方法?

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

1 个答案:

答案 0 :(得分:3)

CouchDB 2.x文档指出(see):

  

_changes 返回的结果是部分排序的。换句话说,不能保证多次调用都保留该顺序。”

因此,当您致电/ _changes?since = 0&limit = 1时,由于无法保证顺序,您将获得不同的结果。

_changes响应包含一个未决属性,该属性具有响应之外的元素数。如果您从上一个请求中获取last_seq值,并将该值用作下一个请求中的since属性,则将获得下一组更改,并且待定值会不断减小。

此外,您应该注意下一份文档说明:

  

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

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

请不要将change seq的数值用作参考,以推断存在遗漏的更改,因为此数字是根据集群状态计算得出的,该集群状态可能因调用而异。您可以检查this answer以获得更多详细信息。