快遞質量監控實時統計方案設計

目錄

 

數據流程圖和關係

數據流程圖

 數據流程關係   

需求描述

框架和版本

方案一

說明

問題

方案二

說明

數據同步問題

es 查詢問題

方案三

說明

es 查詢問題

方案四(選擇方案)

說明

es 查詢問題 


  • 數據流程圖和關係

 

  • 數據流程圖

  •  數據流程關係   

  •  一對一:  收 ,收件入庫,派,問題件,留倉件,簽收 ; 發  到 
  •  一對多(多對一):   收(收件入庫,派,問題件,留倉件,簽收 )  和  發 (到) 

  • 需求描述

  • 實時統計 每個網點,每天 發件未到件,發件未簽收的快遞單數(一對一,多對一)
  • 實時統計  每個網點,每天 收件 未發件的快遞單數,收件未到件的快遞單數(一對多,一對一)

     需求中設計到的字段說明(網點: scanNetworkCode : 快遞單號:waybillId )


  • 框架和版本

  • es-6.8 :    存儲,聚合數據
  • flink-1.8 : 從mysql 和 mongo 中同步數據到es  

  • 方案一

  • 說明

  • 每種數據存儲到不同的索引,後一步數據更新前一步的數據
  • 問題

  • 數據同步過程,代碼強綁定,拓展性弱
  • 簽收數據和 發件/到件 的唯一鍵不一致,無法更新

      


  • 方案二

  • 說明

  • 所有數據存在同一個索引,以waybillId 作爲唯一鍵關聯每一條數據,以 Arrary 數據類型存儲 發/到 

      Array 官網學習資料: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/array.html 

  • 數據同步問題

  • 收/發 有多個,upsert只能覆蓋更新,怎麼新增並去重的更新 對應數組

      方案1: 先查詢,然後把查詢結果和新數據合併成新的數組再插入   

      問題:查詢過程需要網絡請求和返回,比較耗時,沒有查詢過程,flink TPS可以達到 2w,反之則只有1000 TPS 左右

      方案2: painless 腳本更新 

SendBean bean = (SendBean) objData;
Map<String, Object> map = new HashMap();
map.put("send", bean.toJSONObject());
map.put("scanNetworkCode", bean.getScanNetworkCode());
String scriptStr = "if (ctx._source.send == null) {ctx._source.send= []} def isCon=0;for(def i=0;i<ctx._source.send.length;i++){if(ctx._source.send[i].scanNetworkCode==params.scanNetworkCode){isCon=1}}if(isCon==0){ctx._source.send.add(params.send)}";
Script inline = new Script(ScriptType.INLINE, "painless", scriptStr, map);
updateRequest.script(inline) ;
indexer.add(updateRequest);

  painless 官網學習資料:https://www.elastic.co/guide/en/elasticsearch/painless/6.8/painless-contexts.html

   

  • es 查詢問題

  • 形成的索引信息

  •  問題1: 過濾的時候,擴大了數據範圍
  •  問題2:聚合的時候 ,擴大了數據聚合範圍  

    es Arrary和nested的區別:  https://blog.csdn.net/laoyang360/article/details/82950393


方案三

  • 說明

  •  所有數據存在同一個索引,以waybillId 作爲唯一鍵關聯每一條數據,以 nested  數據類型存儲 發/到 

   nested  官網學習資料: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/nested.html

  • es 查詢問題

  • 形成的索引信息

 問題1: 過濾的時候,擴大了數據範圍   (可以解決)

 問題2: 聚合的時候 ,擴大了數據聚合範圍  (不能解決)


方案四(選擇方案)

  • 說明

  •  所有數據存在同一個索引;
  •  以waybillId 作爲唯一鍵關聯   收 ,收件入庫,首發,派,問題件,留倉件,簽收 ;  (parent)
  •  以 waybillId+scanNetworkCode 作爲唯一索引,關聯發,到 ;  (child)
  •  以 join 數據格式 關聯 parent ,child

 join 官網學習資料: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/parent-join.html

  • es 查詢問題 

  • 生成的索引

  • has_parent   查詢符合某些條件的父類的 子類 ,has_child   查詢符合某些條件的子類的父類,怎麼能查詢出查詢符合某些條件的子類的父類和子類
GET mongo_qc_dev/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "has_child": {
            "type": "send",
            "query": {
              "match_all": {}
            }
          }
        },
        {
          "match_all": {}
        }
      ]
    }
  },
  "from": 0,
  "size": 1000
}
  • 效率問題:  es join 數據類型,has_parent 先查詢符合條件的子類,根據子類裏面的關係數據(父類和父類ID)再查找父類數據, 一次獨立查詢 <  效率 <  2次獨立查詢,雖然慢一點,但是比兩次獨立查詢快,所以不是性能瓶頸問題 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章