淘宝技术这十年(txt+pdf+epub+mobi电子书下载)


发布时间:2021-04-19 23:42:17

点击下载

作者:子柳

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

淘宝技术这十年

淘宝技术这十年试读:

引言:光棍节的狂欢

淘宝网不就是一个网站吗?是的,但淘宝网不是一个简单的网站,它的规模排在全球前十几名,顶尖的网站需要顶尖的技术作为支撑。在用户享受淘宝的乐趣的背后,有哪些神秘的技术在支撑它呢?“时间到,开抢!”坐在电脑前早已等待多时的小美一看时间已到2011年11月11日零时,便迫不及待地投身于淘宝商城一年一度的大型网购促销活动——“淘宝双11购物狂欢节”。小美打开早已收藏好的宝贝——某品牌的雪地靴,飞快的点击购买、付款,一回头发现3000双靴子已被抢购一空。

小美跳起来,大叫一声“欧耶!”

小美不知道,就在11日零点过后的这一分钟里,全国有342万人和她一起涌入淘宝商城。当然,她更不知道,此时此刻,在淘宝杭州的一间办公室里,灯火通明,这里是“战时指挥部”,淘宝技术部的一群工程师正紧盯着网站的流量和交易数据。白板上是他们刚刚下的赌注,赌谁能最准确地猜中流量峰值和全天的交易总额。他们的手边放着充足的食物和各类提神的饮料。

一阵急促的电话铃声响起,是前线部门询问数据的,工程师大声报着:“第1分钟,进入淘宝商城的会员有342万人”。过了一会儿,工程师主动拿起电话:“交易额超过1亿元人民币了,现在是第8分钟。”接下来,“第21分钟,刚突破2亿元”,“第32分钟,3亿元了”,“第1个小时,4.39亿元”。这些数据随后出现在微博上,引起了一片惊呼。“完蛋了!”突然有人大喝一声,所有的眼睛都紧张地盯着他,只见他挠挠头,嘿嘿地笑道“我赌得少了,20亿元轻松就能过了,我再加5亿元。”他跑到白板边上把自己的赌注擦去,写上25,接下来有人写上28,有人写上30,有人到微博上开下盘口,同事们纷纷转载下注。接下来的这24个小时,战时指挥部的工程师们都不能休息,他们盯着网站的各种监控指标,适时调整机器,增减功能。顶住第一波高峰之后,这些人开始忙里偷闲地给自己买东西,大家互相交流着哪家买的移动硬盘靠谱,哪家衣服适合自己的女朋友,不时有人哀嚎宝贝被人抢了、信用卡额度不够了。同时,旁边白板上的赌注越下越大。

11月11日,这个棍子最多的日子被网民自我调侃地变成了一个节日——“光棍节”,而淘宝网又用疯狂的折扣促销给它赋予了另外一个意义——“购物狂欢节”。2011年11月11日这一天,淘宝商城与淘宝网交易额之和突破52亿元人民币,这个数字是“购物天堂”香港一天零售总额8.5亿元的6倍。

网民感受到的是疯抢的喜悦,而网站的技术人员感受到的却是“压力山大”。就如同你家办酒席,宴请左邻右舍,这个办起来容易,倘若宴请十里八乡所有的人,吃饭的人固然开心,但却不是一般人家能够办得起来的。能办得起来如此盛宴者,需要强大的财力和物力、组织能力、技术实力(例如做这么多菜,你的炒锅一定要是“分布式的”、“可复制的”、“可扩展的”,洗菜和切菜要有“工作流引擎”,跑堂的要计算一下最优路径,甚至连厨房的下水道都要重新设计)。

淘宝能够举办如此盛宴,网站的技术实力可见一斑。至2011年年底,淘宝网拥有全国最大的Hadoop分布式计算集群之一(2000多个节点,CPU:24000 core,Memory:48000GB,Disk:24000块),日新增数据50TB,有40PB海量数据存储,分布在全国各地80多个节点的CDN网络,支撑的流量超过800Gbps。淘宝的搜索引擎能够对数十亿的商品数据进行实时搜索,另外,还拥有自主研发的文件存储系统和缓存系统,以及Java中间件和消息中间件系统,这一切组成了一个庞大的电子商务操作系统。从商业数据上看,Amazon的财报显示2011年完成了大约480亿美元的交易额,eBay的2011年财报显示全年完成了大约600亿美元的交易额(不包括其独立的汽车交易平台)。无论从交易额、商品数量还是从同比增速等指标上看,淘宝网均远超于此,是目前全球最大的电子商务平台。(由于淘宝是非上市公司,未公布2011年的业绩,以上内容来自淘宝网技术副总裁@_行癫的微博)。

以上这些技术数据可能已经让一些人产生了不适的感觉,为了让更多的人读懂这本书,我们用下面这段文字描述一下小美访问淘宝网的时候,从技术的角度来看,网站上发生了什么样的事情。

参考资料来自《你刚才在淘宝上买了一件东西》(来自阿里员工卡特)

你发现快要过年了,于是想给你的女朋友买一件毛衣,你打开了www.taobao.com,这时你的浏览器首先查询DNS服务器,将www.taobao.com转换成IP地址。不过你首先会发现,在不同的地区或者不同的网络(电信、联通、移动)下,转换后的IP地址很可能是不一样的,这首先涉及负载均衡的第一步,通过DNS解析域名时,将你的访问分配到不同的入口,同时尽可能保证你所访问的入口是所有入口中可能较快的一个(这和后文的CDN不一样)。

你通过这个入口成功地访问了www.taobao.com实际的入口IP地址,这时产生了一个PV(Page View,页面访问量。每日每个网站的总PV量是形容一个网站规模的重要指标。淘宝网全网在平日(非促销期间)的PV大概是16~25亿个之间)。同时作为一个独立的用户,你这次访问淘宝网的所有页面均算作一个UV(Unique Visitor,用户访问)。最近臭名昭著的12306.cn的日PV量最高峰在10亿个左右,而UV量却远小于淘宝网十余倍,这其中的原因相信大家都知道。

因为同一时刻访问www.taobao.com的人数过于巨大,所以,即便是生成淘宝首页页面的服务器,也不可能仅有一台,仅用于生成www.taobao.com首页的服务器就可能有成百上千台,那么你的一次访问时生成页面给你看的任务便会被分配给其中一台服务器完成。这个过程要保证公正、公平、平均(即这成百上千台服务器每台负担的用户数要差不多),这一很复杂的过程由几个系统配合完成,其中最关键的便是LVS(Linux Virtual Server,世界上最流行的负载均衡系统之一,是由目前在淘宝网供职的章文嵩博士开发的)。

经过一系列复杂的逻辑运算和数据处理,这次用于给你看的淘宝网首页的HTML内容便成功生成了。对Web前端稍微有点常识的人都应该知道,浏览器下一步会加载页面中用到的CSS、JS (JavaScript)、图片等样式、脚本和资源文件。但是可能相对较少的人才会知道,你的浏览器在同一个域名下并发加载的资源数量是有限的,例如IE 6和IE 7是两个,IE 8是6个,chrome各版本不大一样,一般是4~6个。我刚刚看了一下,我访问淘宝网首页需要加载126个资源,那么如此小的并发连接数自然会加载很久。所以前端开发人员往往会将上述这些资源文件分布在多个域名下,变相地绕过浏览器的这个限制,同时也为下文的CDN工作做准备。

据不可靠消息称,在2011年“双十一”当天高峰,淘宝的访问流量最巅峰达到871GB/s,这个数字意味着需要178万个4MB/s的家庭宽带才能负担得起,也完全有能力拖垮一个中小城市的全部互联网带宽。显然,这些访问流量不可能集中在一起,并且大家都知道,不同地区、不同网络(电信、联通等)之间互访会非常缓慢,但是你却很少发现淘宝网访问缓慢,这便是CDN (Content Delivery Network,即内容分发网络的作用)。淘宝在全国各地建立了数十个甚至上百个CDN节点,利用一些手段保证你访问的(这里主要指JS、CSS、图片等)站点是离你最近的CDN节点,这样便保证了大流量的分散以及在各地访问的加速。

这便出现了一个问题,那就是假若一个卖家发布了一个新的宝贝,上传了几张新的宝贝图片,那么淘宝网如何保证全国各地的CDN节点中都会同步存在这几张图片供用户使用呢?这就涉及大量的内容分发与同步的相关技术。另外,淘宝上拥有海量的宝贝图片等静态文件,这些文件的总容量也达到了数PB (1PB=1024TB=1048576GB),为了快速存取这些文件,淘宝开发了分布式文件系统TFS(TaoBao File System)来处理这类问题。

好了,这时你终于加载完成淘宝首页,然后习惯性地在首页搜索框中输入“毛衣”二字并按回车键,这时你又产生了一个PV,然后,淘宝网的主搜索系统便开始为你服务,它首先对你输入的内容基于一个分词库进行分词操作。众所周知,英文是以词为单位的,词和词之间靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子“I am a student”用中文表示,则为“我是一个学生”。计算机可以很简单地通过空格知道student是一个单词,但是不太容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。“我是一个学生”分词的结果是“我是一个学生”。

进行分词操作之后,还需要根据你输入的搜索词进行购物意图分析。用户进行搜索时常常有如下几类意图。

●浏览型:没有明确的购物对象和意图,边看边买,用户比

较随意和感性。Query ★注1例如:“2010年10大香水排行”、“2010年流行毛衣”、“zippo有多少种类?”;

●查询型:有一定的购物意图,体现在对属性的要求上。

Query例如:“适合老人用的手机”、“500元手表”;

●对比型:已经缩小了购物意图,具体到某几个产品。Query

例如:“诺基亚E71 E63”、“akg k450 px200”;

●确定型:已经做了基本决定,重点考察某个对象。Query例如:“诺基亚N97”、“IBM T60”。

通过对你的购物意图的分析,主搜索会呈现出完全不同的结果。

之后的数个步骤后,主搜索系统便根据上述以及更多复杂的条件列出了搜索结果,这一切是由一千多台搜索服务器完成的。然后你开始逐一点击浏览搜索出的宝贝,查看宝贝详情页面。经常网购的亲们会发现,当你买过一个宝贝之后,即便是商家多次修改了宝贝详情页,你仍然能够通过“已买到的宝贝”查看当时的快照。这是为了防止商家对在商品详情中承诺过的东西赖账不认。显然,对于每年数十亿甚至上百亿笔交易的商品详情快照进行保存和快速调用不是一件简单的事情。这其中又涉及数套系统的共同协作,其中较为重要的是Tair(淘宝自行研发的分布式KV存储方案)。

接下来,无论你是否真的进行了交易,你的这些访问行为都会如实地被系统记录下来,用于后续的业务逻辑和数据分析。这些记录中的访问日志记录便是最重要的记录之一,但是从前面我们得知,这些访问是分布在各个地区多个不同的服务器上的,并且由于用户众多,这些日志记录都非常庞大,达到TB级别也非常正常。那么,为了快速、及时、同步地传输这些日志数据,淘宝研发了TimeTunnel,用于进行实时的数据传输,然后交给后端系统进行计算报表等操作。

你的浏览数据、交易数据以及其他很多数据记录均会被保留下来,使得淘宝存储的历史数据轻而易举地便达到了数十甚至更多个PB。如此巨大的数据量存储在阿里巴巴集团的数据仓库中,并且其中有些数据使用了压缩比高达1:120的极限存储技术。之后这些数据会通过一个叫做云梯的基于Hadoop的由3000多台服务器组成的超大规模数据系统,以及一个基于阿里巴巴集团自主研发的ODPS系统的数据系统,不断地进行分析和挖掘。

淘宝从这些数据中能够知道小到你是谁,你喜欢什么,你的孩子几岁了,你是否在谈恋爱,喜欢玩魔兽世界的人喜欢什么样的饮料等,大到各行各业的零售情况、各类商品的兴衰消亡等海量的信息。

