面试题答案
一键面试乐观并发控制确保数据一致性的原理
在ElasticSearch中,乐观并发控制基于版本号机制。它假设大多数情况下不会发生冲突,允许并发操作。只有在实际更新时才检查版本号,以确保数据一致性。
更新流程
- 读取文档:客户端首先使用
GET
请求获取要更新的文档。此时,ElasticSearch返回文档内容及当前版本号(例如_version: 5
)。 - 本地修改:客户端在本地对获取到的文档进行修改操作。
- 发起更新请求:客户端带着修改后的文档以及之前获取到的版本号,使用
PUT
或POST
请求发起更新操作。例如:
{
"doc": {
"field1": "new value"
},
"version": 5
}
- 服务端验证:ElasticSearch收到更新请求后,检查请求中的版本号与当前文档的实际版本号是否一致。
- 如果一致,说明在客户端读取文档后没有其他请求修改过该文档,ElasticSearch执行更新操作,并将版本号递增(例如变为
_version: 6
)。 - 如果不一致,说明在客户端读取文档后有其他请求修改过该文档,ElasticSearch会返回一个版本冲突错误,客户端需要重新获取最新版本的文档,重复上述流程。
- 如果一致,说明在客户端读取文档后没有其他请求修改过该文档,ElasticSearch执行更新操作,并将版本号递增(例如变为
版本号的作用
- 标识文档状态:版本号唯一标识了文档在某个时刻的状态。每次文档被成功更新,版本号就会递增。
- 冲突检测:通过比较客户端请求中的版本号和服务端文档的实际版本号,ElasticSearch能够判断在客户端读取文档后是否有其他并发更新发生。如果版本号不一致,说明存在冲突,需要客户端重新操作,从而确保数据一致性。