淘宝网的技术发展史(三)——分布式时代

本文是《淘宝网的技术发展史》系列连载文的第三篇。在系统发展的过程中,架构师的眼光至关重要,作为程序员,把功能实现即可;但作为架构师,要考虑系统的扩展性、复用性,这种敏锐的感觉,有人说是一种代码洁癖。

文/淘宝技术大学培训专家 子柳

 

在做淘宝机票、彩票系统的时候,页面端也有很多东西需要复用,最直观的是页头和页脚。一开始我们每个系统里面复制了一份过去,但奇妙的是,那段时间页脚要经常修改,例如把“雅虎中国”改成“中国雅虎”,过一段时间又加了一个“口碑网”,再过一段时间变成了“雅虎口碑”,最后又变成了“中国雅虎”。后来我就把这部分velocity模板单独拿出来了,做成了公用的模块。

 

类目属性服务化

上面这些都是比较小的复用模块,到2006年我们做了一个商品类目属性的改造,在类目里面引入属性的概念。项目的代号叫做“泰山”。如同它的名字,这是一个举足轻重的项目,这个改变是一个划时代的创新。

在这之前的三年时间内,商品的分类都是按照树状的一级一级的节点来分的,随着商品数量的增长,类目也变得越来越深、越来越复杂,这使得买家找一件商品要逐级类目点开,找商品之前要懂商品的分类。

而淘宝运营部门管理类目的小二也发现一个很严重的问题——例如男装里面有T恤、T恤下面有耐克、耐克有纯棉的,女装里面也有T恤、T恤下面还是有耐克、耐克下面依然有纯棉的,那是先分男女装再分款式再分品牌再分材质,还是先分品牌再分款式再分材质再分男女呢?

这时候,一位大侠——一灯出来了,他说品牌、款式、材质这种东东可以叫做“属性”,属性是类似tag的一个概念,与类目相比更加离散,更加灵活,这样也缩减了类目的深度。这个思想的提出,一举解决了分类的难题!从系统的角度来看,我们建立了“属性”这样一个数据结构,由于除了类目的子节点有属性,父节点也可能有属性,于是类目属性合起来也是一个结构化的数据对象。这个做出来之后我们把它独立出来作为一个服务,叫做catserver(category server)。跟类目属性密切关联的商品搜索功能也独立出来,叫做hesper(金星)。catserver和hesper供淘宝的前后台系统调用。

现在几乎没有什么类目的商品在淘宝上找不到(除了违禁的),但最初类目属性改造完之后,我们很缺属性数据,尤其是数码类的数据最缺。那从哪里弄这些数据呢?我们跟“中关村在线”合作,拿到了很多数据,那个时候,很多商品属性信息的后边都标注着“来自中关村在线”。有了类目属性,给运营的工作带来很大的便利。我们知道淘宝的运营主要就是类目的运营,什么季节推什么商品,都要在类目属性上做调整,让买家更容易找到。例如夏天我要用户在女装一级类目下就标出来材质是不是蕾丝的、是不是纯棉的,而冬天就要把羽绒衣调到女装一级类目下,流行什么就要把什么商品往更高级的类目调整。

这样类目和属性要经常调整,问题就随之而来了——调整到哪个类目,那类商品的卖家就要编辑一次自己的商品,随着商品量的增长,卖家的工作量越来越大,然后我们就发现卖家受不了了。

到了2008年,我们研究了超市前后台商品的分类,发现超市前台商品可以随季节和关联度来调整摆放场景(例如著名的啤酒和尿布的关联),后台仓库要按照自然类目来存储,二者密切关联却又相互分开。然后我们就也把前后台类目分开了,这样卖家发布商品选择的是自然类目和属性,淘宝前台展示的是根据运营需要而摆放的商品的类目和属性。改造后的类目属性服务取名叫做forest(森林,跟类目属性有点神似)。catserver还在,提供卖家授权、品牌服务、关键词等相关的服务。类目属性的服务化,是淘宝在系统服务化方面做的第一个探索。

