最近有幸,在学校的图书馆借到了子柳先生的《淘宝技术这十年》,拜读一番,感慨万分。将书中内容加上自己的想法与诸君分享,毕竟未经人事看法粗浅,希望能得到园子里前辈们的指点~
一、淘宝的核心技术(国内乃至国际的Top,这还是2011年的数据)
二、淘宝网的诞生
马总在2003年4月7日秘密叫来阿里巴巴的十位员工,来到杭州一个隐秘的毛坯房,要求他们在一个月左右的时间内做出一个C2C网站。
结果当然还是直接买的快,一个基于LAMP架构的网站,原名是PHPAuction,老美开发的一个拍卖网站。当然必须要做修改才能用。(作为一个曾经用老美开发的前端页面开发自己博客的同学,确实感觉用别人写的比较方便偷懒-_-,不过我确信虚竹、三丰、多隆等前辈是有足够实力开发自己网站的——还是马总催的紧)
当时财大气粗的eBay正在中国耀武扬威,加上SARS肆虐,可能大家对网购产生了新的认识。而淘宝刻意保持低调,甚至连阿里的员工都不知道这是他们自己公司的产品。
淘宝的员工积极回答着用户的问题,早起贪黑,锻炼身体的方法就是倒立。
淘宝的功能也在不断的完善着,发布、管理、搜索、详情、购买等等,服务器也变成了三台。因为数据量大了,淘宝的搜索很慢(使用LIKE匹配...),多隆前辈把阿里巴巴的搜索引擎iSearch搬了过来。
当时MySQL的默认存储引擎MyISAM会导致读写锁等待时间过长等等大量问题,所以意外还是很多的。
2003年底,淘宝注册用户23万,PV 31万/day,半年成交额3371万。
三、淘宝的更新
很显然MySQL无法撑得起如此大的访问量,数据库瓶颈出现了。幸好阿里的DBA队伍足够强大,他们使用Oracle替代了MySQL。
Oracle那时就已经有了强大的并发性访问设计——连接池,从连接池取连接的耗费比单独建立连接少很多。但是PHP当时并没有官方提供支持语言连接池特性,于是多隆前辈用Google(不会是Baidu)搜到了一个开源的SQL Relay,于是数据库软件方面的瓶颈暂时解决了。
但是硬件容量不够了,阿里买了NAS(后来因为延迟严重原因买了EMC的SAN低端存储),加上Oracle高性能RAC,硬件容量也暂时没问题了。
开源的东西固然好,但是大胆使用也是一次尝试的过程,SQL Relay会频繁的导致死锁问题,导致工程师不得不定期进行重启服务,从书中的描述可以看出,淘宝的工程师们真的非常辛苦。
淘宝网不会止步于仅仅为卖家和买家提供一个交易的网站而已,还需要建立一个完善的第三方体系,来保证卖家和买家之间的交易是安全的,于是支付宝诞生了。比较麻烦的是,当时虽有很多银行开放了网银接口,但是甚至不能保证付钱后就会扣款成功,还是需要工程师们辛苦的一板一眼去对账......
淘宝为了便于用户的交流,开发了一个IM软件——旺旺,不仅给买卖双方使用,阿里内部也使用旺旺交流。
四、第一个里程碑
因为SQL Relay的问题实在过于严重,2004年于是淘宝终于做出了跨时代的决策——使用Java重写网站(鼓掌~~~)。
没错,淘宝请了Sun的高级工程师来帮忙做Java架构。那么他们是如何做到修改编程语言而不改变网站使用呢——模块化替换,今天写好了A模块,另开一个新域名,将连接指向该模块,同时别的模块不变,等到全部模块完成的时候,原域名放弃。
使用的框架:淘宝的架构师在Jakarta Turbine的基础上开发了自己的MVC框架——WebX。而Sun公司坚持使用EJB作为控制层(估计当时只有他们才能玩贯EJB),加上使用iBatis作为持久层,一个可扩展且高效的Java EE应用诞生了。BYW,支付宝也是Sun的工程师用同样的架构设计的。
送走Sun的大牛们之后,阿里的数据存储又遇到了瓶颈,于是忍痛买了一台IBM小型机(我猜至少是百万级别的.......),也就有了IOE(IBM + Oracle + EMC)这样的传说。
2004年底,淘宝注册用户400万,PV 4000万/day,全网成交额10个亿。
五、再接再厉
Oracle也有处理上限,当数量的级别是“亿”的时候,就不是一个Oracle服务器支撑的起的了。DBA们把数据分到了两个数据库中,通过ID的第一位决定查询哪一个数据。比如,‘0’至‘7’放在A数据库,‘8’至‘f’放在B数据库,通用信息放在C数据库。但是如何既查询'3'开头又查询'e'开头的数据呢?一个数据库路由框架DBRoute由架构师行癫编写,统一处理合并问题而对上层透明。
Spring诞生了,早闻Spring框架在Web应用不可或缺,而在淘宝网,Spring也达到了Rod Johnson设计它的目的——替代EJB。
2005年底,淘宝注册用户1390万,PV 8931万/day,商品数目1663万个。
说实话我真的好佩服,这么大的访问量都能如此坚挺,但是,考虑到未来的发展,这样的设施架构只是勉强可以应付现在的要求。于是,CDN技术派上用场了,一开始使用商用的ChinaCache,后来使用章文嵩博士搭建低耗能CDN网络,淘宝网的性能越来越好了。
2006年底,淘宝注册用户3000万,PV 15000万/day,商品数目5000万,全网成交额169亿元。
六、创造技术
为了考虑交易的公平性,淘宝增加了交易快照功能,将当前交易网页以图片的形式保存下来,淘宝的交易量如此之大,带来了一个问题——碎片图片过多,2010年,淘宝网的后端上保存着286亿张图片。
淘宝在2007年之前,使用NetApp的商用存储系统,但是仍然不够应付迅速增长的趋势。同年Google公布了GFS的设计思想,参照它的思想,淘宝也开发了自己的文件系统——TFS。至于这个文件系统的具体原理书上给的并不详细(应该是我看不懂-_-),不过可以大概可以了解是专门为大量的图片设计的,从每个用户1张图片到TFS上线后5张再到1GB的图片空间,这些都得益于TFS集群的文件存储系统以及大量的图片服务器。淘宝使用实时生成缩率图,全局负载均衡以及一级和二级缓存来保证图片的访问优化与高效访问。
淘宝的服务器软件使用Tengine,一个被优化过的nginx模块。
淘宝也做过失败的产品,不是因为技术原因而是市场原因。首先是“团购”,失败在于人心叵测。再次是“我的淘宝”,使用了风靡全球的AJAX的技术,但是做的过于AJAX了,可能是太不容易上手了(马总亲口说的),还有“招财进宝”(被竞争对手认为是破坏了“免费”的承诺而大肆宣扬)。
记录商品的访问量,使用传统的数据库I/O实在过于影响效率,所以淘宝使用了缓冲的技术,先是使用ESI(Edge Side Includes),解决了片段缓冲问题。因为有些大店铺访问量过大,频繁的I/O实在得不偿失,于是多隆前辈写出了TBstore,可以缓存大量的数据,核心思想是使用Hash算法快速寻找。其核心是基于Berkeley DB,一种类内存数据库,导致的问题是内存数据量大了还是会刷到磁盘中,因此性能并不是那么的好。
后来,淘宝分离出了UIC(User Information Center),供所有模块调用。多隆前辈再次为其编写出了TDBM,完全是基于内存的数据缓存(参考了memcached)。再然后,淘宝将TBstore和TDBM合并,写出了Tair,一个基于Key-Value的分布式缓存数据系统。然后升级了自己的iSearch系统。
2007年底,淘宝注册用户5000万,PV 25000万/day,商品数目1个亿,全网成交额433亿元。
七、更多的技术
一个电子商务平台不可缺少的细节——商品类目的处理。因为商品的类目实在过于庞大,因此如何根据类目划分商品成为了难题。机智的一灯前辈说,这些属性可以当做标签,直接“贴”在商品上(应该是这样的吧)。
2008年,淘宝将支付宝单独分离出来。其中交易的底层业务叫交易中心TC(Trade Center),涉及订单之类的原子操作。交易的上层业务叫做交易管理TM(Trade Manager),不涉及对物流的操作。
于是,应运而生的,第二个堪称里程碑的项目——系统拆分 诞生了。这个正是我们在阿里圆桌会议上HR所说一位元老级员工做的——“给一架高速飞行的飞机换发动机”这么惊险的重构任务。这些组件分割难度非常之大,以至于那张复杂的逻辑图我实在看不懂......总之,淘宝中间件诞生了。
HSF(高性能服务框架):核心,外号好舒服。请参见作者的博文http://www.blogjava.net/BlueDavy/archive/2008/01/24/177533.html
Notify(消息中间件):淘宝自主开发的消息队列产品。支撑了10亿+的消息通知。
TDDL(分布式数据访问层):优化了DBRoute,在JDBC和DB之间隔了一层,负责数据库的优化工作。
Tbsession:因为Session保存在服务器中,但是用户可能会被动的频繁的切换服务器,淘宝的设计思路是将Session信息保存在Cookie中,最后使用Tair来保存。
阿里的开放平台也相当有历史,有兴趣的可以参观参观http://open.taobao.com/index.htm
八、总结
当你处于业界中流时,你可以向老大学习,等当你成为业界老大之后,你就需要不断超越自己,用自己的力量来改变整个行业,乃至整个世界。无论是华为,还是阿里,当成为业内的Top时,责任反而更加重大。
一直觉得自己想着随大流,但是却又心有不甘。如今有机会能进入全中国最好的互联网网站,一直为自己这些年的付出感到荣幸,同时不断勉励自己,你需要变得更强才能融入这个集体。
任重而道远,纵望阿里淘宝这些年的发展之路,那些默默无闻却勇于探索钻研的人是最可爱的,遇到问题永远不服输,总会有办法去解决的。正如阿里圆桌会议HR所说的“在座的各位都是爱折腾的人”,我承认自己受之有愧,自己的身体一直不能保证毫无顾忌的拼斗,自己虽然每天坚持都去跑步,底子还是不行,想要成为一名武林中人,更漫长的路需要我坚持的走下去,意志力,我可以有。
坚持学习,钻研学习,实践学习。希望自己能坚持这三点信条。
相当佩服马总的思想理念和为人处事,也相当佩服那么多实力不凡而又忠心耿耿的部下,他们对得起他们的身价。
子柳兄的《淘宝技术这十年》到此总结完毕,我相信淘宝的光辉路程的还有很长,我的学问之路,也必将一直走下去。