我有一台服务器,其中包含一个couchdb数据库,其中包含我的应用程序所需的信息。它包含几兆字节的东西,一些日常变化的文档(添加最新消息,删除旧文档,更新一些)。
应用程序尽可能与服务器数据库同步(使此信息可脱机使用)。
但是,此信息对我的应用程序的每个用户都是全局的 - 因此必须限制为严格只读访问。但是,我读到couchdb需要写访问源代码才能有效复制(为了检查点)。
性能影响是什么?有什么方法可以解决这个问题吗?
答案 0 :(得分:6)
您可以通过在_design文档中编写validate_doc_update()
函数来限制写访问权限。您可以在official CouchDB documentation。
例如,此函数会将写入操作限制为仅限管理员:
function(newDoc, oldDoc, userCtx, secObj) {
// allow modifications by admins only.
if ((userCtx.roles.indexOf('_admin') !== -1)) {
return;
}
throw({forbidden: 'You are not allowed to edit public documents.'});
}
将其放入_design/readonly
文档(或您对设计文档的任何名称),并将函数命名为validate_doc_update
。
每个设计文档只能有一个validate_doc_update函数,但您当然可以定义多个设计文档。每当任何人尝试写入操作时,文档将按顺序发送到所有这些验证功能。如果任何函数抛出错误,则拒绝更新。
因此,请注意不要将此设计文档复制到普通用户应该能够写入的数据库中!
据我所知,常规复制仍然有效,因为验证函数不会针对复制检查点文档执行(它们具有特殊的/ _local /前缀)。但你应该明确地尝试这一点以确定。
每次发生文档写入时都会执行验证功能,即使对于管理员写入也是为了复制。根据您的应用程序,您可能会考虑一些特殊的复制策略来提高性能。
您描述的设置不应该造成问题:不允许用户写入,因此如果他们的公共数据库的复制速度很慢 ,则可以。如果您的公共数据库很少更新,也不会出现任何性能问题。
希望我能帮忙!