eaby技术架构变迁

若是你对项目管理、系统架构有兴趣,请加微信订阅号“softjg”,加入这个PM、架构师的你们庭 java

 

最近在infoq上面看到 ebay介绍其系统架构变迁以及系统设计分享方面的讲座,其中陈述了ebay从1995年到2006年之间系统架构的变化过程。从这里,咱们能够学习到许多宝贵的经验来设计一个大容量,高并发,分布式的系统。 web

ebay的系统架构的变迁主要经历了4个阶段,下面一幅图展示了ebay系统架构变迁的时间表 数据库

在ebay的V1版本,ebay采用的是FREEBSD + APACHE + PERL +DGBM,这是一个比较原始的模型,并且相对比较简单,操做系统,应用服务器,web服务器 以及 数据库服务器都是在同一台机器中,网络结构在物理上只有一层。整个网站有四个域名,每一个域名对应不一样的应用,每组应用对应一台服务器。 编程

图表 1 ebayV1系统架构 缓存

随着业务量以及访问量的不断上升,ebay在1999年开始对架构进行升级,技术架构发生了较大的变化,这期间主要是从1999-2004年,而架构的版本号则从V2.0到V2.5 ,下面咱们来看看Ebay V2.0技术架构 服务器

  • V2.0微信

² 开始采用ORACLE服务器,数据库服务器和web服务器分开,数据库独立部署到一台新的机器上面 网络

² 程序逻辑上面已经开始分层,也就是咱们常说的mvc3层结构:显示层、业务逻辑层、数据访问层,而在物理上面仍是两层结构 web服务器 以及 数据库服务器 架构

² 编程语言采用C++,那个时候java刚兴起,估计也没有其余好的语言选择了。 并发

  • V2.1

² 每组应用对应多台服务器,而多台服务器组成一个 servler pool(服务池),经过一个负载均衡服务器来分别转发请求到不一样的服务器

² 数据库部署到性能更加好的服务器上面

  • V2.2

² 增长了一台数据库服务器做为 备份服务器,防止失败

  • V2.3

这个版本只是对每一个应用增长了更多的服务器,不断的进行server pool

  • V2.4

这个版本最大且最重要的改变就是对数据库进行垂直拆分,即把数据库按照不一样的功能模块进行划分,例如交易库,会员库,账务库

  • V2.5

这个版本在2.4的版本上面,对部分数据库进行读写分离,同时对Item(物品条目)数据库进行水平拆分,把Items按照不一样的Categoty分配到不一样的Categoty商品库里面,,这样大大的扩展了对Items数据库的访问性能。

图表 2 ebayV2系统架构

从上能够看出ebay V2的架构变迁,主要是经过服务器的添加,数据库的垂直拆分以及水平拆分,数据库的读写分离操做 来提升整个网站的性能。在web层,经过添加服务器来进行水平扩展,同时对应用服务功能进行垂直拆分,按照不一样的业务功能划分到不一样的系统。在数据库层面,进行了读写分离尝试,对数据库进行垂直拆分,同时把Items库按照Category进行水平拆分,这样作,分散了对产品库items的集中访问,不过须要在DAL层提供透明的访问机制,ebays这里貌似还并无这个成熟的框架,同时不知道 分布式事务ebay在这个阶段是如何实现的。

  • V3

整个应用程序开发平台所有替换为j2ee平台,用java改写了整个网站。看来是一次比较大的工做。目的是为模块解耦 以及模块复用,从这里,咱们能够看出java在开发复杂企业应用的优点。

V3版本在数据库层面上面作了更加优化的设计,ebay继续在数据库上面进行优化

垂直拆分数据库,按照 功能模块 拆分为更多的子库

水平拆分数据库,对同一类数据,按照key值的不一样数据分配到不一样的数据库中(具体水平分库的方式有多种,这里就再也不介绍了。)在进行水平拆分数据库的时候,ebay也必须创建一套透明的DAL访问方式,必须提供透明的数据库访问机制以及透明的数据库路由功能,数据库的物理结构变动不会影响到代码的逻辑变更。

在这里,ebay也在数据库层给出了最佳实践:

² 尽可能减小数据库CPU的消耗,例如不使用存储过程,只使用少许的触发器

² 减小数据库层面的逻辑功能,例如数据转化,组合,这些都放在逻辑层

² 减小动态SQL,主要是SQL中参数的动态生成功能,这一点,公司的DBA也在强调

² 尽量的缩短数据库的事务时间,尽量早的结束事物

² 尽量的采用异步更新数据库方式,分散数据库的压力,例如消耗数据库时间的操做要放在夜间处理。

² 不使用分布式事务,看来分布式事务的确不使用高并发性的系统

在应用逻辑层面,ebay把系统按照功能划分红许多不一样的模块,每一个模块做为一个子系统,同时经过水平扩展子系统服务器数量来提升整个系统的伸缩性。

下面看看ebay在应用层面给出的最佳实践

² 保持应用层子系统彻底是无状态的,能够水平进行无限扩展以提升伸缩性,经过负载均衡服务器均等分配到各个子系统的实例池里面。

² 尽量的使用缓存,缓存可以减小数据库的压力,使用空间来换时间

² 严格划分系统的各个层面,表现层,业务逻辑层,服务集成层,DAO层,基础设施层。

在应用层的设计上面,ebay经过不一样的功能划分了不少domain,每一个domain只负责本身的功能的业务逻辑,domain与domain之间是不会依赖的,同时还会提供common domain 提供各个 domain之间的交互以及依赖,见下图:

因为ebay的数据库按照逻辑划分了不少不一样的字库,那么ebay必须提供透明的访问数据库的能力,举个例子:ebay把Items按照categoray分红了不少sub items库,假如须要查询出来某一个用户所购买的全部Items,那么必需要查询全部的sub items库,把数据库组合出来,那么DAL层必须屏蔽数据库的物理结构,一次性的把全部的sub items库中对应的数据查询出来。而这个访问,对应用来讲是透明的。应用不须要关注到底items有多少个子库。

总结:在大规模,高并发系统的设计中,最经常使用的技术就是分层和缓存,把一个业务流程垂直分解成几个系统,每一个系统提供不一样类型的服务,一个业务流程经过不一样的服务组装起来,这就是SOA设计的思路吧。每一个系统能够进行水平集群,提供无状态的服务,能够水平无线扩展,数据库层面,主要就是用到垂直分库,水平分库,读写分离,热备份等技术,提升数据库的读写能力。在应用层能够考虑使用集中式缓存或者分布式缓存来减小数据库的访问压力。

若是你对项目管理、系统架构有兴趣,请加微信订阅号“softjg”,加入这个PM、架构师的你们庭

相关文章
相关标签/搜索