Elasticsearch 併發修改樂觀鎖

2021-07-10 18:08:53 字數 3943 閱讀 4304

來自: ? 1

elasticsearch 的樂觀鎖,可以使用外部系統提供的版本號:?

這時elasticsearch將只檢查提供的版本是否比當前儲存在索引中的版本大(大多少不重要),如果是成功,否則失敗。

在elasticsearch中,更新請求實際上是分為兩個階段,獲取文件,修改文件,然後儲存文件。

那麼當兩個更新請求同時要修改文件的時候,系統樂觀的認為不會有兩個併發請求對乙個系統操作。

文件原本的版本為1,請求a獲取了version為1的文件,請求b也獲取了version為1的文件,然後請求a修改完文件後,並且先執行了儲存操作,這個時候,系統中的文件version變為了2。

這個時候,b再執行儲存操作的時候,告訴系統我要修改version為1的文件。系統就會丟擲乙個錯誤,說文件版本不匹配。然後這個錯誤由應用程式自己來進行控制。

這種機制在請求量大的時候會比悲觀鎖機制好。但是缺點是需要程式處理版本衝突錯誤,可能一般的方法是封裝更新操作,並且設定重複重試次數。

注意這裡的更新指的是:?

而不是:?

這個是create,這種在es內部沒有樂觀鎖的概念,是直接覆蓋,這種想解決資料被覆蓋,就要顯示的帶著version

下面的程式,併發6個程序同時批量更新乙個文件,在結果能看到有的請求出錯了,返回版本衝突。?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

<?php

require_once dirname(__file__).'/../shjf/vendor/autoload.php';

$client = new elasticsearch\client(['hosts'=> ['172.16.18.226:9200']]);

for($i=0;$i<5;$i++)

$params=[

'index'=>'test',

'type'=>'test',

'body'=> ,

];

for($i=0;$i<1;$i++)

try

catch(exception $e)

echo"end\n";

?>

}

]

}

《elasticsearch權威指南》處理衝突

ElasticSearch 併發操作問題

解決併發問題 問題的原因是 elasticsearch 不支援 acid 事務。對單個檔案的變更是 acidic 的,但包含多個文件的變更不支援。如果你的主要資料儲存是關聯式資料庫,並且 elasticsearch 僅僅作為乙個搜尋引擎 或一種提公升效能的方法,可以首先在資料庫中執行變更動作,然後在...

Elasticsearch 併發衝突處理機制

在電商場景下,工作流程為 讀取商品資訊,包括庫存數量 使用者下單購買 更新商品資訊,將庫存數減一 如果是多執行緒操作,就可能有多個執行緒併發的去執行上述的3步驟流程,假如此時有兩個人都來讀取商 品資料,兩個執行緒併發的服務於兩個人,同時在進行商品庫存資料的修改。假設庫存為100件 正確的情 況 執行...

elasticsearch配置詳解

elasticsearch的config資料夾裡面有兩個配置檔案 elasticsearch.yml和logging.yml,第乙個是es的基本配置檔案,第二個是日誌配置檔案,es也是使用log4j來記錄日誌的,所以logging.yml裡的設定按普通log4j配置檔案來設定就行了。下面主要講解下e...