面试题答案
一键面试1. 冲突检测
- 基于版本号:CouchDB 为每个文档维护一个
_rev
(修订版本号)。在多节点复制时,若不同节点对同一文档进行修改,每个修改都会产生一个新的_rev
。当尝试合并这些修改时,CouchDB 会发现具有不同_rev
的文档版本,从而检测到冲突。 - 文档标识:所有文档都有唯一的
_id
。若不同节点上具有相同_id
的文档_rev
不同,这就表明发生了冲突。
2. 冲突处理策略与方法
- 自动处理:
- 保留最新版本:默认情况下,CouchDB 会选择最新修订版本(版本号最大的
_rev
)作为“获胜”版本。在大多数简单场景中,这种方式能有效处理冲突,假设最新修改包含了更准确或更新的信息。 - 基于时间戳:尽管 CouchDB 主要依据
_rev
,但内部存储中也会考虑文档修改时间戳。若_rev
无法明确判断(例如不同节点同时创建文档),时间戳可作为辅助依据,较新时间戳的文档版本可能被选中。
- 保留最新版本:默认情况下,CouchDB 会选择最新修订版本(版本号最大的
- 手动处理:
- 用户介入:CouchDB 允许应用程序开发者或用户手动处理冲突。当冲突发生时,所有冲突的文档版本会以特殊格式存储在 CouchDB 中。开发者可以通过 API 获取这些冲突版本,分析每个版本的修改内容,然后根据业务逻辑决定如何合并或选择最终版本。
- 自定义合并逻辑:开发者可以编写自定义的合并函数,例如根据业务规则将不同冲突版本中的数据字段进行合并,而不是简单地选择最新版本。这需要对应用程序的业务有深入理解,适用于复杂业务场景。