虽然个别架构师具备了代码洁癖,但淘宝前台系统的业务量和代码量还是爆炸式地增长了起来。业务方总在后面催,开发人员不够了就继续招人,招来的人根本看不懂原来的业务,只好摸索着在“合适的地方”加一些“合适的代码”,看看运行起来像那么回事,就发布上线了。在这样的恶性循环中,系统越来越臃肿,业务的耦合性越来越高,开发的效率越来越低。在这种情况下,系统出错的概率也逐步增长,常常是你改了商品相关的某些代码,发现交易出问题了,甚至你改了论坛上的某些代码,旺旺出问题了。这让开发人员苦不堪言,而业务方还认为这帮人干活越来越慢了。

 

以稳定为中心

大概是在2007年底的时候,研发部空降了一位从硅谷来的高管——空闻大师。他告诉我们一切要以稳定为中心,所有影响系统稳定的因素都要解决掉。例如每做一个日常修改,都必须整个系统回归测试一遍;多个日常修改如果放在一个版本里面,要是一个功能没有测试通过,整个系统都不能发布。我们把这个叫做“火车模型”,任何一个乘客没有上车,都不许发车。这样做的最直接后果就是火车一直晚点,新功能上线更慢了,我们能明显地感觉到业务方的不满,空闻的压力肯定非常大。当时我都不理解这种一刀切的做法,为了稳定牺牲了发展的速度。

但是到现在回过头来看看,其实我们并没有理解背后的思路。正是在这种要求下,我们不得不开始改变一些东西,例如把回归测试日常化,每天晚上都跑一遍整个系统的回归。还有就是在这种要求下,我们不得不对这个超级复杂的系统做肢解和重构,其中复用性最高的一个模块——用户信息模块开始拆分出来了,我们叫它UIC(user information center)。在UIC里面,它只处理最基础的用户信息操作,例如getUserById、getUserByName等等。

另外一方面,还有两个新兴的业务,也对系统基础功能的拆分提出了要求。在那个时候,我们做了淘宝旅行(trip.taobao.com)和淘宝彩票(caipiao.taobao.com)两个新业务,这两个新业务在商品的展示和交易的流程上都跟主站的业务不一样,机票是按照航班的信息展示的,彩票是按照双色球、数字和足球的赛程来展示的。但用到的会员的功能和交易的功能是跟主站差不多的,当时做的时候就很纠结,在主站里面做的话,会有一大半跟主站无关的东西,重新做一个的话,会有很多重复建设。

最终我们决定不再给主站添乱了,就另起炉灶做了两个新的业务系统。从查询商品、购买商品到                        评价反馈、查看订单这一整个流程都重新写了一套出来。现在在“我的淘宝”里面查看交易记录的时候,还能发现“已买到的宝贝”里面把机票和彩票另外列出来了,它们没有加入到普通的订单里面去。在当时如果已经把会员、交易、商品、评价这些模块拆分出来,就不用什么都重做一遍了。

 

拆分核心模块

到2008年初,整个主站系统(有了机票、彩票系统之后,把原来的系统叫做主站)的容量已经到了瓶颈,商品数在一亿以上,PV在2.5亿以上,会员数超过了五千万。这个时候Oracle的连接池数量都不够用了,数据库的容量到了极限,上层系统再增加机器也无法继续扩容了,我们只有把底层的基础服务继续拆分,从底层开始扩容,上层才能扩展,这才能容纳以后三五年的增长。

于是那一年我们专门启动了一个更大的项目,把交易这个核心业务模块也拆分出来了。原来的淘宝交易除了跟商品管理耦合在一起,也在支付宝和淘宝之间跳来跳去,跟支付宝耦合在一起,系统复杂,用户体验也很不好。我们把交易的底层业务拆出来叫交易中心TC(trade center),所谓底层业务是例如创建订单、减库存、修改订单状态等原子型的操作;交易的上层业务叫交易管理TM(trade manager),例如拍下一件普通商品要对订单、库存、物流进行操作,拍下虚拟商品不需要对物流进行操作,这些在TM里面完成。这个项目取了一个很没有创意的名字——“千岛湖”,这帮开发人员取这个名字的目的是想在开发完毕之后,去千岛湖玩一圈,后来他们如愿以偿了。这个时候还有一个项目也在搞,就是淘宝商城,之前拆分出来的那些基础服务,给商城的快速构建提供了良好的基础。

