CouchDB的圣杯是它的复制功能。使用TouchDB,Cloudant-Sync和Couchbase-Lite,您甚至可以将数据库从\复制到用户'智能手机,即使存在连接问题,数据仍然可用。
CouchDB replication protocol(可能在不同的框架\ 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
或视图便宜得多吗?
是否可以调整复制协议,以便在带宽方面效率更低但更便宜?
P.S。 我知道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 Sync Gateway中处理,而不是CouchDB的一部分: https://github.com/couchbase/sync_gateway/wiki/Bulk-GET
我想知道这是否会在CouchDB中实现。看起来每个请求收费的服务提供商并不感兴趣支持此功能...
答案 0 :(得分:3)
你有一点,然后再无所谓。
为什么你有一个观点
确实运行单个/ _all_docs请求只是返回所有文档的单个请求。您刚刚找到了欺骗主持人为您提供“免费服务”的方法。
为什么无关紧要
复制需要高效,因此您真的不希望奴隶沙发检查可能已针对主服务器中的_all_docs更新的每个文档。即使您确实想要这样做,为了保持合理的一致性,更新可能只会看到一小部分更改,因此如果1000个文档中的1个在2次复制之间更新,那么按文档复制的开销成本非常小。
假设您运行查询_all_docs的博客/应用程序以最小化请求。干得好,如果您的应用程序要响应,并且您需要来自具有50 MB数据库的数据库中的5 KB文档,那么您只会丢失大量用户,因为您将像任何事情一样无响应。
您在错误的一端进行优化。当有大约100万个获取请求时,您通常会达到20美元的限制。如果您的网站具有此类流量并且您在其上投放广告,那么您可能会获得超过500美元(假设有效每千次展示费用为0.5美元)。通过添加内容而不是通过压缩couchdb的成本,您将更有可能增加收入。