【疑難雜症03】數據同步遇到的坑

  這是發生在我身上的一個bug,困擾了我三天,已經讓我屢次懷疑人生。由於我這個工做是數據準備階段,後續還有一系列工做須要依賴我這些初始數據,壓力很大,感謝某人在這個時候給個人鼓勵,雖然只是寥寥幾句。這件事記起來僅爲往後提醒本身再也不犯相同的錯誤。工具

1、問題通過

  簡單來講,我作的是一個數據同步任務,將數據從es的一個type通過轉換和操做同步到另外一個type中,下面統一說A同步到B,並且這個同步是週期性執行的,下面經過一個流程圖:測試

  循環的部分的流程圖不標準,你們懂意思就能夠,程序其實很簡單,除了引用的工具類,我就用了一個類就完成了上面的操做,每個過程是一個方法,方法結束後也會打印相應日誌,並且測試網通過測試也是沒問題的(這句話是否是很熟悉,若是你常常這麼說,那就當心了),結果到了生產網就出事了,具體兩個奇怪現象:spa

  1. 首次同步的時候,B端少數據
  2. 再次同步的時候,B端有重複數據

  由於B端開始是沒數據的,因此出現上面兩個問題只多是我程序的問題。日誌

2、解決通過

  出現問題後,我直接蒙了,心想絕對不可能,而後一遍一遍的看程序,由於就一個類,因此看了好多遍,由於重複數據我是絕對認爲不可能的,因此個人關注點就放在了怎麼可能有重複,個人思路是兩邊所有查出來,以主機名加ip爲key,value爲自己,放到Map中。而後進行比較的。code

  1. 我把整個處理類從新寫了一遍,去掉了其中用到的lambda表達式,如今想一想有點好笑,我懷疑lambda表達式有bug。
  2. 我把全部處理路徑打印上日誌,數量也都打印出來。

  通過這樣後,依然沒有發現問題,數據無緣無故丟失,重複數據出現的莫名其妙,由於生產網不能隨意測試,因此每次出錯都很難過,而測試網又復現不了(測試網數據是僞造的),心都碎了,最後又從新看代碼,決定打印最詳細的日誌。主要是兩個地方:blog

  1. Map的put操做前,先containsKey一下,若是有,打印日誌說已有數據
  2. 以前打印數量日誌的,所有打印實際內容

  第二步,按我以前的風格,是絕對不會這麼作的,感受過低級,可是這麼實在是沒有辦法了,而後從新測試,仔細看日誌,發現一個異常現象,數據實際內容沒有看,太多了,異常的是出現大量的已有數據的日誌,這點引發個人注意,我覈實過數據源,我這邊提示重複的數據,在數據源處只有一個,而後我就去看個人工具類,查詢工具類,發現了問題,程序以下: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的工具類寫錯了,改了之後重試才能夠。開發

3、教訓總結

3.1 工具類的使用

  平時積累一些工具類,確實能夠大大減小通常開發的工做量,可是必定要通過嚴格的測試,否則基於對工具類的信任,不多會懷疑工具類會出錯。同步

3.2 數據處理

  對於數據處理,若是假定不會有相同數據,也要containsKey一些,由於每每會有意想不到的數據產出,這種狀況下出錯了還很差查詢。class

相關文章
相關標籤/搜索