第一部分 淘宝技术发展-------光棍节的狂欢
时间到,开抢!”坐在电脑前早已等待多时的小美一看时间已到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是一个单词,但是不太容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。“我是一个学生”分词的结果是“我 是 一个 学生”。
进行分词操作之后,还需要根据你输入的搜索词进行购物意图分析。用户进行搜索时常常有如下几类意图。
y 浏览型:没有明确的购物对象和意图,边看边买,用户比较随意和感性。Query*注1例如:“2010年10大香水排行”、 “2010年流行毛衣”、“zippo有多少种类?”;
y 查询型:有一定的购物意图,体现在对属性的要求上。
Query例如:“适合老人用的手机”、“500元 手表”;
y 对比型:已经缩小了购物意图,具体到某几个产品。Query 例如:“诺基亚E71 E63”、“akg k450 px200”;
注1 Query即查询。为了在数据库或搜索引擎中寻找某一特定文件、网站、记录或一系列记录,由搜索引擎或数据库送出的信息。——作者注
y 确定型:已经做了基本决定,重点考察某个对象。Query例如:“诺基亚N97”、“IBM T60”。
通过对你的购物意图的分析,主搜索会呈现出完全不同的结果。
之后的数个步骤后,主搜索系统便根据上述以及更多复杂的条件列出了搜索结果,这一切是由一千多台搜索服务器完成的。然后你开始逐一点击浏览搜索出的宝贝,查看宝贝详情页面。经常网购的亲们会发现,当你买过一个宝贝之后,即便是商家多次修改了宝贝详情页,你仍然能够通过“已买到的宝贝”查看当时的快照。这是为了防止商家对在商品详情中承诺过的东西赖账不认。显然,对于每年数十亿甚至上百亿笔交易的商品详情快照进行保存和快速调用不是一件简单的事情。这其中又涉及数套系统的共同协作,其中较为重要的是Tair(淘宝自行研发的分布式KV 存储方案)。
接下来,无论你是否真的进行了交易,你的这些访问行为都会如实地被系统记录下来,用于后续的业务逻辑和数据分析。这些记录中的访问日志记录便是最重要的记录之一,但是从前面我们得知,这些访问是分布在各个地区多个不同的服务器上的,并且由于用户众多,这些日志记录都非常庞大,达到TB级别也非常正常。那么,为了快速、及时、同步地传输这些日志数据,淘宝研发了TimeTunnel,用于进行实时的数据传输,然后交给后端系统进行计算报表等操作。
你的浏览数据、交易数据以及其他很多数据记录均会被保留下来,使得淘宝存储的历史数据轻而易举地便达到了数十甚至更多个PB。如此巨大的数据量存储在阿里巴巴集团的数据仓库中, 并且其中有些数据使用了压缩比高达1:120的极限存储技术。之后这些数据会通过一个叫做云梯的基于Hadoop的由3000多台服务器组成的超大规模数据系统,以及一个基于阿里巴巴集团自主研发的ODPS系统的数据系统,不断地进行分析和挖掘。
淘宝从这些数据中能够知道小到你是谁,你喜欢什么,你的孩子几岁了,你是否在谈恋爱,喜欢玩魔兽世界的人喜欢什么样的饮料等,大到各行各业的零售情况、各类商品的兴衰消亡等海量的信息。
说了这么多,其实也只是叙述了淘宝上正在运行的成千上万个系统中的寥寥几个。即便是你仅仅访问一次淘宝的首页,所涉及的技术和系统规模都是你完全无法想象的,是淘宝2000多名顶级的工程师们的心血结晶,其中甚至包括长江学者、国家科学技术最高奖得主等众多牛人。同样,百度、腾讯等的业务系统也绝不比淘宝简单。你需要知道的是,你每天使用的互联网产品看似简单易用,背后却凝聚着难以想象的智慧与劳动。
(本文所涉及的技术与数据均来源于互联网)
为了有一个更直观的对比,我们说一个同行,他在2011年光棍节之前做促销,数据流量达到了12Gbps(他们有这么大的流量,老板很高兴,在微博上公布了这个数据),这时的流量达到了极限,网站几乎挂掉,用户无法下订单。而淘宝网光棍节当天网络的流量最高达到800Gbps,带给各家银行和快递公司的流量也让他们如临大敌(后来,他们以能够撑住淘宝带来的流量为荣而到处宣传)。另外,如果你在网上购买过火车票,更能体会到网站能支持多大的流量有多重要。但这不是一朝一夕就能做出来的,也不是有钱就能办到的。
以上对比的这些网站,也许读者很容易就能猜到是哪一家, 这里绝对没有嘲笑他们的意思,采用通常的网站技术方案能做到这种程度已经不错了。任何网站的发展都不是一蹴而就的,通常是在什么阶段采用什么技术。在发展的过程中,网站会遇到各种各样的问题,正是这些原因才推动着技术的进步和发展,而技术的发展反过来又会促进业务的更大提升。二者互为因果,相互促进。如今淘宝网的流量已经是全球排名第12、国内排名第3(至
2011年年底,eBay全球排名第20,国内前两名是百度和腾讯)。淘宝网的系统也从使用一台服务器,到采用万台以上的服务器。本书就为大家描述淘宝网在整个发展过程中,所有主动和被动的技术变革的前因后果,这由很多有趣的故事组成。
正如同很多人或组织成功了以后,就会为自己的出身编造一
个美丽的传说。关于淘宝网的出身,网上也有非常多的传说,下面我们就从它的出生开始讲起。
个人网站
LAMP
2003年4月7日,马云在杭州成立了一个神秘的组织。他叫来十位员工,要他们签了一份协议,这份协议要求他们立刻离开阿里巴巴集团,去做一个神秘的项目。这个项目要求绝对保密,老马戏称“连说梦话被老婆听到都不行,谁要是透漏出去,我将追杀到天涯海角”。这份协议是英文版的,匆忙之间,大多数人根本来不及看懂,但出于对老马的信任,都卷起铺盖离开了阿里巴巴。
他们去了一个神秘的据点——湖畔花园小区的一套未装修的房子里,房子的主人是马云。这伙人刚进去的时候,马云给他们布置了一个任务,就是在最短的时间内做出一个个人对个人
(C2C)的商品交易的网站。这里出一个问题考考大家,看你适不适合做淘宝的创业团队:亲,要是让你来做,你怎么做?
在说出这个答案之前,我们先介绍一下这个创业团队的成员:三个开发工程师(虚竹、三丰、多隆)、一个UED工程师
(二当家)、三个运营工程师(小宝、阿珂、破天)、一个经理(财神),以及马云和他的秘书。当时对整个项目组来说,压
力最大的就是时间,为什么时间这么重要呢?火云邪神先生说过
“天下武功无坚不破,唯快不破”,还有一个原因就是当时eBay 和易趣在资本方面正打得不可开交,我们是趁虚而入的,等他们反应过来就危险了。那怎么在最短的时间内把一个网站从零开始建立起来呢?了解淘宝历史的人都知道淘宝是在2003年5月10日上线的,2003年4月7日到5月10日,这之间只有一个月时间。要是你在这个团队里,你怎么做?不是“抄一个来”,我们的答案是——“买一个来”。
买一个网站显然比做一个网站要省事,但是他们的梦想可不是做一个小网站而已,要做大,就不是随便买一个就行的,要有比较低的维护成本,要能够方便地扩展和二次开发。那么接下来就是第二个问题:买一个什么样的网站?答案是:轻量一点的, 简单一点的。于是买了这样一个架构的网站:LAMP(Linux+ Apache+MySQL+PHP),这个直到现在还是一个很常用的网站架构模型,其优点是:无须编译,发布快速,PHP语言功能强大, 能做从页面渲染到数据访问所有的事情,而且用到的技术都是开源、免费的。
当时我们是从一个美国人那里买来的一个网站系统,这个系统的名字叫做PHPAuction(其官方网站 http://www.phpauction. netAuction,即是拍卖的意思,这个名字很直白,一眼就可看出这个系统是用什么语言做的、用途是什么),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相比)。
Oracle/支付宝/旺旺
讲到这里,顺便先辟个谣,网上有很多这样骗转发的励志段子:“1998年,马化腾等一伙人凑了50万元创办了腾讯,没买
房;1998年,史玉柱借了50万元搞脑白金,没买房;1999年,丁
磊用50万元创办了163.com,没买房;1999年,陈天桥炒股赚了50
万元,创办盛大,没买房;1999年,马云等18人凑了50万元注册
了阿里巴巴,没买房。如果当年他们用这50万元买了房,现在估
计还在还着银行的贷款吧。”事实上,阿里巴巴和淘宝网都是在
马云自己的房子里创办的,阿里巴巴是1999年初发布上线的。所以,关于马云买房子的事情,真相是这样的。
淘宝网作为个人网站发展的时间其实并不长,由于它太引人注目了,马云在2003年7月就宣布这个是阿里巴巴旗下的网站, 随后在市场上展开了很成功的推广运作。最著名的就是利用中小网站来做广告,突围eBay在门户网站上对淘宝的广告封锁。这时候,eBay终于看到淘宝网这个后起之秀了,他对竞争者的态度就是“封杀他”。eBay买断了新浪、搜狐、网易的电子商务类型的广告,签署了排他性协议,切断了淘宝在这上面做广告的路子。大路不通,我们就独辟蹊径,上网比较早的人应该还记得那些在右下角的弹窗和网站腰封上一闪一闪的广告,“淘宝网”几个字总是如影随形地出现在任何中小型网站上。市场部那位到处花钱买广告的家伙太能花钱了,一出手就是几百万元,他被我们称为“大少爷”。
“大少爷”们做的广告,带来的就是迅速上涨的流量和交易量。在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年上半年开始,整个网站就开始了一个脱胎换骨的手术。