类目属性、用户中心、交易中心,随着这些模块逐步地拆分和服务化改造,我们在系统架构方面也积累了不少的经验。到2008年底干脆做了一个更大的项目,把淘宝所有的业务都模块化,这是继2004年从LAMP架构到Java架构之后的第二次脱胎换骨。这个项目取了一个很霸气的名字,叫“五彩石”(女娲炼石补天用的石头)。这个系统重构的工作非常惊险,有人称之为“给一架高速飞行的飞机换发动机”。

“五彩石”项目发布之后,这帮工程师去三亚玩了几天。他们把淘宝的系统拆分成了如下架构:

其中UIC和forest上文说过,TC、IC、SC分别是交易中心(trade center)、商品中心(item center)、店铺中心(shop center),这些中心级别的服务只提供原子级的业务逻辑,如根据ID查找商品、创建交易、减少库存等操作。再往上一层是业务系统TM(trade manager交易业务)、IM(item manager商品业务)、SM(shop manager,因为不好听,所以后来改名叫SS,即shop system,店铺业务)、Detail(商品详情)。

拆分之后,系统之间的交互关系变得非常复杂,如图2所示。

拆分之后每个系统可以单独部署,业务简单,方便扩容;有大量可重用的模块以便于开发新的业务;能够做到专人专事,让技术人员更加专注于某一个领域。这样要解决的问题也很明显:分拆之后,系统之间还是必须要打交道的,越往底层的系统,调用它的客户方越多,这就要求底层的系统必须具有超大规模的容量和非常高的可用性。

另外,拆分之后的系统如何通讯?这里需要两种中间件系统,一种是实时调用的中间件(淘宝的HSF,高性能服务框架)、一种是异步消息通知的中间件(淘宝的Notify)。另外还有一个需要解决的问题是用户在A系统登录了,到B系统的时候,用户的登录信息怎么保存?这又涉及一个session框架。再者,还有一个软件工程方面的问题:这么多层的一套系统,怎么去测试它?这些问题在后来的发展中都进行了解决。

http://i.wshang.com/?p=22930

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你知道出现“乱码”的原因是什么吗?(4)

作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息,迷茫的你会找到答案。 目录 HTML基…

Android应用程序线程消息循环模型分析(4)

接下来我们再看看应用程序的配置文件AndroidManifest.xml&#xff1a;<?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android" package"shy.luo.counter" andr…

GIS专业核心课程电子教材配套实验数据汇总(持续更新)

本文整合了GIS专业核心课程电子pdf教材,包括地理信息系统、地图学、遥感、摄影测量、遥感数字图像处理、工程测量、施工测量、GPS、数字测图、空间数据库、程序设计等,持续更新。 一、ArcGIS10实验教程(配套实验数据) 二、地理信息系统

7月18日实习日志

今天的上午的工作和昨天一样&#xff0c;上午转发了三十篇&#xff0c;基本上没有遇到什么问题。下午还是转载视频和发稿。 转载于:https://www.cnblogs.com/a1107/p/5706351.html

我抓到bit哥了,嘿嘿嘿(5)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

遥感、地理空间数据、全国基础数据下载网站大全汇总

本文收集整理了国内外常用的遥感、GNSS、地理空间数据下载网站,可以下载各种格式的矢量、栅格等数据,主要包括遥感影像、NDVI、太阳辐射、数字高程模型等各种地理空间数据,供GISer学习交流使用。 1. 地理空间数据云 该网站为国内学者使用最多的、数据下载方便的网站,可以…

RPA之基于FlaUI的微信发送消息给某人

本文由网友蓝创精英团队投稿&#xff0c;欢迎转载、分享原文作者&#xff1a;蓝创精英团队原文链接&#xff1a;https://kesshei.blog.csdn.net/article/details/124955177目的一直想实现微信的群发功能&#xff0c;但是&#xff0c;没有实现&#xff0c;原因有一条是怕违法&am…

