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. javascript - 引入 simditor,但是显示标签,这个怎么解决。2. android - 目前有哪些用Vue.js开发移动App的方案?3. 当前访问路由未定义或不匹配,怎么解决这个问题4. 只有一条数据5. mysql - 这条sql可以怎么优化,求帮助6. defined这个实验代码我这里不对哇7. javascript - 网易云信整合到项目的流程8. php mysql_query()问题9. linux - 为公司配置服务器,要求在上面装win7的虚拟机,那我还需要装桌面环境吗?10. python - supervisor启动程序报错,ERROR (spawn error),如何查看报错具体信息