數據統計系統設計(中小型)


   近一年多沒在博客園寫東西了,從換公司后就一直努力學習公司的框架和業務。而今接手一個電商數據統計項目,在博客園搜索統計項目解決方案卻一無所獲,最終自己設計並在開發的過程中持續更新,希望可以和大家一起交流。

需求

   項目組的電商系統運行了3年多,每天下單量在2w單左右。

  1.要求從商戶,客戶,商品的角度統計每天,每月,任意天數查詢的需求。

  2.並對部分敏感數據做實時查詢,例如下單數,下單金額之類的指標。

  3.對客戶,商品交易額交易量指標做top並支持導出。

  4.按地域統計各個交易指標並做top。

  5.不能在原有的系統上做集成,防止影響主業務。

 

設計思路

     服務器采用windows2012 IIS7.5 .netfromwork4.0 數據庫是部分sqlserver和部分mysql 基於目前系統的狀況和需求,決定采用觸發式預統計方式來完成部分重要功能。

何為觸發式? 目前多個系統之間通信有消息中間件來處理業務。例如 下單,下單時創建訂單后就直接往消息系統中注冊一條創建訂單任務,任務系統會分發給對應執行者去執行下單相關的后續任務。

 

根據消息系統的特性,在不摻和主系統的情況下利用下單,支付,等業務觸發,完成數據的收集,處理,這就是觸發式。

非實時部分

     關於預統計呢,其實只要是統計,都繞不過這個方法。數據少的時候我們統計一般采用全表查詢,count,groupby等形式來得出結果。但大多數情況下,會重復獲取大量數據,每次都統計一遍,不但耗時,而且在數據庫性能,數據傳輸,超時等問題上都是不能容忍的。

因此我們會總結,將可以增量統計的部分采取一點一滴的疊加,每天統計增量數據,將合理的數據結構存儲起來(半成品),下次統計或者查詢的時候直接查半成品,不僅數據量少,而且不用遍歷原來的表。特別是電商系統,每天增量數據大,多會采用分庫分表的方式來提高數據庫性能和訪問速度,但是卻給統計造成了困擾。

實時部分

    對於部分實時性要求高的指標,就需要我們達到流式計算的要求了。一樣采用觸發式的任務,在任務中維護一個全局的內存變量,不同商家也可以區分開,另外由於數據實時性和內存大小考慮,需要一個定時推送redis,一個定時定量去移除存儲到數據庫。

關於定時定量,是指內存中累積到一定個數比如客戶交易商品累計到100或者離上次存儲已經過去1分鍾,這個時候就會觸發存儲規則。推送也一樣,說是實時,但是不可能有變化就推送到redis,那這樣用redis就沒有意義。按我的想法是每個有交易的商家每分鍾推一次,下單任務觸發后根據上次推送時間來決定,如果沒有交易當然就不推送。

庫表設計

統計項目的庫表我采用的是查從庫,從庫擁有和主庫一樣的表結構,並且只讀不寫。在分表原則上 將表設計為待統計表,預統計表,按月統計表 按月存儲表 並根據數據量分表,讓每個表中預期數據不超過1千萬,我將部分數據量大的表分為128張,少量的分為16張

極限情況下可以分庫,來提升連接數。

流程設計

 

在提升系統性能和響應速度方面,會采用長緩存+短緩存的方式。例如 不變通用的數據采用長緩存(2-24小時),實時要求敏感數據(1-5分鍾)

對於部分慢的地方還可以采用首頁緩存,默認參數緩存等方式來提高頁面打開速度。

 

消息系統架構

      觸發式統計是建立在消息中間件的基礎之上的,因此將它的架構和設計思路貼出來,供大家參考和借鑒。消息系統的存在主要有幾點好處,1.解耦系統之間的依賴 2.異步執行耗時任務 3.具有可靠的日志和重試機制 4.可分布式部署橫向擴展

 

 

統計任務中心

      觸發式統計的核心有兩個,一是消息系統 二是統計任務中心。它的職責主要是收集交易數據,管理預統計結果並推送(redis和數據庫)。已下列支付為例,它在全局中單例,並負責收集數據,管理(統計,存儲,推送)

 

 總結

 這一次,我將統計項目的大體結構和設計思路分享了出來,目前項目還未正式開始 ,后期可能會做調整,改掉不合理的設計。我打算將統計項目作為一個系列,在實現的途中分享,也希望有人能獲益,有人能給予指點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM