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 每个环节的「有序性」。

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

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

相关文章

实验二 数据库的附加/分离、导入/导出与备份/还原

实验二 数据库的附加/分离、导入/导出与备份/还原 一、实验目的 1、理解备份的基本概念,掌握各种备份数据库的方法。 2、掌握如何从备份中还原数据库。 3、掌握数据库中各种数据的导入/导出。 4、掌握数据库的附加与分离,理解数据库的附加与分离的作用。…

技术中台与终搜——2

文章目录 5、语言处理与自动补全技术探测5.1 自定义语料库5.1.1 语料库映射OpenAPI5.1.2 语料库文档OpenAPI 5.2 产品搜索与自动补全5.2.1 汉字补全OpenAPI5.2.2 拼音补全OpenAPI 5.3 产品搜索与语言处理5.3.1 什么是语言处理(拼写纠错)5.3.2 语言处理Op…

15_业务系统基类

创建脚本 SystemRoot.cs 因为 业务系统基类的子类 会涉及资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 所以在业务系统基类 提取引用资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 并调用单例初始化 using UnityEngine; // 功能 : 业务系统基类 public c…

【Linux】华为服务器使用U盘安装统信操作系统

目录 一、准备工作 1.1 下载UOS官方系统 1.2制作启动U盘 1.3 服务器智能管理系统iBMC 二、iBMC设置U盘启动 一、准备工作 1.1 下载UOS官方系统 服务器CPU的架构是x86-64还是aarch64),地址:统信UOS生态社区 - 打造操作系统创…

cursor重构谷粒商城04——vagrant技术快速部署虚拟机

前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶到中高阶程序员。 本项目将基于谷粒商城…

如何在gitee/github上面搭建obsidian的图床

在搭建图床之前我们需要知道图床是一个什么东西,图床顾名思义就是存放图片的地方,那么我们为什么要搭建图床呢?因为我们在写博客的时候,很多同学都是在本地使用typora或者是obsidian进行markdown语法的文章的书写,文件格式通常都是…

SSM东理咨询交流论坛

🍅点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 js…

http的请求体各项解析

一、前言 做Java开发的人员都知道,其实我们很多时候不单单在写Java程序。做的各种各样的系统,不管是PC的 还是移动端的,还是为别的系统提供接口。其实都离不开http协议或者https 这些东西。Java作为编程语言,再做业务开发时&#…

【云安全】云原生-Docker(五)容器逃逸之漏洞利用

漏洞利用逃逸 通过漏洞利用实现逃逸,主要分为以下两种方式: 1、操作系统层面的内核漏洞 这是利用宿主机操作系统内核中的安全漏洞,直接突破容器的隔离机制,获得宿主机的权限。 攻击原理:容器本质上是通过 Linux 的…

微信小程序date picker的一些说明

微信小程序的picker是一个功能强大的组件&#xff0c;它可以是一个普通选择器&#xff0c;也可以是多项选择器&#xff0c;也可以是时间、日期、省市区选择器。 官方文档在这里 这里讲一下date picker的用法。 <view class"section"><view class"se…

[java] 面向对象进阶篇1--黑马程序员

目录 static 静态变量及其访问 实例变量及其访问 静态方法及其访问 实例方法及其访问 总结 继承 作用 定义格式 示例 总结 子类不能继承的内容 继承后的特点 成员变量 成员变量不重名 成员变量重名 super访问父类成员变量 成员方法 成员方法不重名 成员方法…

AI News(1/21/2025):OpenAI 安全疏忽:ChatGPT漏洞引发DDoS风险/OpenAI 代理工具即将发布

1、OpenAI 的安全疏忽&#xff1a;ChatGPT API 漏洞引发DDoS风险 德国安全研究员 Benjamin Flesch 发现了一个严重的安全漏洞&#xff1a;攻击者可以通过向 ChatGPT API 发送一个 HTTP 请求&#xff0c;利用 ChatGPT 的爬虫对目标网站发起 DDoS 攻击。该漏洞源于 OpenAI 在处理…

LLMs的星辰大海:大语言模型的前世今生

文章目录 一. LLM 的演进&#xff1a;从规则到智能的跃迁 &#x1f4ab;1.1 语言模型的蹒跚起步 &#x1f476;1.2 RNN 与 LSTM&#xff1a;序列建模的尝试 &#x1f9d0;1.3 Transformer 的横空出世&#xff1a;自注意力机制的革命 &#x1f4a5;1.4 LLM &#xff1a;从预测到…

7-Zip高危漏洞CVE-2025-0411:解析与修复

7-Zip高危漏洞CVE-2025-0411&#xff1a;解析与修复 免责声明 本系列工具仅供安全专业人员进行已授权环境使用&#xff0c;此工具所提供的功能只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利…

数据结构(精讲)----树(应用篇)

特性&#xff1a; 什么是树&#xff1a; 树(Tree)是(n>0)个节点的有限集合T&#xff0c;它满足两个条件&#xff1a; (1) 有且仅有一个特定的称为根&#xff08;Root&#xff09;的节点。 (2) 其余的节点可以分为m&#xff08;m≥0&#xff09;个互不相交的有限集合T1、…

【动态规划】--- 斐波那契数模型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey &#x1f3e0; 第N个泰波那契数模型 &#x1f4cc; 题目解析 第N个泰波那契数 题目要求的是泰波那契数&#xff0c;并非斐波那契数。 &…

如何确保Spring单例Bean在高并发环境下的安全性?

在Spring中&#xff0c;单例Bean就像是一个“公共的水杯”&#xff0c;整个应用程序中的所有线程都会共享这一个实例。在大部分情况下&#xff0c;这没什么问题&#xff0c;但如果多个线程同时想要修改这个“水杯”里的内容&#xff0c;就可能会出现问题了。 想象一下&#xff…

期刊审稿意见回复的LaTeX模板分享

下载网址 https://github.com/NeuroDong/Latex_for_review_comments 效果展示 分享内容 在学术写作过程中&#xff0c;回复审稿意见是一个重要且繁琐的环节。由于审稿人众多&#xff0c;使用Word进行排版往往效率低下。为了提高效率&#xff0c;我在网上找到了一个LaTeX模板…

Spring Boot/MVC

一、Spring Boot的创建 1.Spring Boot简化Spring程序的开发,使用注解和配置的方式开发 springboot内置了tomact服务器 tomact:web服务器,默认端口号8080,所以访问程序使用8080 src/main/java:Java源代码 src/main/resource:静态资源或配置文件,存放前端代码(js,css,html) s…

Spring--SpringMVC的调用流程

一.简介 1.1主要作用 SSM框架构建起单的技术栈需求&#xff01;其中的SpringMVC负责表述层&#xff08;控制层&#xff09;实现简化&#xff01; 最终总结&#xff1a; 1. 简化前端参数接收( 形参列表 )2. 端数据响应(返回值)1.2核心组件和调用流程 Spring MVC与许多其他Web…