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