说了这么多,其实也只是叙述了淘宝上正在运行的成千上万个系统中的寥寥几个。即便是你仅仅访问一次淘宝的首页,所涉及的技术和系统规模都是你完全无法想象的,是淘宝2000多名顶级的工程师们的心血结晶,其中甚至包括长江学者、国家科学技术最高奖得主等众多牛人。同样,百度、腾讯等的业务系统也绝不比淘宝简单。你需要知道的是,你每天使用的互联网产品看似简单易用,背后却凝聚着难以想象的智慧与劳动。(本文所涉及的技术与数据均来源于互联网)

为了有一个更直观的对比,我们说一个同行,他在2011年光棍节之前做促销,数据流量达到了12Gbps(他们有这么大的流量,老板很高兴,在微博上公布了这个数据),这时的流量达到了极限,网站几乎挂掉,用户无法下订单。而淘宝网光棍节当天网络的流量最高达到800Gbps,带给各家银行和快递公司的流量也让他们如临大敌(后来,他们以能够撑住淘宝带来的流量为荣而到处宣传)。另外,如果你在网上购买过火车票,更能体会到网站能支持多大的流量有多重要。但这不是一朝一夕就能做出来的,也不是有钱就能办到的。

以上对比的这些网站,也许读者很容易就能猜到是哪一家,这里绝对没有嘲笑他们的意思,采用通常的网站技术方案能做到这种程度已经不错了。任何网站的发展都不是一蹴而就的,通常是在什么阶段采用什么技术。在发展的过程中,网站会遇到各种各样的问题,正是这些原因才推动着技术的进步和发展,而技术的发展反过来又会促进业务的更大提升。二者互为因果,相互促进。如今淘宝网的流量已经是全球排名第12、国内排名第3(至2011年年底,eBay全球排名第20,国内前两名是百度和腾讯)。淘宝网的系统也从使用一台服务器,到采用万台以上的服务器。本书就为大家描述淘宝网在整个发展过程中,所有主动和被动的技术变革的前因后果,这由很多有趣的故事组成。

正如同很多人或组织成功了以后,就会为自己的出身编造一个美丽的传说。关于淘宝网的出身,网上也有非常多的传说,下面我们就从它的出生开始讲起。

第1章 个人网站

创建一个小小的网站需要什么技术?在群敌环伺的状况下怎么走出网站的第一步?淘宝网独特的文化和价值观又是怎么形成的?本章试图给你一个解读。

LAMP架构的网站

武侠和倒立文化的起源

2003年4月7日,马云在杭州成立了一个神秘的组织。他叫来十位员工,要他们签了一份协议,这份协议要求他们立刻离开阿里巴巴集团,去做一个神秘的项目。这个项目要求绝对保密,老马戏称“连说梦话被老婆听到都不行,谁要是透漏出去,我将追杀到天涯海角”。这份协议是英文版的,匆忙之间,大多数人根本来不及看懂,但出于对老马的信任,都卷起铺盖离开了阿里巴巴。

他们去了一个神秘的据点——湖畔花园小区的一套未装修的房子里,房子的主人是马云。这伙人刚进去的时候,马云给他们布置了一个任务,就是在最短的时间内做出一个个人对个人(C2C)的商品交易的网站。这里出一个问题考考大家,看你适不适合做淘宝的创业团队:亲,要是让你来做,你怎么做?

在说出这个答案之前,我们先介绍一下这个创业团队的成员:三个开发工程师(虚竹、三丰、多隆)、一个UED工程师(二当家)、三个运营工程师(小宝、阿珂、破天)、一个经理(财神),以及马云和他的秘书。LAMP架构的网站

当时对整个项目组来说,压力最大的就是时间,为什么时间这么重要呢?火云邪神先生说过“天下武功无坚不破,唯快不破”,还有一个原因就是当时eBay和易趣在资本方面正打得不可开交,我们是乘虚而入的,等他们反应过来就危险了。那怎么在最短的时间内把一个网站从零开始建立起来呢?了解淘宝历史的人都知道淘宝是在2003年5月10日上线的,2003年4月7日到5月10日,这之间只有一个月时间。要是你在这个团队里,你怎么做?不是“抄一个来”,我们的答案是——“买一个来”。

买一个网站显然比作一个网站要省事,但是他们的梦想可不是做一个小网站而已,要做大,就不是随便买一个就行的,要有比较低的维护成本,要能够方便地扩展和二次开发。那么接下来就是第二个问题:买一个什么样的网站?答案是:轻量一点的,简单一点的。于是买了这样一个架构的网站:LAMP(Linux+Apache+MySQL+PHP),这个直到现在还是一个很常用的网站架构模型,其优点是:无须编译,发布快速,PHP语言功能强大,能做从页面渲染到数据访问所有的事情,而且用到的技术都是开源、免费的。

