記錄一次工作中遇到的問題。
后台管理系統中管理功能將數據保存到數據庫一份,同時也保存到ES中一份,然后終端POS從ES中取數據。
這時候問題來了,通過管理功能刪除數據,本來應該是同時刪除數據庫以及ES中的數據,然而,實際情況是數據庫中的數據已被刪除,ES中的數據還在,等1-2分鍾之后ES中數據才消失。這導致終端POS不能顯示最新的數據。
下面來看看問題的解決過程。
先來看看實體類的配置。
ESWindowgoods代表窗口菜單功能,ESWindowgoodsFuture代表未來菜譜功能,從document注解中的參數來看,兩個索引實體類的刷新間隔是一樣的。
但是實際功能操作過程中發現,窗口菜單功能刪除菜品后,ES不會立即刪除,未來菜譜功能刪除菜品后,ES會立即刪除。為什么配置一樣,兩個功能刪除操作后的行為不一樣呢?
這時候我決定看一下實際ES索引的設置到底是什么,這里我們使用elasticsearch-head插件來查看。
點擊索引下面的信息,然后再點擊索引信息,這時候就可以看到索引的初始設置以及屬性信息了
我們可以看到windowgoodsindex索引的refresh_interval屬性是-1,意思是不刷新。這樣就可以解釋,為什么窗口菜單刪除數據后,ES中沒有立即刪除,而是過1-2分鍾再刪這個現象了。
我們再來看看windowgoodsfutureindex索引的refresh_interval屬性,這個屬性不存在,這種情況下該屬性默認為1。這就能解釋,為什么未來菜譜刪除數據后,ES中可以立即刪除。於是,我們要重建windowgoodsfutureindex索引,使該索引的刷新行為和windowgoodsindex保持一致。
我們用這個命令重建索引,由於不想刪除原先索引中的數據,所以需要先把原索引數據導入到新索引中。導入完之后,我們使用新的windowgoodsfutureindex索引。這時候兩個索引的刷新行為保持一致了,在功能中刪除數據后,數據庫已經刪了,但是ES中數據還存在,過1-2分鍾才刪除。不過,我們的問題還是沒有解決,我們要達到刪除數據,數據庫和ES中都被刪除目的,我們現在可以再刪除后去調用ES的手動刷新方法來達到這個目的。
好了,再次測試,執行刪除操作后,數據庫和ES中的數據都可以刪除了。