参考:https://baijiahao.baidu.com/s?id=1582105537948510772&wfr=spider&for=pc
<https://baijiahao.baidu.com/s?id=1582105537948510772&wfr=spider&for=pc>

           
https://baijiahao.baidu.com/s?id=1582194900446787837&wfr=spider&for=pc
<https://baijiahao.baidu.com/s?id=1582194900446787837&wfr=spider&for=pc>

淘宝1.0架构

第一个阶段:LAMP+数据库读写分离

采用经典的LAMP架构,mySQL采用M-S模式,实现了读写分离,如下图所示:





LAMP架构的优点在于:无需编译,发布快速,PHP能做从页面渲染到数据访问所有的事情,且开源,免费。

LAMP架构比较适合早期创业公司在产品和商业模式的验证阶段,可以快速实现产品原型,快速部署,比较高效。


注:大部分情况下,第一阶段可以先将应用端的压力(大量的图片、数据访问等)转移到多态服务器,或者转移到CDN以及缓存上面,来降低数据库端的压力, 过了这个阶段后,再考虑读写分离会好很多。

 

淘宝2.0架构

第二阶段,把mysql替换为oracle,为了使用oracle的连接池,php采用代理连接 sqlreplay

1.0问题:PHP + Apache ,每一个请求都会对产生一个数据库连接,没有连接池这种功能(Java 语言有 Servlet
容器,可以存放连接池),造成的数据库端的瓶颈特别明显。

方案:
Oracle容量大、稳定、安全、性能高、并发能力强,归功于一个关键性设计——连接池,且存放的是长连接,任何一个请求只需要从连接池中取得一个链接即可,用完后释放,不需要频繁的创建和断开连接。

2003年底,把mysql换成了oracle,数据库连接端使用一个开源的连接池代理服务SQL Relay。如下图所示:



淘宝3.0架构

第三阶段,把php替换为java,业务代码重写,采用多层结构,全部替换为java体系,加入缓存、搜索、分布式存储。

2.0问题:手动sqlrelay代理服务经常会死锁;数据库端的压力还是比较大。

方案:

参考电信运营商、银行等的一些企业解决方案,LAMP架构改造为Oracle+IBM小型机的数据库架构和EMC存储方式,并使用了非常多的Java开源产品;

采用自己开发的ISearch搜索引擎(集群)来取代在Oracle数据库中进行搜索,降低数据库服务器的压力。

以下为3.1架构体系,可以看到,该版本已经基本转换成了java语言,且对服务进行了分层。



后续又主要做了如下调整,出了3.2版本:

Oracle数据库分库,商品信息和用户信息分库存放,由数据库路由的框架DBRoute统一处理数据的合并、排序、分页等操作;

控制层用Spring框架替换EJB;

研发基于Berkeley DB的缓存系统,把很多不太变动的只读信息放了进去;

加入CDN内容分发网络。

3.2版本架构图如下所示:



淘宝4.0架构

3.0问题:难以支撑高速业务发展难以支撑系统可伸缩性数据库连接达到上限 (每个Oracle数据库大约提供5000个链接)

方案:

将系统进行了拆分,按照用户域、商品域、交易域、店铺域等业务领域进行拆分,建立了20多个业务中心,如商品中心、用户中心、交易中心等,拆分的好处有以下几点:

1.每个系统可以单独部署,业务简单,方便扩容;

2.有大量可重用的模块以便于开发新的业务;

3.能够做到专人专事,让技术人员更加专注于某一个领域;

 

HSF框架,保证底层的系统具有超大规模的容量和非常高的可用性,保证上传服务的正常调用

对于大量的异步调用的场景,使用Notify异步消息通知件

TBSession解决多平台的单点登录问题

TFS,以及缓存Tari等,解决了大量图片的存储问题

TDDL,解决分库分表需要涉及到对应的SQL路由规则主库备库等问题

 

后记


从2010年开始,淘宝网重点着眼于统一架构体系,从整体系统层面考虑开发效率、运维标准化、高性能、高可扩展性、高可用、低成本方面的要求,底层的基础架构统一采用了阿里云计算平台,使用了SLB、ECS、RDS、OSS、ONS、CDN等阿里云计算服务,并通过阿里云服务提供的高可用特性,实现双机房容灾和异地机房单元化部署,为淘宝业务提供稳定、高效和易于维护的基础架构支撑。