感受机房管理化繁为简-新款KVM使用心得

感受机房管理化繁为简-新款KVM使用心得 一、 背景 随着网络应用的不断增多&#xff0c;各地机房服务器数量也随之增加&#xff0c;利用多传统主机切换器的方式已经无法满足目前这种区域广、设备多人员紧缺的现状&#xff0c;而且即使是使用了一些远程管理软件&#xff0c;实现的…

我化身保姆为你提供 html 教学服务(6)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

那一年,我考入了西北师范大学GIS专业,然而我很迷茫,GISer的职业规划到底是怎样的?

那一年&#xff0c;我考入了西北师范大学&#xff0c;录取专业为地理信息系统&#xff0c;也就是常说的GIS&#xff0c;本科毕业后又考取了GIS专业的研究生&#xff0c;顺利毕业&#xff0c;进入了高校从事GIS教育工作。作为一个GISer&#xff0c;我相信有很多人跟我一样很迷茫…

Android之如何分析手机系统相册图片和视频删除后保存的位置

1 需求 需要获取各种型号手机系统相册图片和视频删除后保存的位置 2 分析 1)我们可以通过在sdcard目录下进行相关查找文件夹关键字,对 "cycle"或者"trash"或者*galle*进行忽略大小写模糊查询都有文件夹 find . -iname *cycle* find . -iname *trash*…

WPF 实现水珠效果按钮组

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;普通的地球人原文地址&#xff1a;https://www.cnblogs.com/tsliwei/p/8041928.html相关知识这部分基本就是废话,网上都能找到,我只不过是整理了以下.建议先不看,用到的时候可以回来看看贝…

组策略管理——软件限制策略(4)

编写软件限制规则 在前面几篇文章中讲了软件限制规则的基本概念&#xff0c;现在就来学习如何编写自定义软件限制策略。 编写规则应遵循的原则 首先&#xff0c;需要大家注意的是&#xff0c;软件限制策略应本着方便、安全、实用的原则来编写。限制规则灵活方便&#xff0c;自定…

我使用 html 反向输出自己打自己(7)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

Castle.DynamicProxy拦截器

在asp.net mvc或asp.net miniapi中&#xff0c;有过滤器&#xff0c;可以在请求前或后增加一层&#xff0c;达到验证&#xff0c;过滤等作用&#xff0c;如果在Service的方法前后加一层呢&#xff1f;这里介绍一下Castle.DynamicProxy的用法。首先引入Castle.Core实现代码相对轻…

Android选项切换条SHSegmentControl

&#xfeff;&#xfeff;Android选项切换条SHSegmentControl SHSegmentControl是github上一个开源的选项切换条&#xff0c;其样式如图所示&#xff1a; SHSegmentControl在github上的项目主页地址&#xff1a;https://github.com/7heaven/SHSegmentControl SHSegmentControl…

从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)

原本关于T4模板原想分5个章节详细解说的&#xff0c;不过因为最近比较忙&#xff0c;也不想将整个系列时间拉得太长&#xff0c;所以就将它们整合在一块了&#xff0c;可能会有很多细节没有讲到&#xff0c;希望大家自己对着代码与模板去研究。 本章代码量会比较大&#xff0c;…

赶紧3分钟学完15分钟的内容我要出去玩(8)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

Hello Playwright:(5)查找元素

操作浏览器归根到底就是和页面进行交互&#xff0c;那么必不可少的操作就是查找页面上的元素。因此我们需要熟练掌握Locator 定位器。在上一节我们讲过&#xff0c;可以使用Page.Locator(selector, options)方法创建定位器&#xff0c;而如何定位到元素则取决于selector 选择器…

RxSwift 之官方文档

RxSwift 官方文档结构 Introduction:SubjectsTransforming ObservablesFiltering ObservablesCombining ObservablesError Handing OperatorsObservable Utility OperatorsConditional and Boolean OperatorsMathematical and Aggregate OperatorsConnectable Observable Opera…