這是發生在我身上的一個bug,困擾了我三天,已經讓我屢次懷疑人生。由於我這個工做是數據準備階段,後續還有一系列工做須要依賴我這些初始數據,壓力很大,感謝某人在這個時候給個人鼓勵,雖然只是寥寥幾句。這件事記起來僅爲往後提醒本身再也不犯相同的錯誤。工具
簡單來講,我作的是一個數據同步任務,將數據從es的一個type通過轉換和操做同步到另外一個type中,下面統一說A同步到B,並且這個同步是週期性執行的,下面經過一個流程圖:測試
循環的部分的流程圖不標準,你們懂意思就能夠,程序其實很簡單,除了引用的工具類,我就用了一個類就完成了上面的操做,每個過程是一個方法,方法結束後也會打印相應日誌,並且測試網通過測試也是沒問題的(這句話是否是很熟悉,若是你常常這麼說,那就當心了),結果到了生產網就出事了,具體兩個奇怪現象:spa
由於B端開始是沒數據的,因此出現上面兩個問題只多是我程序的問題。日誌
出現問題後,我直接蒙了,心想絕對不可能,而後一遍一遍的看程序,由於就一個類,因此看了好多遍,由於重複數據我是絕對認爲不可能的,因此個人關注點就放在了怎麼可能有重複,個人思路是兩邊所有查出來,以主機名加ip爲key,value爲自己,放到Map中。而後進行比較的。code
通過這樣後,依然沒有發現問題,數據無緣無故丟失,重複數據出現的莫名其妙,由於生產網不能隨意測試,因此每次出錯都很難過,而測試網又復現不了(測試網數據是僞造的),心都碎了,最後又從新看代碼,決定打印最詳細的日誌。主要是兩個地方:blog
第二步,按我以前的風格,是絕對不會這麼作的,感受過低級,可是這麼實在是沒有辦法了,而後從新測試,仔細看日誌,發現一個異常現象,數據實際內容沒有看,太多了,異常的是出現大量的已有數據的日誌,這點引發個人注意,我覈實過數據源,我這邊提示重複的數據,在數據源處只有一個,而後我就去看個人工具類,查詢工具類,發現了問題,程序以下:ip
batchSize在前邊定義的爲1000,及1000個批次查詢一次 ================================ public static List<String> queryAll(String[] index,String types){ long count=count(index,types); List<String> result=new ArrayList<>(); while(count>0){ int from=0; <========== int size=0; if(count>batchSize){ size=batchSize; count-=batchSize; }else{ size=(int) count; count=0; } //經過 from 和 size 查詢數據 並放到result中 from +=size; } return result; }
仔細看標紅那一行,我終於找到錯誤緣由了,個人同步類沒有錯,查詢es的工具類寫錯了,改了之後重試才能夠。開發
平時積累一些工具類,確實能夠大大減小通常開發的工做量,可是必定要通過嚴格的測試,否則基於對工具類的信任,不多會懷疑工具類會出錯。同步
對於數據處理,若是假定不會有相同數據,也要containsKey一些,由於每每會有意想不到的數據產出,這種狀況下出錯了還很差查詢。class