ElasticSearch09-并发控制

零、文章目录

ElasticSearch09-并发控制

1、文档冲突

  • 在Elasticsearch中,文档冲突通常发生在并发更新时,多个进程或线程尝试修改同一个文档,但是没有正确的版本控制机制来处理这些并发操作。
(1)文档冲突的场景
  • 并发更新:当多个进程几乎同时对同一个文档进行更新时,如果它们的版本号相同或旧版本尝试覆盖新版本,就会发生冲突。
  • 批量操作:在批量更新或删除操作中,如果文档的版本号在操作执行期间发生变化,也可能导致冲突。
(2)解决文档冲突的方法
  • 乐观锁机制:Elasticsearch使用乐观锁机制,基于文档版本实现并发控制。每次更新或删除数据时,都需要对比版本号。
  • 外部版本控制:使用external版本类型,可以让外部系统(如数据库)控制版本号。当索引请求的版本号大于当前存储文档的版本时,文档才会被更新。
  • 使用文档版本号:Elasticsearch中的每个文档都有一个版本号(_version),在更新文档时,可以指定期望的版本号。如果指定的版本号低于实际版本号,更新会失败,并返回409冲突错误。
  • 使用if_seq_noif_primary_term:对于索引操作,可以使用if_seq_noif_primary_term参数来确保操作只在特定序列号和primary term的文档上执行,从而避免冲突。
  • 批量操作中的冲突处理:在执行批量更新(update_by_query)时,可以通过设置conflicts=proceed参数来忽略冲突并继续更新其他文档。
  • 重试机制:对于单个更新操作,可以使用retry_on_conflict参数来设置冲突后的重试次数。
(3)乐观并发控制(OCC)
  • 乐观并发控制基于这样的假设:事务之间的冲突很少发生,因此它允许事务在没有锁定任何资源的情况下进行。OCC通常在事务提交时检查是否违反了一致性条件。
  • 特点
    • 无锁:在事务执行期间,不锁定任何资源,因此可以提高并发性。
    • 冲突检测:在事务提交时检测冲突,如果发现冲突,则拒绝当前事务。
    • 重试机制:如果事务被拒绝,可以重新启动并重试。
    • 适用于冲突较少的环境:在冲突概率较低的情况下,OCC可以提高系统性能。
  • 实现方式
    • 版本号机制:每个数据项都有一个版本号,事务开始时记录版本号,提交时检查版本号是否变化。
    • 时间戳机制:事务根据时间戳顺序执行,时间戳较晚的事务在检测到冲突时需要等待或回滚。
(4)悲观并发控制(PCC)
  • 悲观并发控制基于这样的假设:事务之间的冲突很常见,因此它在事务开始时就锁定需要的资源,以防止其他事务访问。
  • 特点
    • 锁定资源:事务在执行过程中锁定资源,其他事务不能访问被锁定的资源。
    • 冲突预防:通过锁定资源来预防冲突,确保事务的隔离性。
    • 可能导致死锁:锁定机制可能导致死锁,需要额外的机制来检测和解决死锁。
    • 适用于冲突较多的环境:在冲突概率较高的情况下,PCC可以确保数据的一致性。
  • 实现方式
    • 行级锁:锁定数据库中的特定行或记录。
    • 表级锁:锁定整个表,阻止其他事务对表的访问。
    • 排它锁和共享锁:排它锁(Exclusive Locks)允许事务修改数据,共享锁(Shared Locks)允许多个事务读取数据。

2、乐观并发控制

(1)实现乐观控制
  • _version:es 每个文档都有版本号,每次更新版本号都会更新,老版本的 es 在更新数据的时候可以在 url 加上参数 _version=版本号,这样更新的时候就会对比版本,版本不匹配,更新就不成功。
  • if_seq_noif_primary_term:新版本的 es 已经不允许直接使用 version 来控制版本,但是可以使用if_seq_noif_primary_term这两个版本号衍生出来的字段来控制,效果是一样的。
(2)创建索引
# 请求
PUT my_index_1# 返回
{"acknowledged" : true,"shards_acknowledged" : true,"index" : "my_index_1"
}
(3)添加文档
  • 首先,我们索引一个新文档,当前版本号是 1
# 请求
POST /my_index_1/_doc/1
{"title": "Elasticsearch版本控制","content": "学习Elasticsearch版本控制的重要性。"
}# 返回
{"_index" : "my_index_1","_type" : "_doc","_id" : "1","_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 0,"_primary_term" : 1
}
(4)更新文档
  • 我们使用参数if_seq_no=0&if_primary_term=1 来更新文档
# 请求
POST /my_index_1/_doc/1?if_seq_no=0&if_primary_term=1
{"content": "深入理解Elasticsearch版本控制的机制。"
}# 返回
{"_index" : "my_index_1","_type" : "_doc","_id" : "1","_version" : 2,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 1,"_primary_term" : 1
}
(5)并发更新
  • 假设另一个线程也尝试更新同一个文档,但是使用的是旧的版本信息,将返回409错误,表示版本已经过时。
