你能够选择你的系统的性能吗?还是只能任由系统性能随着数据量的增长而下降?

 

数据库对于你来说,是不是仅仅做为一个可以存放和取出数据的地方?你是否相信,要尽量把数据放到数据库服务器以外进行处理,以节省数据库服务器的CPU使用从而节省license的费用?可是你知道其实你浪费了多少银子吗?!

RWP:

RWP是 Real-World Performance 的缩写,RWP 团队是Oracle总部数据库研发部门的一部分,团队旨在充分发挥软件和硬件的能力,在真实世界中实现系统的最佳性能。在Oracle公司,RWP团队是数据库性能优化领域公认的顶尖团队。 RWP团队不断颠覆传统观念,创造出了数据库性能诊断和优化的许多方法,涵盖架构设计到机器指令等诸多方面。


这次有幸邀请到RWP的独家专稿系列文章。此系列文章干货满满,共三期,此为第一期


你有没有怀疑过,为什么每个人都已经把自己手上的代码做到极致,可是系统的性能也就提高了百分之几几?如果大方向搞错,累死累活也出不了成绩,你懂的~~

大咖专栏 | 要分层架构,还是要省钱+耍帅?(一)_Java

在地球上,有一个叫做Real-World Performance的团队,是Oracle数据库研发团队的一部分。在这个团队里面,最行不通的就是“忽悠”,凡事必须讲证据。关于业界应用甚广的分层架构的性能,这帮人当然也是拿出了不少证据,挺有意思!要继续你的分层架构,还是要省钱+耍帅呢,先看看这帮人的证据吧。


分层架构概述


分层架构layered architecture)是业界应用最普遍的一种软件架构,也是大多数Java EE应用的标准架构,可谓人尽皆知。

 

这种架构将软件分成若干个水平层,每一层都有特定的角色和分工。四到五层的分层架构最常见,通常会包括:表现层业务层模型层持久层,和数据库层,如下图所示:

大咖专栏 | 要分层架构,还是要省钱+耍帅?(一)_Java_02

分层架构中,通常每一层都是封闭的,通过接口进行通信,如下图所示。封闭意味着一个请求只能一层一层向下走直到到达最底层,而不能越过其中的某些层。这样的层隔离带来的好处是,对一个组件的改动只影响到该组件所在的那一层,以及在某些情况下与其相关联的层。同时,从事一层工作的人,几乎不需要了解整体架构中其他层的具体情况。这使得应用程序的开发变得更容易分工。

大咖专栏 | 要分层架构,还是要省钱+耍帅?(一)_Java_03

我们可以看出,在这种分层架构中,所有的应用逻辑都是在数据库以外构建完成的。上层开发人员甚至都不需要写SQL。底层把GUI结构转换称结构化数据,通常会自动生成一行一行处理数据的那种SQL语句。数据库通常被当做是一个存放数据的地方,而不是处理数据的地方。

大咖专栏 | 要分层架构,还是要省钱+耍帅?(一)_Java_04


分层架构的性能分析


在此,我们用一个实际的系统来分析一下分层架构性能。这个系统是一个反偷税漏税系统。

 

在那个炎热的国度,每一笔交易的买卖双方都要给国家税务局上报增值税。就是说,如果A公司卖了一个东西给B公司,那么B公司当然是从A公司买了那个东西,那么A公司和B公司都必须对这笔交易上报增值税。之后买卖中的一方可以申请将增值税退回。所以买卖双方上报的数据应该匹配。税务局每天会收到两个文件,一个是所有买方上报的数据的文件,一个是所有卖方上报的数据的文件。

 

这个反偷税漏税系统的目的,是要检测出两种可能有问题的数据:

  • 重复数据(可能是误操作,也可能是故意重报以申请额外退税)

  • 不同步的数据(可能是一方报的慢,也可能是故意虚报以申请退税)

从而进一步分析是否是恶意的偷税漏税行为。

 

这个反偷税漏税系统的业务流程是:

 

1. 将每天的买卖双方的数据分别插入到PREMATCH_BUYPREMATCH_SELL表里面去,如下图所示:

大咖专栏 | 要分层架构,还是要省钱+耍帅?(一)_Java_05

2. PREMATCH_BUYPREMATCH_SELL表里面的能够匹配上的数据插入到MATCHED表里面,如下图所示:

大咖专栏 | 要分层架构,还是要省钱+耍帅?(一)_Java_06

3. 将匹配上的数据从PREMATCH_BUYPREMATCH_SELL表中删除,如下图所示:

大咖专栏 | 要分层架构,还是要省钱+耍帅?(一)_Java_07

4. 在对买卖双方的数据进行匹配之前,先要验证是否有重复数据,若有重复数据,将其放到DUPLICATE_BUYDUPLICATE_SELL中,如下图所示:大咖专栏 | 要分层架构,还是要省钱+耍帅?(一)_Java_08

也就是说,每天税务局收到的两个文件,经过反偷税漏税系统处理之后,重复数据会放在DUPLICATE_*表中,不同步的数据会放在PREMATCH_*表中,匹配上的数据会放到MATCHED表中。

 

技术角度总结一下,这个反偷税漏税系统做了以下的事情:

  • 5个表里面插入数据

  • 通过索引查找重复数据和能够匹配得上的数据

  • PREMATCH_*表里面删除数据

  • 索引维护

  • 一些去掉重复数据和匹配数据的逻辑处理(if-then-else)

 

那个炎热的国度的税务局已经有了匹配单条买卖记录的Web UI。那么让反偷税漏税系统具有匹配批量买卖记录的功能,一个很显而易见的实现方法就是,重用业务层,模型层和持久层的代码。

 

业界有很多多层架构的开发框架,下图列举了其中的一些。

大咖专栏 | 要分层架构,还是要省钱+耍帅?(一)_Java_09

我们在此就用OracleADF开发框架来实现这个反偷税漏税系统,分析一下多层架构的性能。如下图所示,因为已经有了业务层,模型层和持久层的代码去匹配一条买卖记录是否匹配,那么只要开发一些Java代码重复的调用这些代码,就能够完成匹配批量数据的功能。

接下来我们进行三组测试,对分层架构的不同配置情况以及非分层架构的性能进行分析比较。

大咖专栏 | 要分层架构,还是要省钱+耍帅?(一)_Java_10

由于篇幅原因,我们期待在下一期文章与您见面。