当前位置: 首页 > news >正文

ElasticSearch-文档元数据乐观并发控制

文章目录

  • 什么是文档?
  • 文档元数据
  • 文档的部分更新
  • Update 乐观并发控制

最近日常工作开发过程中使用到了 ES,最近在检索资料的时候翻阅到了 ES 的官方文档,里面对 ES 的基础与案例进行了通俗易懂的解释,读下来也有不少收获,所以打算记录一下。果真官方文档才是最好的“菜鸟教程”。

贴上官方文档:

Elasticsearch:权威指南-基础入门

什么是文档?

Elasticsearch 中,术语 文档 有着特定的含义。它是指最顶层或者根对象, 这个根对象被序列化成 JSON 并存储到 Elasticsearch 中,指定了唯一 ID。可以简单理解为我们平时操作存储的对象在 ES 中通过 JSON 序列化存储的内容,是 ES 中操作的最小单位。

{"name":         "John Smith","age":          42,"confirmed":    true,"join_date":    "2014-06-01","home": {"lat":      51.5,"lon":      0.1},"accounts": [{"type": "facebook","id":   "johnsmith"},{"type": "twitter","id":   "johnsmith"}]
}

文档元数据

一个文档不仅包含着其本身的数据,也包含文档有关的信息,可以称之为 「元数据」。

三个必须的元数据元素如下:

  • _index

    文档在哪存放,就是我们平时建立的索引

  • _type

    文档表示的对象类别,这个平时用的比较少,算是同一索引下的一个更细的类别划分

  • _id

    文档唯一标识,可以通过它检索唯一的文档。当创建一个新文档的时候,要么自己提供 _id,要么让 ES 自动生成

文档的部分更新

ES update API 似乎对文档直接进行了修改,但是实际上 ES 中文档是「不能被修改,只能被替换」,详细的过程如下:

  1. 从旧文档构建 JSON
  2. 更改该 JSON
  3. 删除旧文档
  4. 索引一个新文档

注意:其中操作“删除文档”也并不会立即将文档从磁盘中删除,只是将文档标记为已删除状态,即软删。随着我们不断索引更多的数据,ES 才会在后台线程中清理标记为已删除的文档。

Update API 整体遵循 检索-修改-重建索引 的处理过程,并且这三步都是发生在 ES 节点内部的,避免了客户端和 ES 集群的多次网络交互开销。通过减少检索和重建索引步骤之间的事件,也减少了其他进程的变更带来冲突的可能性。但是这不能完全消除冲突的可能性,可能还是会有某个进程在 update 设法重建索引前,另一进程请求修改了文档。

Update 乐观并发控制

ES 是分布式的,当文档创建、更新或删除的时候,新版本的文档必须复制到集群中的其他节点。ES 也是异步和并发的,这意味着这些复制请求被并行发送,并且到达目的地时也许是「乱序」的,ES 需要一种方法确保文档的旧版本不会覆盖新的版本。

ES 中每个文档都有一个 _version 号,可以当作其元数据的一部分,当文档被修改时,版本号会递增。ES 可以使用 _version 来确保变更以正确的顺序执行,如果旧版本的文档在新版本之后到达,可以被简单的忽略。

并且通过 _version 版本号还可以进行更新的乐观并发控制,这可以确保应用中相互冲突的变更不会导致数据冲突。我们可以通过指定想要修改的文档的 _version 来达到这个目的,如果该版本不是当前版本号,我们的请求会失败。

Update API 乐观并发控制:

Update API 的 检索-修改-重建索引 步骤拆解下来就是如下的 Get - Update - Put 请求,三个步骤不是原子的话就会产生冲突,像下面的示意图所示就会产生更新数据覆盖的问题

在这里插入图片描述

为了避免并发更新时产生的数据丢失,Update API 在「检索」步骤时检索得到当前文档的 _version 号,并传递版本号到 「重建索引」的请求上。如果另一个进程修改了处于「检索」和「重建索引」步骤之间的文档,那么 _version 号将不匹配,更新请求将会失败。这种场景就是先到的 request1 由于执行时间过长,反倒被后到的&执行时间更短的 request2 给冲突导致失败了。

在增量操作无关顺序的场景下,两个进程更新操作发生的顺序不太重要(比方说两个进程都对页面访问量进行递增计数),那么由于冲突导致更新失败的请求,唯一需要做的就是重试。

