java - 如何設(shè)計(jì)大型分布式系統(tǒng)報(bào)表?
問題描述
真是無語了,第二次提交又被拒絕了,理由是“該內(nèi)容屬于技術(shù)討論,建議就該問題,簡單地談一談你的想法思路,以便更好地和他人做一個技術(shù)交流“,要是第一次的是因?yàn)榕虐娴脑蛭乙舱J(rèn)了,想發(fā)個問答貼怎么就這么難呢?行吧,就按要求稍微表達(dá)一下吧,要是真的沒有思路難道也必須得胡編亂造嗎?相信網(wǎng)站團(tuán)隊(duì)的出發(fā)點(diǎn)是好的,但是對于新人來說,很可能會因此棄用。最后一次,再不過就不用這個論壇了,實(shí)在是提問好難。
以下是原文,最后將附上部分自己的思路。
初來乍到,第一次應(yīng)該是自己的排版太亂,導(dǎo)致審核沒有通過,后面還為此特地學(xué)些了markdown的語法。廢話不多說,進(jìn)入正文。
系統(tǒng)背景某大型上市國有企業(yè),在各個省市都有分公司,為了統(tǒng)一管理全國各地市分公司子公司業(yè)務(wù)過程及財(cái)務(wù)數(shù)據(jù),統(tǒng)一開發(fā)了一個管理平臺,再下發(fā)給各個省市根據(jù)實(shí)際需求進(jìn)行二次開發(fā),以取代各地市原有的分散的財(cái)務(wù)系統(tǒng)、業(yè)務(wù)管理系統(tǒng)等。
平臺介紹前臺用angularJs,bootstrap,html,后臺用springMVC,MyBatis,數(shù)據(jù)庫有Oracle有Mysql,rpc框架用dubbo,注冊中心用zookeeper,緩存用redis,系統(tǒng)整體架構(gòu)為分布式+集群。整個系統(tǒng)包含了以“項(xiàng)目管理”,“合同管理”,“采購管理”,“銷售管理”,“核算管理” 5個模塊為主的多個業(yè)務(wù)模塊。
現(xiàn)有需求基于現(xiàn)有業(yè)務(wù),做100+張報(bào)表。報(bào)表模塊將有獨(dú)立的數(shù)據(jù)庫及應(yīng)用。
技術(shù)難點(diǎn)如何建大表供所有報(bào)表使用?業(yè)務(wù)部分理清楚自然是最基本的,但是每個模塊之間通過接口來調(diào)用服務(wù)。
如何從分布式的數(shù)據(jù)庫抽取大數(shù)據(jù)量?每個模塊有各自的數(shù)據(jù)庫,部分使用oracle,部分mysql,數(shù)據(jù)量級別在千萬以上。
數(shù)據(jù)的同步方式又應(yīng)該怎樣比較合理?以什么技術(shù)實(shí)現(xiàn)? 增量同步的難度較大,從業(yè)務(wù)模塊沒有很好的方式能保證不遺漏增量數(shù)據(jù);若是全量數(shù)據(jù),每次數(shù)據(jù)的量又實(shí)在是太大了。另外報(bào)表展示的時(shí)候以及數(shù)據(jù)導(dǎo)出又如何能保證其性能?
第一次做這么大的項(xiàng)目,實(shí)在是有些摸不著頭腦。可能表達(dá)的不太清楚,有需要補(bǔ)充的地方歡迎留言。希望論壇里的各位前輩多多指教,不勝感激。
ps: markdown好多地方還不太明白,比如有序無序列表嵌套的時(shí)候?yàn)槭裁磳?shí)心的黑點(diǎn)變成空心的了?為什么無序列表換行只有當(dāng)前行有效,而當(dāng)前行有效的時(shí)候上面已經(jīng)換過行的又無效了?有點(diǎn)不懂,難道說不同的編輯器的語法還不一樣?還有怎么才能看到人家發(fā)布的帖子的markdown怎么寫的?能看到的話好歹也能學(xué)習(xí)一下.
個人設(shè)計(jì)思路分析所有報(bào)表的統(tǒng)計(jì)維度和共同字段,在報(bào)表模塊新建一個oracle用戶,將所有字段根據(jù)模塊分表,作為報(bào)表的基礎(chǔ)大表;
需要考慮數(shù)據(jù)的抽取方式,目前我能想到的方式有兩種:
通過各個模塊提供接口,取數(shù)后插入至報(bào)表模塊基礎(chǔ)大表;優(yōu)點(diǎn):抽取規(guī)則好維護(hù);缺點(diǎn):性能太差;
通過DBLink將oracle數(shù)據(jù)庫和Mysql數(shù)據(jù)庫打通,用存儲過程直接將數(shù)據(jù)插入至基礎(chǔ)大表。優(yōu)點(diǎn):性能提升;缺點(diǎn):規(guī)則由他人維護(hù)將變得很難。
數(shù)據(jù)每次全量同步。優(yōu)點(diǎn):邏輯簡單;缺點(diǎn):數(shù)據(jù)同步量太大,時(shí)間太久。
以上是個人的一些拙見,希望各位前輩多多指教。
問題解答
回答1:你說的需求基本算是建設(shè)數(shù)據(jù)倉庫,基本的思路是:
1、數(shù)據(jù)倉庫和業(yè)務(wù)系統(tǒng)的數(shù)據(jù)庫獨(dú)立,數(shù)據(jù)倉庫的建模一般要分層設(shè)計(jì),不是簡單的建成大表。普遍會分為緩沖層、基礎(chǔ)層、聚合層、報(bào)表層等,每層的側(cè)重點(diǎn)不太一樣,基礎(chǔ)層還是以范式模型為主,聚合層就要普遍要做數(shù)據(jù)冗余,報(bào)表層一般是列很多的寬表設(shè)計(jì)。
2、數(shù)據(jù)同步,在數(shù)據(jù)量大的情況下必須有增量機(jī)制,如果沒有需應(yīng)用系統(tǒng)改造。
3、同步方法有幾種思路:
a. 用dblink打通數(shù)據(jù)庫,人工寫存儲過程。b. 用informatic powercenter 或kettle類似的ETL工具c. 專用的數(shù)據(jù)庫層同步軟件,如oracle的ogg等
相關(guān)文章:
1. 使用uuid,并不能利用mysql的索引,有什么解決辦法?2. javascript - 微信小程序 wx.downloadFile下載文件大小有限制嗎3. mysql - phpmyadmin怎么分段導(dǎo)出數(shù)據(jù)啊?4. python - pyqt 如何保存窗口內(nèi)容,再次打開時(shí)顯示之前輸入的內(nèi)容5. mysql - spring data jpa 方法sql復(fù)雜查詢?6. mysql在控制臺下顯示亂碼,請假各位大神7. 使用MySQL的mysqlpump導(dǎo)出數(shù)據(jù)如何判斷是否導(dǎo)出完畢?8. mysql - 如何在有自增id的情況下,讓其他某些字段能不重復(fù)插入9. 現(xiàn)在我在學(xué)習(xí)MySQL,問問怎么復(fù)制粘貼數(shù)據(jù)庫.10. python怎么獲得二叉樹根到所有葉子的路徑?