当时我们是从一个美国人那里买来的一个网站系统,这个系统的名字叫做PHPAuction(其官方网站 http://www.phpauction.net,Auction即是拍卖的意思,这个名字很直白,一眼就可看出这个系统是用什么语言做的、用途是什么),PHPAuction有好几个版本,我们买的是最高版的,功能比较多,而且最重要的是对方提供了源代码。最高的版本比较贵,花了我们差不多2000美元(貌似现在降价了,只要946美元,在他们的网站上有明码标价的信息)。买来之后不是直接就能用的,需要很多本地化的修改,例如,修改一些数据类型,增加后台管理的功能,页面模板改得漂亮一点,页眉和页脚加上自己的站点简介等。其中最有技术含量的是对数据库进行了一个修改,原来是从一个数据库进行所有的读写操作,现在把它拆分成一个主库、两个从库,并且读写分离。这么做的好处有几点:存储容量增加了,有了备份,使得安全性增加了,读写分离使得读写效率得以提升(写要比读更加消耗资源,分开后互不干扰)。这样整个系统的架构就如下图所示。

其中,pear DB是一个PHP模块,负责数据访问层。另外,他们也用开源的论坛系统PHPBB(http://www.phpbbchina.com)搭建了一个小的论坛社区,在当时,论坛几乎是所有网站的标配。虚竹负责机器采购、配置、架设等,三丰和多隆负责编码,他们把交易系统和论坛系统的用户信息打通,给运营人员开发出后台管理的功能(Admin系统),把交易类型从只有拍卖这一种增加为拍卖、一口价、求购商品、海报商品(意思是还没推出的商品,先挂个海报出来,这是快速增加商品数的一个好方法)四种。(PHPAuction系统里只有拍卖的交易,Auction即拍卖的意思。@_行癫在微博中提到:今天,eBay所有的交易中,拍卖交易仍然占40%,而在中国,此种模式在淘宝几乎从一开始就未能占据优势,如今在主流的交易中几乎可以忽略不计。背后的原因一直令人费解,我大致可以给出其中一种解释,eBay基本上只在发达国家展开业务,制造业外包后,电子商务的基本群体大多只能表现为零散的个体间交易。)

在开发过程中,这个项目的代号是BMW(没错!就是宝马的意思)。这个是二当家提出的建议,二当家特别喜欢宝马,他希望我们的网站也如同宝马一样漂亮、快速、安全,充满乐趣。二当家现在的座驾就是一辆宝马X5,算是得偿所愿了。在上线的时候需要给这个网站取个名字,为了不引起eBay的注意,这个名字要撇开与阿里巴巴的关系,所以“阿里爷爷”、“阿里舅舅”之类的域名是不能用的。这时候,美女阿珂提供了一个很好听的名字“淘宝”。因为她家里有人热爱收藏古董,经常去市场上淘宝贝,而她本人也非常热爱逛街,享受“淘”的乐趣,她觉得“淘宝”两个字特别符合网站的定位(阿珂说想到这个名字的时候,脑子里一道闪电劈过,真的是“灵光一闪”。后来“支付宝”的名字也是阿珂取的)。于是这个大名就定了下来,淘宝网横空出世了。

在接下来的大半年时间里,这个网站迅速显示出了它的生机。这里有必要提一下当时的市场环境,非典(SARS)的肆虐使得大家都不敢出门,尤其是去类似商场等人多的地方。另外,在神州大地上最早出现的C2C网站易趣也正忙得不亦乐乎,2002年3月,eBay以3000万美元收购了易趣公司33%的股份,2003年6月以1.5亿美元收购了易趣公司剩余67%的股份。当时,淘宝网允许买卖双方留下联系方式,允许同城交易,整个操作过程简单轻松。而eBay是收费的,为了收取交易佣金,eBay禁止买卖双方这么做,这必然增加了交易过程的难度。而且eBay为了全球统一,把易趣原来的系统替换成了美国eBay的系统,用户体验一下全变了,操作起来非常麻烦,很多易趣的卖家在那边都混不下去了,这等于是把积累的用户拱手送给了淘宝。为了不引起eBay的注意,淘宝网在2003年里一直声称自己是一个“个人网站”。由于这个创业团队强大的市场开拓和运营能力,淘宝网的发展非常迅猛,2003年年底就吸引了注册用户23万个,每日31万个PV,从2003年5月到同年年底成交额达3371万元。这没有引起eBay的注意,却引起了阿里巴巴内部很多员工的注意,他们觉得这个网站以后会成为阿里巴巴强劲的对手,甚至有人在内网发帖,忠告管理层要警惕这个刚刚起步的网站,但管理层似乎无动于衷。(这个团队的保密工作做得真好!)武侠和倒立文化的起源

在市场和运营的后方,淘宝网的技术团队也在快速地做着系统的改进和创新。这里还有一个有趣的故事,eBay和易趣早期都有员工在论坛上响应用户的需求,eBay的论坛用粉红色背景来区分员工的发言,易趣的员工在论坛上的昵称都选各种豆豆,例如“黄豆豆”、“蚕豆豆”、“黑眼豆豆”等。淘宝在讨论运营策略的时候提到这个问题,老马也要求所有的员工都去论坛上回答用户的问题。最早回答问题的任务落在小宝头上,我们用什么名字好呢?“淘淘”、“宝宝”、“淘宝宝”、“宝宝淘”?小宝都不满意,认为太女性化了,辱没了他堂堂一个七尺汉子。讨论了很久之后,小宝灵光乍现,干脆取个名字叫“小宝”吧,小宝带七个老婆来开店,迎接各位客官,很有故事性和现场感。于是接下来很多武侠小说中的人物开始在淘宝论坛中行侠仗义,这些昵称下面标志着“淘宝店小二”,他们回答着各种各样的问题,快速响应着用户的各种需求。如果是技术上能解决的,几个人商量一下,马上就开发、测试、发布上线。公司给这几个人租了房子,他们合住在湖畔花园旁边的小区里(男女分开),每天睁开眼就去公司,半夜两三点收工睡觉,响应用户的需求非常快。反过来对比一下,易趣被eBay收购之后,系统更换成了全球通用的版本,响应用户的一个需求需要层层审批,据说,买个办公桌都要走两个月流程,反应速度自然慢了下来。

当时淘宝第一个版本的系统中已经包含了商品发布、管理、搜索、商品详情、出价购买、评价投诉、我的淘宝等功能(现在主流程中也是这些模块。在2003年10月增加了一个功能节点:“安全交易”,这是支付宝的雏形)。随着用户需求和流量的不断增长,系统做了很多日常改进,服务器由最初的一台变成了三台,一台负责发送Email、一台负责运行数据库、一台负责运行WebApp。一段时间之后,商品搜索的功能占用数据库资源太大了(用like搜索的,很慢),2003年7月,多隆又把阿里巴巴中文站的搜索引擎iSearch搬了过来。

如此快节奏的工作,其实大家都累得不轻,有人就提议大家随时随地锻炼身体,可是当时SARS横行,在一个一百多平方米的房子里,怎么锻炼呢?高挑美女阿珂提议大家练习提臀操,这样有助于保持身材,这个建议遭到男士的一致反对,后来虚竹就教大家练习倒立,这个大家都能接受。于是这个倒立的传统一直延续至今,与花名文化、武侠文化一并传承了下来。

随着访问量和数据量的飞速上涨,问题很快就出来了,第一个问题出现在数据库上。MySQL当时是第4版的,我们用的是默认的存储引擎MyISAM,这种存储引擎在写数据的时候会把表锁住。当Master同步数据到Slave的时候,会引起Slave写,这样在Slave的读操作都要等待。还有一点是会发生Slave上的主键冲突,经常会导致同步停止,这样,你发布的一些东西明明已经成功了,但就是查询不到。另外,当年的MySQL不比如今的MySQL,在数据的容量和安全性方面也有很多先天的不足(和Oracle相比)。

第2章 个人网站的升级

小网站都想变大,变大总会遇到成长的烦恼,淘宝网的青春期有哪些烦心事?淘宝网的工程师用什么思路来解决遇到的问题?在解决问题之余,他们又用了哪些创新的手段来超越竞争对手?

数据库从mySQL到Oracle

支付手段的创新——支付宝

交流方式的创新——淘宝旺旺

讲到这里,顺便先辟个谣,网上有很多这样骗转发的励志段子:“1998年,马化腾等一伙人凑了50万元创办了腾讯,没买房;1998年,史玉柱借了50万元搞脑白金,没买房;1999年,丁磊用50万元创办了163.com,没买房;1999年,陈天桥炒股赚了50万元,创办盛大,没买房;1999年,马云等18人凑了50万元注册了阿里巴巴,没买房。如果当年他们用这50万元买了房,现在估计还在还着银行的贷款吧。”事实上,阿里巴巴和淘宝网都是在马云自己的房子里创办的,阿里巴巴是1999年初发布上线的。所以,关于马云买房子的事情,真相是这样的。

淘宝网作为个人网站发展的时间其实并不长,由于它太引人注目了,马云在2003年7月就宣布这个是阿里巴巴旗下的网站,随后在市场上展开了很成功的推广运作。最著名的就是利用中小网站来做广告,突围eBay在门户网站上对淘宝的广告封锁。这时候,eBay终于看到淘宝网这个后起之秀了,他对竞争者的态度就是“封杀他”。eBay买断了新浪、搜狐、网易的电子商务类型的广告,签署了排他性协议,切断了淘宝在这上面做广告的路子。大路不通,我们就独辟蹊径,上网比较早的人应该还记得那些在右下角的弹窗和网站腰封上一闪一闪的广告,“淘宝网”几个字总是如影随形地出现在任何中小型网站上。市场部那位到处花钱买广告的家伙太能花钱了,一出手就是几百万元,他被我们称为“大少爷”。数据库从mySQL到Oracle“大少爷”们做的广告,带来的就是迅速上涨的流量和交易量。在2003年年底,MySQL已经撑不住了,技术的替代方案非常简单,就是换成Oracle。换为Oracle的原因除了它容量大、稳定、安全、性能高之外,还有人才方面的原因。在2003年的时候,阿里巴巴已经有一支很强大的DBA团队了,有鲁国良、冯春培、汪海(七公)这样的人物,后来还有冯大辉(@fenng)、陈吉平(拖雷)。这样的人物牛到什么程度呢?Oracle给全球的技术专家颁发一些头衔,其中最高级别的叫ACE(就是扑克牌的“尖儿”,够大的吧),被授予这个头衔的人目前全球也只有300多名(公布名单的网址为:http://apex.oracle.com/pls/otn/f?p=19297:3),当年全球只有十几名,而阿里巴巴就有4名。有如此强大的技术后盾,把MySQL换成Oracle是顺理成章的事情。

但更换数据库不是只换个库就可以的,其访问方式和SQL语法都要跟着变,最重要的一点是,Oracle的性能和并发访问能力之所以如此强大,有一个关键性的设计——连接池,连接池中放的是长连接,是进程级别的,在创建进程的时候,它就要独占一部分内存空间。也就是说,这些连接数在固定内存的Oracle Server上是有限的,任何一个请求只需要从连接池中取得一个连接即可,用完后释放,这不需要频繁地创建和断开连接,而连接的创建和断开的开销是非常大的。但对于PHP语言来说,它对数据库的访问都是很直接的,每一个请求都要一个连接。如果是长连接,应用服务器增多时,连接数就多了,就会把数据库拖挂,如果是短连接,频繁地连接后再断开,性能会非常差(而Java语言有很多现成的连接池)。那如何是好呢?我们打探到eBay用了一个连接池的工具,是BEA卖给他们的。我们知道,BEA的东西都很贵,我们买不起,就放弃了找BEA的念头,于是多隆在网上寻寻觅觅,找到一个开源的连接池代理服务SQL Relay(http://sqlrelay.sourceforge.net),这个东西能够提供连接池的功能,多隆对它进行了一些功能改进之后,系统的架构就变成了如下形式。

数据一开始是放在本地的,七公带领的DBA们对Oracle做调优的工作,也对SQL进行调优。后来数据量变大后,本地存储无法满足了,买了NAS(Network Attached Storage,网络附属存储),NetApp(Network Appliance,美国网域存储技术有限公司)的NAS作为数据库的存储设备,加上Oracle RAC(Real Application Clusters,实时应用集群)来实现负载均衡。七公说这实际上是走了一段弯路,NAS的NFS(Network File System)协议传输的延迟很严重,但那时不懂。后来采购了Dell和EMC合作的SAN低端存储,性能一下提升了十几倍,这才比较稳定了。再后来,数据量更大了,存储的节点一拆二、二拆四,RAC又出问题了,这才踏上了购买小型机的道路。在那段不稳定的时间里,七公曾经在机房住了5天5夜,差点被辐射成蜘蛛侠。

替换完数据库后,时间到了2004年春天,俗话说“春宵一刻值千金”,但这些人的春宵却不太好过,他们在把数据的连接放在SQL Relay之后就噩梦不断,这个代理服务经常会死锁,如同之前的MySQL死锁一样。虽然多隆做了很多修改,但当时那个版本内部处理的逻辑不对,问题很多,最快的解决办法就是“重启”它的服务。这在白天还好,只要连接上机房的服务器,把进程杀掉,然后开启就可以了。但是最痛苦的是它在晚上也要死掉,于是工程师们不得不24小时开着手机,一旦收到“SQL Relay进程挂起”的短信,就从春梦中醒来,打开电脑,连上机房的网络,重启服务,后来干脆每天睡觉之前先重启一下。做这事最多的据说是三丰,他现在是淘宝网的总裁。现在我们知道,任何牛B的人物,都有一段苦B的经历。支付手段的创新——支付宝

微博上有人说“好的架构是进化来的,不是设计来的”。的确如此,其实还可以再加上一句“好的功能也是进化来的,不是设计来的”。在架构的进化过程中,业务的进化也非常迅猛。最早的时候,买家打钱给卖家都是通过银行转账汇款,有些骗子收了钱却不发货,干脆逃之夭夭。这是一个很严重的问题,一个人这么干了之后,很快就有更多的人学会了(这就是传说中的“病毒传播”)。然而魔高一尺,道高一丈,淘宝网这伙人开始研究防骗子的解决方案,他们看了PayPal的支付方式,发现不能解决问题。研究了类似QQ币的东西,想弄个“淘宝币”出来,发现也不行。后来这几个聪明的脑袋把这些想法糅合起来,突然想到了“担保交易”这种第三方托管资金的办法。于是在2003年10月,淘宝网上线了一个功能,叫做“安全交易”,卖家如果选择支持这种功能,买家就会把钱交给淘宝网,等他收到货之后,淘宝网再把钱给卖家,这就是现在的“支付宝”。这个功能最早是让卖家可选的,因为这会延迟他收款的周期。但一旦卖家用了这个之后,就发现交易量猛增,一年之后,几乎所有的卖家都选择担保交易,到后来干脆所有的交易都必须走担保交易。在2012年支付宝的年会上,支付宝公布2011年的交易笔数已经是PayPal的两倍。这个划时代的创新,其实就是在不断思索过程中的一个灵光乍现。

当时开发“安全交易”功能的是茅十八和他的徒弟苗人凤(茅十八开发到一半去上海读MBA了,苗人凤现在是支付宝的首席业务架构师),开发与银行网关对接功能的是多隆。当时多数银行的网站已经支持在线支付了,但多隆告诉我,他们的网关五花八门,用什么技术的都有,我们必须一家一家地去接。而且银行的网关不保证用户付钱后就一定能扣款成功,不保证扣款成功后就一定通知淘宝,也不保证通知淘宝后就一定能通知到,以及不保证通知到了就不重复通知。这害苦了苗人凤,他必须每天手工核对账单,少一分钱都睡不着觉,因为对不齐账就一定是有人的钱找不到地方了,这可是天大的问题。另外,他为了测试这些功能,去杭州所有的银行都办理了一张银行卡。一大堆银行卡摆在桌子上,不知道的人还以为他一定很有钱(高富帅啊),其实里面都只是十元八元的。现在我们再一次知道,任何牛B的人物,都必须有一段苦B的经历。交流方式的创新——淘宝旺旺

有人说淘宝打败易趣(eBay中国)是靠免费,其实这只是原因之一。如果说和易趣过招的第一招是免费,这让用户无须成本就能进来,那么第二招就是“安全支付”,这让用户放心付款,不必担心被骗。在武侠小说中,真正的高手飞花摘叶即可伤人,他们不会局限于一两招,一旦出手,则连绵不绝。而淘宝的第三招就是“旺旺”。其实淘宝旺旺也不是自己生出来的,是从阿里巴巴的“贸易通”复制过来的。从2004年3月开始,“叮咚!叮咚!”这个经典的声音就回荡在所有淘宝买家和卖家的耳边,“亲,包邮不?”“亲,便宜5毛行不?”这亲切的砍价声造就了后来的“淘宝体”。有人说中国人就是爱砍价,虽然笔者体会不到砍价成功后有多少成就感,但每次我去菜市场,看到大妈们砍价砍得天昏地暗,那满足的劲头堪比捡到了钱,我就深刻地理解了淘宝旺旺在交易过程中的价值。我猜eBay也体会不到砍价的乐趣,他们一直不允许买卖双方在线聊天,收购了Skype之后也没有用到电子商务中去。

旺旺在推出没多久,就惹了一个法律方面的麻烦。有个做雪饼的厂家找上门来,说我们侵权了,他们家的雪饼很好吃,牛奶也做得不错,我们都很喜欢。然后我们就在旺旺的前面加了两个字,叫做“淘宝旺旺”。最早做旺旺开发的人只有一个——无崖子,我们叫他“旺旺之父”,为了支持他的工作,我们工作用的IM工具仅限于旺旺,旺旺在线数上新高之后,他请我们吃鸭脖子。有时候为了吃到鸭脖子,我们盯着在线数看,快到整数量的时候,自己赶紧去挂几个小号上去。还有一个很卡哇伊的设计师MM——奇灵,开发出了一套旺旺表情,这套表情比所有的聊天软件的表情都大,也更加生动,一直沿用到现在,我们叫奇灵为“旺旺之母”。

在那个野蛮生长的阶段,其实很多产品都是想到什么就做什么,例如,我们还搭建过一个聊天室,但似乎淘宝网不是一个闲聊的地方,这个聊天室门可罗雀,一段时间后就关闭掉了。

SQL Relay的问题搞得三丰等人很难睡个囫囵觉,那一年开半年会的时候,公司特地给三丰颁了一个奖项,对他表示深切的安慰。但不能总这样通过不断地重启来保证系统的稳定性。于是,2004年上半年开始,整个网站就开始了一个脱胎换骨的手术。

第3章 企业级Java网站

给一个网站更换开发语言,这种事情想想都恐怖,淘宝网在2004年就从PHP语言转换成了Java语言,这是怎么做到的?一个企业级的Java系统应该采用什么样的架构?归纳网站遇到的问题,主要是对性能、容量和成本的控制,这有哪些通用的解决方案?在技术实力得到提升之后,淘宝网的哪些业务有了突飞猛进的发展?哪些业务又会遇到技术的障碍?

脱胎换骨的升级——更换开发语言

坚若磐石——围绕性能、容量和成本的进化

我的师父黄裳曾经说过“好的架构图充满美感”。一个架构好不好,从审美的角度就能看出来。后来我看了很多系统的架构,发现这个言论基本成立。反观淘宝以前两个版本的架构,如下页图所示,你看哪个比较美?

显然,第一个比较好看,第二个显得头重脚轻,这也注定了它不是一个稳定的版本,只存活了不到半年的时间。2004年初,SQL Relay的问题解决不了,数据库必须要用Oracle,那么从哪里动刀呢?只有换开发语言了。换什么语言好?用Java。Java是当时最成熟的网站开发语言,它有比较良好的企业开发框架,被世界上主流的大规模网站普遍采用。另外,有Java开发经验的人才也比较多,后续维护成本会比较低。脱胎换骨的升级——更换开发语言

到2004年上半年,淘宝网已经运行了一年的时间,这一年积累了大量的用户,也快速开发了很多功能,当时这个网站已经很庞大了,而且新的需求还在源源不断地增加。把一个庞大的网站的开发语言换掉,无异于脱胎换骨,在换的过程中还不能拖慢业务的发展,这无异于边换边跑,对时间和技术能力的要求都非常高。做这样的手术,需要请第一流的专家来主刀。现在再考一下

大家:亲,如果你在这个创业团队中,请什么样的人来做这件事?我们的答案是请Sun公司的人。没错,就是创造Java语言的那家公司,世界上没有比他们更懂Java的了。除此之外,还有一个不为人知的原因,我刚才说到Java被世界上主流的大规模网站普遍采用,其中有一个网站就是eBay,那时eBay的系统刚刚从C++改到Java,而且就是请Sun的工程师给改造成Java架构的,这下你懂了吧?他们不仅更懂Java,而且更懂eBay。

Sun公司的这帮工程师的确很强大,在笔者2004年年底来淘宝的时候,他们还在,我有幸与他们共事了几个月。现在摆在他们面前的问题是用什么办法把一个庞大的网站从PHP语言迁移到Java?而且要求在迁移的过程中,不停止服务,原来系统的bugfix和功能改进不受影响。亲,你要是架构师,你怎么做?有人的答案是写一个翻译器,如同把中文翻译成英文一样,自动翻译。我只能说你这个想法太超前了,“too young,too simple,sometimes naive”。当时没有,现在也没有人能做到。他们的大致方案是给业务分模块,一个模块一个模块地渐进式替换。如用户模块,老的member.taobao.com继续维护,不添加新功能,新功能在新的模块上开发,跟老的模块共用一个数据库,开发完毕之后放到不同的应用集群上,另开一个域名member1.taobao.com,同时再替换老的功能,替换一个,就把老的模块上的功能关闭一个,逐渐把用户引导到member1.taobao.com,等所有的功能都替换完之后,关闭member.taobao.com。从设计上来看,这个member1的二级域名应该是一个过渡状态,但我们把member域名的代码下线以后,发现很难把member1切换回member,因为有些地方把链接写死了,于是后来很长时间里我们都是在用member1.taobao.com这样奇怪的域名。一年后,有另外一家互联网公司开始做电子商务了,我们发现他们的域名也叫member1.xx.com、auction1.xx.com,复制得毫无保留,我们只能会心一笑。

说了开发模式,再说说用到的Java MVC框架,当时的struts1.x是用得比较多的框架,但是用过webwork和struts2的人可能知道,struts1.x在多人协作方面有很多致命的弱点,由于没有一个轻量框架作为基础,因此,很难扩展,这样架构师对于基础功能和全局功能的控制就很难做到。而阿里巴巴的18个创始人之中,有个架构师周悦虹,他在Jakarta Turbine的基础上做了很多扩展,打造了一个阿里巴巴自己用的MVC框架WebX (http://www.openwebx.org/docs/Webx3_Guide_Book.html),这个框架易于扩展,方便组件化开发,它的页面模板支持JSP和Velocity等,持久层支持ibatis和hibernate等,控制层可以用EJB和Spring(Spring是后来才有的)。项目组选择了这个强大的框架。另外,当时Sun在全世界大力推广他们的EJB,虽然淘宝的架构师认为这个东西用不到,但他们还是极力坚持。在经历了很多次的技术讨论、争论甚至争吵之后,这个系统的架构就变成了下图的形式。

MVC框架是阿里的WebX,控制层用了EJB,持久层是ibatis。另外,为了缓解数据库的压力,商品查询和店铺查询放在搜索引擎中。这个架构图是不是好看了一点了?

Sun的这帮工程师开发完淘宝的网站之后,用同样的架构又做了一个很牛的网站,叫“支付宝”。(上一篇说过支付宝最初是淘宝上的“安全交易”功能,这个功能后来独立出来,成立了一个网站,也成立了一个公司,就是现在的支付宝。把支付宝从淘宝分出去的人,就是Sun公司的这几个人。)下图是支付宝的第一次员工大会。

上面的架构中,引入了搜索引擎iSearch(前文说过,iSearch其实是在LAMP系统运行一段时间之后被多隆引进的,换为Oracle之后只是替换一下数据源)。其实这个搜索引擎的原理很简单,就是把数据库里的数据dump(倾倒)成结构化的文本文件后,放在硬盘上,提供Web应用以约定的参数和语法来查询这些数据。这看起来不难,难的是数以亿计的信息,怎么做到快速更新呢?这好比你做了一个网站,在百度上很快就能搜到,你一定很满意了。但如果你发布一件商品,在淘宝上过1个小时还搜不到,你肯定要郁闷了。另一个难点是如何保证非常高的容量和并发量?再往后面就要考虑断句和语义分析的问题,以及推荐算法等更加智能的问题。这些内容先不详细介绍,因为搜索引擎的技术已经足以写好几本书了。

其实在任何时候,开发语言本身都不是系统的瓶颈,业务带来的压力更多的存在于数据和存储方面。前面也说到,MySQL撑不住之后换为Oracle,Oracle的存储一开始在本机上,后来在NAS上,NAS撑不住了用EMC的SAN存储,再后来,Oracle的RAC撑不住了,数据的存储方面就不得不考虑使用小型机。在2004年夏天,DBA七公、测试工程师郭芙和架构师行癫,踏上了去北京测试小型机的道路。他们带着小型机回来的时候,我们像欢迎领袖一样欢迎他们,因为那是我们最值钱的设备,价格表上的数字吓死人。小型机买回来之后,我们争相合影,然后Oracle就运行在了小型机上,存储方面,从EMC低端CX存储到Sun oem hds高端存储,再到EMC dmx高端存储,一级一级地往上跳。

到2004年底,淘宝网已经有4百多万种商品了,日均4千多万个PV,注册会员达400万个,全网成交额达10亿元。

到现在为止,我们已经用上了IBM的小型机、Oracle的数据库、EMC的存储,这些东西都是很贵的,那些年可以说是花钱如流水。有人说过“钱能解决的问题,就不是问题”,但随着淘宝网的发展,在不久以后,钱已经解决不了我们的问题了。花钱买豪华的配置,也许能支持1亿个PV的网站,但淘宝网的发展实在是太快了,到了10亿个PV怎么办?到了百亿怎么办?在几年以后,我们不得不创造技术,解决这些只有世界顶尖的网站才会遇到的问题。后来我们在开源软件的基础上进行自主研发,一步一步地把IOE(IBM小型机、Oracle、EMC存储)这几个“神器”都去掉了。这些神器就如同《西游记》中那些神仙的兵器,他们身边的妖怪们拿到这些兵器能把猴子打得落荒而逃。但最牛的神仙是不依赖这些神器的,他们挥一挥衣袖、翻一下手掌就威力无比了。坚若磐石——围绕性能、容量和成本的进化

已经有读者在迫不及待地问怎么去掉了IOE?别急,在去掉IOE之前还有很长的路要走(在后面讲到TDDL的时候,会提到去IOE的一些事情)。行癫等人买回小型机之后,我们用上了Oracle。然后七公带着一帮DBA做优化SQL和存储方面的工作,行癫带着几个架构师研究数据库的扩展性。Oracle本身是一个封闭的系统,用Oracle怎么做扩展呢?用现在一个时髦的说法就是做“分库分表”。

我们知道,一台Oracle的处理能力是有上限的,它的连接池有数量限制,查询速度与容量成反比。简单地说,在数据量上亿、查询量上亿的时候,就到它的极限了。要突破这种极限,最简单的方式就是多用几个Oracle数据库。但一个封闭的系统做扩展,不像分布式系统那样直接加机器就可以了。我们的做法是把用户的信息按照ID来存放到两个数据库中(DB1和DB2),把商品的信息和卖家信息放在两个对应的数据库中,把商品类目等通用信息放在第三个库中(DBcommon)。这么做的目的除了增加了数据库的容量之外,还有一个就是做容灾,即万一一个数据库挂了,整个网站上还有一半的商品可以买。

数据库这么分后,应用程序就会出现麻烦,如果我是卖家,查看我的商品没有问题,我们都在一个库里。但如果我是一个买家,买的商品有DB1的,也有DB2的,要查看“我已买到的宝贝”的时候,应用程序怎么办?必须到两个数据库中分别查询对应的商品。要按时间排序怎么办?两个库中“我已买到的宝贝”全部查出来在应用程序中做合并。另外,分页怎么处理?关键字查询怎么处理?专业点的说法就是数据的Join没法做了。这些工作交给程序员来做也许会更麻烦,于是行癫出手了,他写了一个数据库路由的框架DBRoute,统一处理了数据的合并、排序、分页等操作,让程序员像使用一个数据库一样操作多个数据库里的数据,这个框架在淘宝的Oracle时代一直在使用。但是后来随着业务的发展,这种分库的第二个目的——“容灾”的效果没有达到。像评价、投诉、举报、收藏、我的淘宝等很多地方,都必须同时连接DB1和DB2,哪个库挂了都会导致整个网站挂掉。

前面说过,采用EJB其实是和Sun的工程师妥协的结果,在他们离开之后,EJB也逐渐被冷落了下来。在2005年和2006年的时候,Spring大放异彩,于是在控制层用Spring替换掉了EJB,给整个系统精简了很多代码。

前面还说过,为了减少数据库的压力,提高搜索的效率,我们引入了搜索引擎。随着数据量的继续增长,到了2005年,商品数有1663万个,PV有8931万个,注册会员有1390万个,这给数据存储带来的压力依然很大,数据量大,速度就慢。亲,除了搜索引擎、分库分表,还有什么办法能提升系统的性能?一定还有招数可以用,这就是缓存和CDN(内容分发网络)。

你可以想象,9000万次的访问量,有多少是在商品详情页面?访问这个页面的时候,数据全都是只读的(全部从数据库中读出来,不写入数据库),在那个时候,我们的架构师多隆大神做了一个基于 Berkeley DB 的缓存系统,把很多不太变动的只读信息放了进去。其实最初这个缓存系统还比较弱,我们并不敢把所有能缓存的信息都往里面放,一开始先把卖家的信息放里面,然后把商品属性放里面,再把店铺信息放里面,但是像商品详情这类字段太大的放进去受不了。说到商品详情,这个字段比较恐怖,有人统计过,淘宝商品详情打印出来平均有5米长,在系统里其实放在哪里都不招人待见。笔者清楚地记得,我来淘宝之后担任项目经理做的第一个项目就是把商品详情从商品表中移出来。它最早与商品的价格、运费等信息放在一个表中,拖慢了整张表的查询速度,而很多时候查询商品信息是不需要查看详情的。于是在2005年的时候,我把商品详情放在数据库的另外一张表中,再往后,这个大字段被从数据库中请了出来,先是放入了缓存系统,到现在是放进了文件系统TFS中。

到现在为止,整个商品详情的页面都在缓存里面了,眼尖的读者可能会发现现在的商品详情不全是“只读”的信息了,这个页面上有

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载