來自: ? 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...