您的位置:首页技术文章
文章详情页

java - 如何设计大型分布式系统报表?

【字号: 日期:2022-06-11 11:19:11浏览:18作者:猪猪

问题描述

真是无语了,第二次提交又被拒绝了,理由是“该内容属于技术讨论,建议就该问题,简单地谈一谈你的想法思路,以便更好地和他人做一个技术交流“,要是第一次的是因为排版的原因我也认了,想发个问答贴怎么就这么难呢?行吧,就按要求稍微表达一下吧,要是真的没有思路难道也必须得胡编乱造吗?相信网站团队的出发点是好的,但是对于新人来说,很可能会因此弃用。最后一次,再不过就不用这个论坛了,实在是提问好难。

以下是原文,最后将附上部分自己的思路。

初来乍到,第一次应该是自己的排版太乱,导致审核没有通过,后面还为此特地学些了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等

相关文章: