ES處理衝突

2021-08-09 11:56:53 字數 858 閱讀 5595

1、什麼是文件

物件json序列化後是乙個文件
2、如何唯一確定乙個文件

_index + _type + _id

id可以由外部指定,也可以由es自動生成

3、es更新文件流程

先get原始文件,然後修改,最後將整個文件進行再次索引處理
4、es中_version變更

對應於增刪查改操作,es中索引、put和刪除操作時,無**檔有沒有變化,它的_version都會增加
5、如何處理修改衝突

樂觀併發控制:所有更新或刪除文件的api都支援version引數,從而實現樂觀併發控制

使用場景1:es作為持久化層

問題描述:不同程序同時對某乙個文件進行修改

解決方案:先get操作獲取了_version,在修改時傳入之前獲取得version引數,只有當前文件version與指定version引數相等時才執行更新,否則提示失敗

使用場景2:mysql作為持久化層,es只是用於搜尋

問題描述:當主庫(mysql)中資料發生更改,需要更新es,可能存在併發修改?

解決方案:es比較外部version是否大於文件_version,才能更新成功,例如put /website/blog/123?version=5&version_type=external

使用場景3:無關順序的更新(區域性更新:新增欄位或改變字段值)

問題描述:對於很多的區域性更新來說,文件有沒有發生變化實際上不重要

解決方案:設定retry_on_conflict,規定自動完成這項請求的次數

ES併發衝突的問題

當併發操作es的執行緒越多,或者併發請求越多,或者是讀取乙份資料,供使用者查詢和操作的,時間越長,因為這段時間裡很可能 資料在es已經被修改了,那麼我們拿到的就是舊的資料,基於舊資料操作,那麼後續肯定會出問題 所以我們有悲觀鎖和樂觀鎖倆種併發控制方案 悲觀鎖併發控制方案 常見於關係型資料庫中,比如m...

hash衝突處理

1 衝突是如何產生的?上文中談到,雜湊函式是指如何對關鍵字進行編址的規則,這裡的關鍵字的範圍很廣,可視為無限集,如何保證無限集的原資料在編址的時候不會出現重複呢?規則本身無法實現這個目的。舉乙個例子,仍然用班級同學做比喻,現有如下同學資料 張三,李四,王五,趙剛,吳露.假如我們編址規則為取姓氏中姓的...

Git 衝突處理

tom想看,jerry 在他的私人分支做什麼?這就是為什麼他試圖從wchar support分支把最新的修改,但git 放棄操作在得到錯誤訊息後。tom centos src git pull origin wchar support上面的命令會產生以下結果。remote counting obje...