-1

CouchDB 的圣杯是它的复制功能。使用 TouchDB、Cloudant-Sync 和 Couchbase-Lite,您甚至可以将数据库从\复制到用户的智能手机,因此即使存在连接问题,数据也将可用。

CouchDB 复制协议(可能在不同的框架\sdks 中实现略有不同)为每个已更改的文档发出 GET 请求。

Cloudant和Iris-Couch提供基于数据库大小、轻量 http 请求数(GET、HEAD)和重量 http 请求数(PUT、POST、DELETE)的定价程序。这意味着为单个文档调用 GET 与调用 GET 到./_all_docs

从某种意义上说,对于这些定价程序,复制协议的效率似乎很低。例如,如果您的用户仅从服务器中提取文档,则使用它可能/_all_docs?include_docs=true比运行标准复制更便宜,即使/_all_docs请求使您下载未更改的文档......

我错过了什么吗?定价程序不应该考虑下载\上传的数据量而不是请求的数量吗?单个文档的 GET 请求不应该比调用/_all_docs或查看便宜得多吗?是否可以调整复制协议,使其在带宽方面效率较低但便宜得多?

PS 我知道 Couchbase 是一个单独的项目,CouchDB 复制协议对它没有任何影响。Couchbase 还支持从\到客户端的复制(通过 Couchbase Lite)。就对服务器的请求数量而言,有什么方法可以比较这两种机制?

- - 编辑 - -

看起来/_all_docs正在用于 Couchbase-Lite 复制算法,不是为了降低成本,而是为了优化流程: https ://github.com/couchbase/couchbase-lite-ios/wiki/Replication-Algorithm

  • 使用标准 API 可以实现上述批量获取优化的有限情况:第 1 代的修订(修订 ID 以“1-”开头)可以通过 _all_docs 批量获取,因为根据定义,它们没有修订历史。不幸的是 _all_docs 不能包含附件正文,因此如果它返回的文档的 JSON 表明它有附件,则必须单独获取这些附件。尽管如此,这种优化还是有很大帮助的,目前在 Couchbase Lite 中实现。

- 编辑 -

此问题正在 Couchbase 同步网关中处理,而不是作为 CouchDB 的一部分: https ://github.com/couchbase/sync_gateway/wiki/Bulk-GET

我想知道这是否会在 CouchDB 中实现。看起来按请求收费的服务提供商没有兴趣支持此功能......

4

1 回答 1

4

你有一点,然后又没关系。

为什么你有观点

实际上,运行单个 /_all_docs 请求只是返回所有文档的单个请求。您刚刚找到了一种欺骗您的房东为您提供“免费服务”的方法。

为什么没关系

  • 复制需要高效,因此您真的不希望从沙发检查每个可能已针对主服务器中的 _all_docs 更新的文档。即使你真的想这样做,为了保持合理的一致性,更新可能只会看到很小的变化,所以如果 1000 个文档中有 1 个在 2 次复制之间更新,那么按文档复制的开销成本非常小。

  • 假设您运行一个查询 _all_docs 以最小化请求的博客/应用程序。干得好,如果您的应用程序是响应式的,并且您需要来自具有 50 MByte 数据库的数据库中的 5 kByte 文档,那么您将失去大量用户,因为您将像任何事情一样没有响应。

  • 你优化在错误的一端。当有大约 100 万个获取请求时,您通常会达到 20 美元的限制。如果您有一个具有这种流量水平的网站并在其上投放广告,那么您可能会设法获得超过 500 美元(假设有效每千次展示费用为 0.5 美元)。通过添加内容而不是压缩 couchdb 的成本,您更有可能增加收入。

于 2014-11-28T23:59:41.990 回答