ElasticSearch 并发的处理方式:锁和版本控制_07
文章目錄
- 現(xiàn)象
- 鎖
- 版本控制
- 最新方案
現(xiàn)象
當(dāng)我們使用 es 的 API 去進(jìn)行文檔更新時(shí),它首先讀取原文檔出來,然后對(duì)原文檔進(jìn)行更新,更新完成后再重新索引整個(gè)文檔。不論你執(zhí)行多少次更新,最終保存在 es 中的是最后一次更新的文檔。但是如果有兩個(gè)線程同時(shí)去更新,就有可能出問題。
要解決問題,就是鎖。
鎖
- 悲觀鎖
很悲觀,每一次去讀取數(shù)據(jù)的時(shí)候,都認(rèn)為別人可能會(huì)修改數(shù)據(jù),所以屏蔽一切可能破壞數(shù)據(jù)完整性的操作。關(guān)系型數(shù)據(jù)庫中,悲觀鎖使用較多,例如行鎖、表鎖等等。
- 樂觀鎖
很樂觀,每次讀取數(shù)據(jù)時(shí),都認(rèn)為別人不會(huì)修改數(shù)據(jù),因此也不鎖定數(shù)據(jù),只有在提交數(shù)據(jù)時(shí),才會(huì)檢查數(shù)據(jù)完整性。這種方式可以省去鎖的開銷,進(jìn)而提高吞吐量。
在 es 中,實(shí)際上使用的就是樂觀鎖。
版本控制
es6.7之前
在 es6.7 之前,使用 version+version_type 來進(jìn)行樂觀并發(fā)控制。根據(jù)前面的介紹,文檔每被修改一個(gè),version 就會(huì)自增一次,es 通過 version 字段來確保所有的操作都有序進(jìn)行。
version 分為內(nèi)部版本控制和外部版本控制。
- 內(nèi)部版本
es 自己維護(hù)的就是內(nèi)部版本,當(dāng)創(chuàng)建一個(gè)文檔時(shí),es 會(huì)給文檔的版本賦值為 1。
每當(dāng)用戶修改一次文檔,版本號(hào)就回自增 1。
如果使用內(nèi)部版本,es 要求 version 參數(shù)的值必須和 es 文檔中 version 的值相當(dāng),才能操作成功。
- 外部版本
也可以維護(hù)外部版本。
在添加文檔時(shí),就指定版本號(hào):
PUT blog/_doc/1?version=200&version_type=external {"title":"2222" }以后更新的時(shí)候,版本要大于已有的版本號(hào)。
vertion_type=external 或者 vertion_type=external_gt 表示以后更新的時(shí)候,版本要大于已有的版本號(hào)。
vertion_type=external_gte 表示以后更新的時(shí)候,版本要大于等于已有的版本號(hào)。
最新方案
(Es6.7 之后)
現(xiàn)在使用 if_seq_no 和 if_primary_term 兩個(gè)參數(shù)來做并發(fā)控制。
seq_no 不屬于某一個(gè)文檔,它是屬于整個(gè)索引的(version 則是屬于某一個(gè)文檔的,每個(gè)文檔的 version 互不影響)。現(xiàn)在更新文檔時(shí),使用 seq_no 來做并發(fā)。由于 seq_no 是屬于整個(gè) index 的,所以任何文檔的修改或者新增,seq_no 都會(huì)自增。
現(xiàn)在就可以通過 seq_no 和 primary_term 來做樂觀并發(fā)控制。
PUT blog/_doc/2?if_seq_no=5&if_primary_term=1 {"title":"6666" } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的ElasticSearch 并发的处理方式:锁和版本控制_07的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Attribute “singleton
- 下一篇: 一分钟解决 Github 访问慢