# 请求
POST /my_index_1/_doc/1?if_seq_no=0&if_primary_term=1
{"content": "探索Elasticsearch版本控制的最佳实践。"
}# 返回
{"error" : {"root_cause" : [{"type" : "version_conflict_engine_exception","reason" : "[1]: version conflict, required seqNo [0], primary term [1]. current document has seqNo [1] and primary term [1]","index_uuid" : "yQKxbXSMTu-S2w28Quakjw","shard" : "0","index" : "my_index_1"}],"type" : "version_conflict_engine_exception","reason" : "[1]: version conflict, required seqNo [0], primary term [1]. current document has seqNo [1] and primary term [1]","index_uuid" : "yQKxbXSMTu-S2w28Quakjw","shard" : "0","index" : "my_index_1"},"status" : 409
}
(6)处理冲突
  • 我们可以在客户端实现重试逻辑。如果收到409错误,我们可以获取最新的文档版本信息,然后重试更新
# 请求
GET /my_index_1/_doc/1# 返回
{"_index" : "my_index_1","_type" : "_doc","_id" : "1","_version" : 2,"_seq_no" : 1,"_primary_term" : 1,"found" : true,"_source" : {"content" : "深入理解Elasticsearch版本控制的机制。"}
}
  • 使用新版本信息更新成功
# 请求
POST /my_index_1/_doc/1?if_seq_no=1&if_primary_term=1
{"content": "探索Elasticsearch版本控制的最佳实践。"
}# 返回
{"_index" : "my_index_1","_type" : "_doc","_id" : "1","_version" : 3,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 2,"_primary_term" : 1
}

3、外部并发控制

(1)外部版本控制场景
  • 一个常见的场景是使用其它数据库作为主要的数据存储,使用 Elasticsearch 做数据检索,这意味着主数据库的所有更改发生时都需要被复制到 Elasticsearch,如果多个进程负责这一数据同步,你可能遇到类似于之前描述的并发问题。此时需要控制版本号大于 es 版本号。
(2)三种控制方式对比
  • 乐观并发控制(_version):老版本 es 使用,传入的版本号必须和 es 数据版本号一致。
  • 乐观并发控制(if_seq_noif_primary_term):新版本 es 使用,传入的参数必须和 es 数据一致。
  • 外部版本控制:通过version_type=external&version=版本号参数来实现。但是这里的版本号必须是大于 es 数据中的版本号,小于等于会报错。
(3)低版本更新文档
  • 当外部版本号小于等于 es 版本号时,更新失败。
