聊聊ElasticeSearch并发写的乐观锁机制

科技资讯 投稿 6500 0 评论

聊聊ElasticeSearch并发写的乐观锁机制

概述

关键对象

ES的老版本是用过_version字段的版本号实现乐观锁的。现在新版增加了基于_seq_no_primary_term字段,三个字段做乐观锁并发控制。

_version:标识文档的版本号,只有当前文档的更新,该字段才会累加;以文档为维度。

_seq_no:标识整个Index中的文档的版本号,只要Index中的文档有更新,就会累加该字段值;以Index为维度记录文档的操作顺序。

_primary_term:针对故障导致的主分片重启或主分片切换,每发生一次自增1;已分片为维度。

_version;目前修改指定版本的请求参数只能是

PUT user/_doc/1?if_seq_no=22&if_primary_term=2

乐观并发控制

乐观锁的操作主要就是两个步骤:

    第一步:冲突检测。
  • 第二步:数据更新。

AtomicStampedReference类,在CAS的基础上增加了一个Stamp(印戳或标记),使用这个印戳可以用来觉察数据是否发生变化,给数据带上了一种实效性的检验。

AtomicStampedReference原理。其流程大致如下:

  1. 检查版本号冲突:客户端在更新请求中提供了要更新文档的版本号,服务器会将客户端提供的版本号与实际文档的最新版本号进行比较。

  2. 如果客户端提供的版本号与实际文档的最新版本号不一致,表示发生了版本冲突,更新操作会被拒绝并抛出VersionConflictEngineException异常。

  3. 更新文档内容:在版本号更新完成后,Elasticsearch会执行实际的文档更新操作,包括更新字段的值、添加或删除字段等。

翻了下GPT,如下是给出的回复。佐证了我的猜想(源码看了下,翻不动!)

冲突检测的解决

List<VersionConflict> conflicts = response.getGetResult().getConflicts();

同时还可以配置重试策略,因为一般情况下,都是可以通过重试解决的,ES中配置retry_on_confict即可。

编程笔记 » 聊聊ElasticeSearch并发写的乐观锁机制

赞同 (35) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