ES - 并发冲突问题

ES基于自身乐观锁进行并发控制
ES基于Document中的version字段进行并发控制,初始创建version为1
每次需要带上version进行更新,该步骤需要多次,特别是在多线程环境下

基于external version进行并发控制
ES提供了一个插件,可以不用它提供的version,可以基于自己维护的一个版本号进行控制, 详细语法

?version=1&version_type=external

这里需要关注两点
1.ES提供的version需要与ES中的version一摸一样的时候才可以进行修改
2.external version提供的version比ES中的version大的时候才可以进行修改

partial update 部分修改
释义:每次传递需要发生修改的Field,不需要将全量的document传递过去
语法如下

POST /index/type/id/_update
{
  "doc" : {
        "field":"val"
   }
}

Partial Update内部原理和传统PUT方式内部原理是一样的,会将老的Document标记为deleted,然后创建一个新的Document。

Partial Update相较于全量替换的优点如下
1.所有的查询,修改和写入操作,都发生在ES中的一个shard 内部,避免了网络数据传输开销(减少两次网络请求),大大的提升了性能
2.减少了查询和修改的时间间隔,可以减少并发冲突的情况

Partial Update的并发控制
Retry策略,语法如下

POST /index/type/id?retry_on_confict=5

上面语法的意思是重新拿到版本号进行更新,最多重试五次

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容