# 请求
POST /my_index_1/_doc/1?version_type=external&version=3
{"content": "探索Elasticsearch版本控制的最佳实践。222"
}# 返回
{"error" : {"root_cause" : [{"type" : "version_conflict_engine_exception","reason" : "[1]: version conflict, current version [3] is higher or equal to the one provided [3]","index_uuid" : "yQKxbXSMTu-S2w28Quakjw","shard" : "0","index" : "my_index_1"}],"type" : "version_conflict_engine_exception","reason" : "[1]: version conflict, current version [3] is higher or equal to the one provided [3]","index_uuid" : "yQKxbXSMTu-S2w28Quakjw","shard" : "0","index" : "my_index_1"},"status" : 409
}
(4)高版本更新文档
# 请求
POST /my_index_1/_doc/1?version_type=external&version=4
{"content": "探索Elasticsearch版本控制的最佳实践。222"
}# 返回
{"_index" : "my_index_1","_type" : "_doc","_id" : "1","_version" : 4,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 3,"_primary_term" : 1
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492066.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Proteus软件仿真STM32F103寄存器方式PID调速电机

因为电脑中只装了IAR,所以本次编译环境就只能是IAR,所用软件版本是9.32.1。 本次仿真为,纯手写代码,不用任何库,包括启动文件也是手写。 首先是启动文件,该文件是汇编文件,命名为start.s&…

QtitanChart组件——高效、灵活的Qt数据可视化解决方案

在现代应用开发中,数据可视化已经成为不可或缺的一部分。无论是商业分析工具、财务报表、工程图表,还是科学实验数据展示,如何以直观、易理解的方式展示数据,往往决定了软件的可用性与用户体验。对于Qt开发者来说,Qtit…

YOLOv11融合[CVPR2024]Starnet中的star block特征提取模块

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《Rewrite the Stars》 一、 模块介绍 论文链接:https://arxiv.org/abs/2403.19967 代码链接:https://github.com/ma-xu/Rewri…

LabVIEW农机自主导航监控系统

随着现代农业技术的快速发展,自主导航农机的需求日益增加,提高作业效率和减少劳动成本成为农业现代化的关键目标。本文介绍了一个基于LabVIEW的农机自主导航监控系统的开发案例,该系统通过先进的传感器与控制技术,实现农机在田间作…

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…

番外篇 | Hyper-YOLO:超图计算与YOLO架构相结合成为目标检测新的SOTA !

前言:Hello大家好,我是小哥谈。Hyper-YOLO,该方法融合了超图计算以捕捉视觉特征之间复杂的高阶关联。传统的YOLO模型虽然功能强大,但其颈部设计存在局限性,限制了跨层特征的融合以及高阶特征关系的利用。Hyper-YOLO在骨干和颈部的联合增强下,成为一个突破性的架构。在COC…

php基础:正则表达式

1.正则表达式 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。 在PHP中,正则表达式一般是由正规字…

Postman接口测试:全局变量/接口关联/加密/解密

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 全局变量和环境变量 全局变量:在postman全局生效的变量,全局唯一 环境变量:在特定环境下生效的变量,本环境内唯一 …

vue响应式数据-修改对象的属性值,视图不更新

如图: 一:问题是: 我把数据处理后能console.log()打印出来,但是页面的内容不能同步的更新渲染; 二:要求: 在数组循环列表里面,我点击单个的item按钮时,需要实时加载进度…

configure错误:“C compiler cannot create executables“

执行./configure命令出现如下奇怪的错误,百思不得姐: ./configure命令的日志文件为config.log,发生错误时,该文件的内容: This file contains any messages produced by compilers while running configure, to aid d…

【Java学习笔记】多线程基础

并行:同一时刻,多任务同时进行 多任务分别进行 一、线程相关概念 1.程序 是为完成特定任务、用某种语言编写的一组指令的集合。 简单的说:就是我们写的代码 2.进程 (1)进程指的就是运行中的程序,比如我们使用QQ,就…

PyTorch基础入门

目录 前言一、[张量的广播&基本运算](https://www.bilibili.com/video/BV1Gg411u7Lr/?spm_id_from333.999.0.0)1. 张量的广播特性2. 逐点&规约&比较运算 二、张量的线性代数运算1. BLAS & LAPACK2. 矩阵形变及特殊矩阵构造3. 矩阵基本运算4. 矩阵的线性代数运…

XXE靶机攻略

XXE-Lab靶场 1.随便输入账号密码 2.使用bp抓包 3.插入xml代码,得到结果 xxe靶机 1.安装好靶机,然后输入arp-scan -l,查找ip 2.输入ip 3.使用御剑扫描子域名 4.输入子域名 5.输入账号密码抓包 6.插入xml代码 7.使用工具解码 8.解码完毕放入文…

计算机知识笔试

一、计算机网络 1.网络分类 树型、总线型、环型一般是局域网所用的拓扑结构,广域网和远程计算机网络普遍采用网状拓扑结构。 2.OSI模型各层功能 比特、帧、端到端 3.传输层协议 TCP:传输控制协议 UDP:用户数据报协议 传输层、可靠、连接 4.网络层协议 IP协议是…

设计规规范:【App 配色】

文章目录 引言I App 配色组成色彩象征 & 联想II 知识扩展设计流程图UI设计交互设计UI交互设计引言 设计规范,保持设计一致性,提高设计效率。宏观上对内统一,管理与合作变得容易。 按类型管理颜色、文本样式、图标、组件(symbol)。 蓝湖设计规范云 https://lanhuapp.co…

计算生物学与系统生物学

计算生物学 计算生物学是一个利用数学、统计学、计算机科学和生物学知识来解决生物学问题的学科。它的核心目标是通过开发和应用计算方法来分析和解读大量的生物数据,以揭示生命现象的规律和机制。 1. 基因组学分析 计算生物学在基因组学中的应用主要集中在基因的…

timestamp 时间戳转换成日期的方法 | java.util

时间戳通常是一个long数据(注意java中赋值时需要带上L标识是long整型,否则int过长报错) 代码实现 常用工具类: java.util.Datejava.time.Instantjava.time.format.DateTimeFormatter toInstant() 方法的功能是将一个 Date 对象…

【OpenCV计算机视觉】图像处理——平滑

本篇文章记录我学习【OpenCV】图像处理中关于“平滑”的知识点,希望我的分享对你有所帮助。 目录 一、什么是平滑处理 1、平滑的目的是什么? 2、常见的图像噪声 (1)椒盐噪声 ​编辑(2) 高斯噪声 &a…

在IDE中使用Git

我们在开发的时候肯定是经常使用IDE进行开发的,所以在IDE中使用Git也是非常常用的,接下来以IDEA为例,其他的VS code ,Pycharm等IDE都是一样的。 在IDEA中配置Git 1.打开IDEA 2.点击setting 3.直接搜索git 如果已经安装了会自…

数据可视化-1. 折线图

目录 1. 折线图适用场景分析 1. 1 时间序列数据展示 1.2 趋势分析 1.3 多变量比较 1.4 数据异常检测 1.5 简洁易读的数据可视化 1.6 特定领域的应用 2. 折线图局限性 3. 折线图代码实现 3.1 Python 源代码 3.2 折线图效果(网页显示) 1. 折线图…