java - 如何設計大型分布式系統報表?
問題描述
真是無語了,第二次提交又被拒絕了,理由是“該內容屬于技術討論,建議就該問題,簡單地談一談你的想法思路,以便更好地和他人做一個技術交流“,要是第一次的是因為排版的原因我也認了,想發個問答貼怎么就這么難呢?行吧,就按要求稍微表達一下吧,要是真的沒有思路難道也必須得胡編亂造嗎?相信網站團隊的出發點是好的,但是對于新人來說,很可能會因此棄用。最后一次,再不過就不用這個論壇了,實在是提問好難。
以下是原文,最后將附上部分自己的思路。
初來乍到,第一次應該是自己的排版太亂,導致審核沒有通過,后面還為此特地學些了markdown的語法。廢話不多說,進入正文。
系統背景某大型上市國有企業,在各個省市都有分公司,為了統一管理全國各地市分公司子公司業務過程及財務數據,統一開發了一個管理平臺,再下發給各個省市根據實際需求進行二次開發,以取代各地市原有的分散的財務系統、業務管理系統等。
平臺介紹前臺用angularJs,bootstrap,html,后臺用springMVC,MyBatis,數據庫有Oracle有Mysql,rpc框架用dubbo,注冊中心用zookeeper,緩存用redis,系統整體架構為分布式+集群。整個系統包含了以“項目管理”,“合同管理”,“采購管理”,“銷售管理”,“核算管理” 5個模塊為主的多個業務模塊。
現有需求基于現有業務,做100+張報表。報表模塊將有獨立的數據庫及應用。
技術難點如何建大表供所有報表使用?業務部分理清楚自然是最基本的,但是每個模塊之間通過接口來調用服務。
如何從分布式的數據庫抽取大數據量?每個模塊有各自的數據庫,部分使用oracle,部分mysql,數據量級別在千萬以上。
數據的同步方式又應該怎樣比較合理?以什么技術實現? 增量同步的難度較大,從業務模塊沒有很好的方式能保證不遺漏增量數據;若是全量數據,每次數據的量又實在是太大了。另外報表展示的時候以及數據導出又如何能保證其性能?
第一次做這么大的項目,實在是有些摸不著頭腦。可能表達的不太清楚,有需要補充的地方歡迎留言。希望論壇里的各位前輩多多指教,不勝感激。
ps: markdown好多地方還不太明白,比如有序無序列表嵌套的時候為什么實心的黑點變成空心的了?為什么無序列表換行只有當前行有效,而當前行有效的時候上面已經換過行的又無效了?有點不懂,難道說不同的編輯器的語法還不一樣?還有怎么才能看到人家發布的帖子的markdown怎么寫的?能看到的話好歹也能學習一下.
個人設計思路分析所有報表的統計維度和共同字段,在報表模塊新建一個oracle用戶,將所有字段根據模塊分表,作為報表的基礎大表;
需要考慮數據的抽取方式,目前我能想到的方式有兩種:
通過各個模塊提供接口,取數后插入至報表模塊基礎大表;優點:抽取規則好維護;缺點:性能太差;
通過DBLink將oracle數據庫和Mysql數據庫打通,用存儲過程直接將數據插入至基礎大表。優點:性能提升;缺點:規則由他人維護將變得很難。
數據每次全量同步。優點:邏輯簡單;缺點:數據同步量太大,時間太久。
以上是個人的一些拙見,希望各位前輩多多指教。
問題解答
回答1:你說的需求基本算是建設數據倉庫,基本的思路是:
1、數據倉庫和業務系統的數據庫獨立,數據倉庫的建模一般要分層設計,不是簡單的建成大表。普遍會分為緩沖層、基礎層、聚合層、報表層等,每層的側重點不太一樣,基礎層還是以范式模型為主,聚合層就要普遍要做數據冗余,報表層一般是列很多的寬表設計。
2、數據同步,在數據量大的情況下必須有增量機制,如果沒有需應用系統改造。
3、同步方法有幾種思路:
a. 用dblink打通數據庫,人工寫存儲過程。b. 用informatic powercenter 或kettle類似的ETL工具c. 專用的數據庫層同步軟件,如oracle的ogg等
相關文章:
1. vim里的高亮javascript的javascript.vim 已經放到syntax里了,但是不行。2. angular.js - ng-file-upload 如何實現多圖片上傳3. android - xml的drawable作背景,是否會產生錯誤4. python - pip install出現下面圖中的報錯 什么原因?5. 我何時應該在Java中使用JFrame.add(component)和JFrame.getContentPane()。add(component)6. angular.js - angularJs ngRoute怎么在路由傳遞空字符串及用ng-switch取得7. 輸入地址報以下截圖錯誤,怎么辦?8. node.js - node中MYSQL的異步問題9. javascript - 求助一個關于indexedDB的問題10. javascript - ie11以下單擊打開不了file,雙擊可以。求解?