这可以通过设置参数 retry_on_conflict 来自动完成,这个参数规定了失败之前 update 应该重试的次数,它的默认值是 0,也就是默认不重试。下面的例子表示失败之前需要重试 5 次。

POST /website/pageviews/1/_update?retry_on_conflict=5 
{"script" : "ctx._source.views+=1","upsert": {"views": 0}
}

但是在其他情况下变更可能要求是「有序的」,那么在 ES update 的这个角度上来说,就不能开启重试逻辑,比方在更新账户余额场景下(非递增递减操作),先到的 request1 被后到的 request2 冲突失败了,此时 request2 是最新的数据,ES 也是能够维持「最终一致性的」,但如果让 request1 重试一次,账户余额就会被老的数据覆盖了,显然是不能接受的。

再拓展一下思路,上面仅仅是在 ES 系统内保证 update 的有序,如果放在整个分布式系统中去看,比方说消息系统生产者发送消息,消费者消费并更新 ES(canal 就有这种模式),如果要保证分布式系统的全局有序,就得额外考虑 1.生产者到 MQ 2.MQ 到消费者 3.消费者到更新ES 每个环节的「有序性」。

相关文章:

ElasticSearch-文档元数据乐观并发控制

文章目录 什么是文档?文档元数据文档的部分更新Update 乐观并发控制 最近日常工作开发过程中使用到了 ES,最近在检索资料的时候翻阅到了 ES 的官方文档,里面对 ES 的基础与案例进行了通俗易懂的解释,读下来也有不少收获&#xff0…...

使用Navicat Premium管理数据库时,如何关闭事务默认自动提交功能?

使用Navicat Premium管理数据库时,最糟心的事情莫过于事务默认自动提交,也就是你写完语句运行时,它自动执行commit提交至数据库,此时你就无法进行回滚操作。 建议您尝试取消勾选“选项”中的“自动开始事务”,点击“工…...

【单细胞-第三节 多样本数据分析】

文件在单细胞\5_GC_py\1_single_cell\1.GSE183904.Rmd GSE183904 数据原文 1.获取临床信息 筛选样本可以参考临床信息 rm(list ls()) library(tinyarray) a geo_download("GSE183904")$pd head(a) table(a$Characteristics_ch1) #统计各样本有多少2.批量读取 学…...

(java) IO流

学习IO流之前,我们需要先认识file对象,帮助我们更好的使用IO流 1.1 file 作用:关联硬盘上的文件 写法: File(String path); (推荐)File(String parent, String child); //由父级路径,再子级路径拼接而成File(File p…...

2025年1月个人工作生活总结

本文为 2025年1月工作生活总结。 研发编码 使用sqlite3命令行查询表数据 可以直接使用sqlite3查询数据表,不需进入命令行模式。示例如下: sqlite3 database_name.db "SELECT * FROM table_name;"linux shell使用read超时一例 先前有个编译…...

线性调整器——耗能型调整器

线性调整器又称线性电压调节器,以下是关于它的介绍: 基本工作原理 线性调整器的基本电路如图1.1(a)所示,晶体管Q1(工作于线性状态,或非开关状态)构成一个连接直流源V和输出端V。的可调电气电阻,直流源V由60Hz隔离变压器(电气隔离和整流&#…...

【2025美赛D题】为更美好的城市绘制路线图建模|建模过程+完整代码论文全解全析

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析&#xff0c…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.28 存储之道:跨平台数据持久化方案

好的,我将按照您的要求生成一篇高质量的Python NumPy文章。以下是第28篇《存储之道:跨平台数据持久化方案》的完整内容,包括目录、正文和参考文献。 1.28 存储之道:跨平台数据持久化方案 目录 #mermaid-svg-n1z37AP8obEgptkD {f…...

拼车(1094)

1094. 拼车 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:bool carPooling(vector<vector<int>>& trips, int capacity) {uint32_t passenger_cnt 0;//将原数据按照from排序auto func_0 [](vector<int> & …...

基于Python的人工智能患者风险评估预测模型构建与应用研究(下)

3.3 模型选择与训练 3.3.1 常见预测模型介绍 在构建患者风险评估模型时,选择合适的预测模型至关重要。不同的模型具有各自的优缺点和适用场景,需要根据医疗数据的特点、风险评估的目标以及计算资源等因素进行综合考虑。以下详细介绍几种常见的预测模型。 逻辑回归(Logisti…...

< OS 有关 > Android 手机 SSH 客户端 app: connectBot

connectBot 开源且功能齐全的SSH客户端,界面简洁,支持证书密钥。 下载量超 500万 方便在 Android 手机上&#xff0c;连接 SSH 服务器&#xff0c;去运行命令。 Fail2ban 12小时内抓获的 IP ~ ~ ~ ~ rootjpn:~# sudo fail2ban-client status sshd Status for the jail: sshd …...

向量和矩阵算法笔记

向量和矩阵算法笔记 Ps:因为本人实力有限,有一部分可能不太详细,若有补充评论区回复,QWQ 向量 向量的定义 首先,因为我刚刚学到高中的向量,对向量的看法呢就是一条有长度和方向的线,不过这在数学上的定义其实是不对,甚至跟我看的差别其实有点大,真正的定义就是数域…...

uniapp使用uni.navigateBack返回页面时携带参数到上个页面

我们平时开发中也经常遇到这种场景&#xff0c;跳转一个页面会进行一些操作&#xff0c;操作完成后再返回上个页面同时要携带着一些参数 其实也很简单&#xff0c;也来记录一下吧 假设从A页面 跳转到 B页面 A页面 直接上完整代码了哈&#xff0c;很简单&#xff1a; <t…...

Python 梯度下降法(二):RMSProp Optimize

文章目录 Python 梯度下降法&#xff08;二&#xff09;&#xff1a;RMSProp Optimize一、数学原理1.1 介绍1.2 公式 二、代码实现2.1 函数代码2.2 总代码 三、代码优化3.1 存在问题3.2 收敛判断3.3 函数代码3.4 总代码 四、优缺点4.1 优点4.2 缺点 Python 梯度下降法&#xff…...

Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年

Android Studio 1.0 宣发于 2014 年 12 月&#xff0c;而现在时间来到 2025 &#xff0c;不知不觉间 Android Studio 已经陪伴 Androider 走过十年历程。 Android Studio 10 周年&#xff0c;也代表着了我的职业生涯也超十年&#xff0c;现在回想起来依然觉得「唏嘘」&#xff…...

sem_wait的概念和使用案列

sem_wait 是 POSIX 标准中定义的一个用于同步的函数&#xff0c;它通常用于操作信号量&#xff08;semaphore&#xff09;。信号量是一个整数变量&#xff0c;可以用来控制对共享资源的访问。在多线程编程中&#xff0c;sem_wait 常用于实现线程间的同步。 概念 sem_wait 的基…...

集合的奇妙世界:Python集合的经典、避坑与实战

集合的奇妙世界&#xff1a;Python集合的经典、避坑与实战 内容简介 本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南&#xff0c;旨在帮助读者从基础入门到项目实战&#xff0c;全面提升编程能力。文章结构由 5 个版块组成&#xff0c;内容层层递进&#x…...

专业视角深度解析:DeepSeek的核心优势何在?

杭州深度求索&#xff08;DeepSeek&#xff09;人工智能基础技术研究有限公司&#xff0c;是一家成立于2023年7月的中国人工智能初创企业&#xff0c;总部位于浙江省杭州市。该公司由量化对冲基金幻方量化&#xff08;High-Flyer&#xff09;的联合创始人梁文锋创立&#xff0c…...

MySQL 索引存储结构

索引是优化数据库查询最重要的方式之一&#xff0c;它是在 MySQL 的存储引擎层中实现的&#xff0c;所以 每一种存储引擎对应的索引不一定相同。我们可以通过下面这张表格&#xff0c;看看不同的存储引擎 分别支持哪种索引类型&#xff1a; BTree 索引和 Hash 索引是我们比较…...

【ComfyUI专栏】如何使用Git命令行安装非Manager收录节点

当前的ComfyUI的收录的自定义节点很多&#xff0c;但是有些节点属于新出来&#xff0c;或者他的应用没有那么广泛&#xff0c;Manager管理节点 有可能没有收录到&#xff0c;这时候 如果我们需要安装需要怎么办呢&#xff1f;这就涉及到我们自己安装这些节点了。例如下面的内容…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...