BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

对话伯昊、林轩:阿里TAE的发展故事

| 作者 杨赛 关注 3 他的粉丝 发布于 2013年8月30日. 估计阅读时间: 27 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

在2013年7月的阿里技术嘉年华上,来自阿里巴巴的刘昊旻(伯昊)和侯前明(林轩)介绍了为第三方代码提供托管平台的TAE。TAE是建立在淘宝私有云T4基础上的一个第三方代码托管平台。发端于店铺系统,现在应用于淘宝U站,淘宝TMS,天猫品牌站等。TAE为第三方代码提供了和淘宝内部服务直接交互的机制。未来将作为淘宝生态系统第三方代码引入的解决方案之一,支持更多类型的业务和应用。

InfoQ编辑在现场跟伯昊与林轩沟通了有关TAE的更多细节。

嘉宾简介:

伯昊,2010年加入阿里巴巴,做过dubbo、TAE。对软件复用、应用可扩展性、DevOps等话题感兴趣。也喜欢折腾各种开发板,做些自娱自乐的小东西。

林轩,2002年毕业,2009年加入淘宝。先后从事过Java中间件服务框架HSF,分布式数据层TDDL,消息中间件Notify;2011年开始专注于淘宝TAE代码托管平台。

InfoQ:通过你们的简介,我们知道TAE相当于是一个PaaS产品。先介绍一下TAE的发展历程吧。它是什么时候开始做的?经历过哪些发展阶段?

林轩:TAE是从11年7月底发起的,原始的需求来自淘宝店铺的装修市场。装修市场是淘宝的店铺模板交易平台。在这里第三方设计师使用PHP、HTML、CSS等编写店铺模板,为店铺提供美化和渲染;卖家订购某个模板后,淘宝的店铺系统就会按模板的代码来展现卖家的店铺。这些模板的代码存储在店铺系统内部的数据表中,所以它的扩展性是有限的,只能做一些前端展现的功能。

随着装修市场的繁荣有一些更深入的需求提出来,比如说做个性化的展示,做一些数据存储等。当时的系统结构是无法满足的,所以就发起了TAE这个项目做代码托管。这样的话,一个是功能可以更丰富一些,可以有更多复杂的业务逻辑,代码可以有层次结构,可以有自己的设计模式。这是最初的一个需求的来源。

TAE发起比较早,当时还没有T4,也没有聚石塔。我们当时做的时候,相当于在阿里系内部没有任何参考和借鉴的东西,只有一个原始的需求。所以采用小步迭代的开发模式。开始只做PHP支持,沿用了装修市场的PHP引擎。因为店铺系统本身是java写的,装修市场的php也只是一些代码片段,所以装修市场没有使用php原生执行环境,而是使用Quercus引擎在jvm之上执行php代码。TAE沿用了这个做法。一方面是便于和现有的java系统做交互,另一方面是方便做一些安全控制。

InfoQ:这个引擎是你们自己的吗?

林轩:Quercus引擎是Caucho公司(该公司的另一著名产品是Resin)一个开源的产品。TAE在其基础之上做了很多封装和改造。在JVM之上用Java执行PHP有一个很大的好处,就是要比原生的PHP要安全很多。因为PHP代码和容器本身的代码——Java代码是位于不同的层次上面。Java代码作为PHP的执行引擎,对PHP是透明的,这是一个天然的安全屏障,不需要在系统层面做太多保护。而且项目发起时我们就那么几个,也没有资源去做系统层面的安全。

所以,第一个阶段就是11年,11年主要解决的就是PHP的业务需求。到后期我们有Java的需求慢慢浮现出来的时候,就开始做Java这块系统层面的安全。因为对应Java代码托管,系统和容器本身都是Java的,这样容器的代码和第三方代码是同质的,它一旦通突破Java沙箱之后,就和系统代码具有完全相同的权限了。这个一定要通过系统层面来解决。

一直到12年末开始支持Java托管的时候,我们才开始深入到系统层面,然后也有其他内核组的专家来支持,后面Java才做起来。

InfoQ:TAE的发展大致分为哪几个阶段?

林轩:大致可以分为这么两个阶段:一个前期的PHP容器阶段,后期的Java容器的阶段。

伯昊:我从另外一个侧面补充一下,就是从人的层面。这个项目开发发起的一个探索型项目,刚开始有7、8个人;后来因为业务方的调整,业务上的出路变得不太明朗了,资源投入相应减小了很多。

林轩:这个跟淘宝的业务有关系。在淘宝内部,很多项目的特点就是一定要有业务场景、有需求才会投资源去做。这个产品是从一个业务线发起,不是从平台部门发起的。如果是平台部门发起,可以先不理它的业务;但是从业务线发起,业务线是要有业务目标的,有业务压力。在业务需求不是很明朗、或者不是很急迫的时候,就没有更多的资源投入进来。

伯昊:从这个角度来讲,第一个阶段差不多是从11年初到大概12年年中的时候,这个阶段主要是打基础,做了很多重要的事情,包括PHP的代码支持引擎。这段时间主要是林轩和另外两个同学在里面。当时因为业务的投入比较少,所以纯粹是靠着技术人员的执着在钻研这些核心的问题,包括路由的问题,安全的问题,PHP执行的问题,这些东西都是在那段时间搞定的。

然后就进入了第二个阶段,12年下半年的时候,我们有一个业务终于进来了,是淘宝UZ,uz.taobao.com,它的业务是把第三方的开发者引入进来,让他们在淘宝提供的环境上开发,提供商品不同的组织形式。就是导购型网站。这个业务进来之后,我们就有更多的人加入。这之后这段时间我们做了很多工作,第一个是产品化,第二个是把我们整个PaaS的运维、弹性这套东西给做起来。这是真正能够让PaaS运转起来的、底层的基础支撑系统。

整个12年下半年,我们花了很多时间把TAE从一个我们在实验室里边弄的、技术原型的一个东西,变成一个能够支撑UZ业务的一个正规产品。差不多到年底的时候,我们就可以正式支持UZ了。

林轩:那个时候就有了相对来说比较一个健全的一个产品化体系,包括外围的支撑,运维、监控、日志等。

伯昊:从第二个阶段回头来看,如果要去建这样一个PaaS,肯定最开始要面对的问题,首先是你的代码怎么样去执行,你就会需要去解决我们第一个阶段做的一些东西;做完了之后,你会发现,第二阶段如果要把它产品化,也还是有那么多事情做,比如流量来的时候,你的弹性机制怎样能够去应对所有的这些突发的情况,你的监控体系是不是足够健全,让你能够非常早期的就发现一些系统的异常,比如说应用实例的资源的报警,还有系统本身的一些,前端的动态路由匹配性的经常性的检查,包括安全的一些检查,等等。如果你要正式运营,这些都是一定要做上去的。

InfoQ:U站团队跟你们团队是什么关系?

林轩:一开始UZ属于另外一个产品线,后来并入店铺线了。TAE原始的需求来自店铺,但是因为店铺改造当时还没有完成,一直无法应用于店铺。TAE的第一个应用反而成了U站,后面才慢慢用到店铺的功能模块、功能模板这块。

伯昊:从业务上来讲,对店铺的接入反而是在后边。实际上从第二个阶段开始,我们逐渐发现了自己的一些特色。说实话,在阿里系内部,实际上有一个更有名气的ACE,就是阿里云的PaaS系统。我们实际上比他们做得早,但当时做的时候确实也没考虑到那么多。后来我们发现,我们的定位实际上就是去支持淘宝的开放。

淘宝的开放有个特点:需要受控的开放。这些开放肯定都是插入到淘宝整个体系当中去的,比如说店铺里面有模块,U站里边有别人写的网站,但是他们都是共同在淘宝或者天猫这样的域名之下。受控的开放有几个点,一个是要保护浏览淘宝网站的用户,保护他们的体验和安全;第二是要保护这些开发者们的数据和安全,不要因为他们经验不够导致他们的数据经常被干掉;第三是要确保淘宝自己系统的安全,不被恶意第三方代码侵害。

林轩:从淘宝开放目前可以说有了3种形态。做得最早的是TOP,只开放接口。后来我们有了聚石塔,把第三方的程序拿到淘宝的机房去运行,提供了一个可靠的IT环境。TAE可以说是第三种,通过开放PaaS产品,希望能够把第三方应用程序的生命周期都接管过来。接管过来之后,第一是为他们提供更多的服务,第二个是可以做更多的控制。

所以说到TAE分几个阶段,我觉得我们现在属于第三个阶段:这个阶段我们调整了自己的定位,突出我们能够安全和受控接入第三方代码的机制。

林轩:因为淘宝开放是一个大的方向,所以很多业务线、产品线做到后来都会有一个接入第三方的需求。现在在淘宝内部,有接入第三方的需求后,首先想到的是TAE。在这一年多来,TAE首要的目标是保护淘宝集团内部和淘宝域名下的安全性,它的安全性要求要比一般的PaaS高,因为淘宝是涉及交易的。我们一开始就是冲着第三方代码不能影响淘宝主站的核心系统这个目标来设计的,所以我们对前后端安全和数据安全都有规划,也做了一定的沉淀。所以,现在淘系下面的子业务有第三方代码、第三方开发者接入的需求,很多都会找上门来的。

伯昊:目前我们有一些需求是来自无线端的,比如说天猫,一淘,他们都有无线的主客户端,主客户端里边希望第三方创建一些内容,甚至代码片段和一些逻辑。这也是一个方向,我们可能也会去支撑无线端的后端hosting。

再好比交易这块,他们也想做一些事情,比如在交易里边,我直接填一个车牌号,系统就直接到第三方写的程序里、直接到公安部的系统里边去查,如果查到你有违规,商家就直接帮你把罚金交掉。包括更准确的算物流,卖家可以自己去写代码片段。

简单来说,交易现在遇到一个问题,就是它要支持的交易类型非常丰富,可能要和很多外部的系统进行连接,比如刚才说的公安部的系统,但是它不想把这东西做到自己的系统里面,而且它自己都不想写这个代码,希望第三方来做这个事情。但是他在做的时候,因为交易系统这么核心的一个系统,它一定会遇到开放和安全之间的一个权衡和拿捏。这块正好是我们之前纠结的最多的问题。不知不觉的,我们发现我们在淘宝内部,已经算是这方面经验最丰富的团队了。

我们还有一个可能的业务方向是聚石塔。它以前更多的是做主机的托管和售卖,可能卖虚拟机,卖MySQL的服务,而未来它也需要一个PaaS的方案,让它能够去做更多,包括刚才我说的那三个受控。所以我们这边也在跟聚石塔谈一些合作,包括跟ACE在谈合作。和ACE团队一起为聚石塔提供一个受控开放的PaaS环境,聚石塔这个AE产品估计在年底就能够和大家见面了。

所以,TAE现在是属于第三阶段。第一阶段是实验室,通过一些非常重要的实验对重要基础点进行验证和突破;第二阶段是产品化。第三阶段,应该说是发展期。

InfoQ:这样听起来,好像跟淘宝开放平台的定位有重合?

林轩:TOP只提供API,他不关心第三方的代码写在哪里,跑在哪里。聚石塔是关心他跑在哪里,但是不关心他怎么写。我们是重点关心他代码怎么写的。

伯昊:所以我们跟TOP是正交的。TOP提供了一个接口,一个调用的设施。在TAE里边我们也是一定要开放TOP的。你可以说,我们是淘宝的开放体系的一块砖头。

InfoQ:所以总体来说,TAE是给哪些人用的?

林轩:就现在最新的这个阶段,应该是分两方面:一方面是淘系内部,一方面是聚石塔的用户,即非淘系下面的第三方应用。这两部分安全性的要求是不一样的,淘系方面安全性要求更高,聚石塔相对来说没有那么高,因为他本身就是在一个完全隔离的环境中。

伯昊:我觉得你刚才说的那两个应该都算是淘系的第三方开放的一部分。我的看法是这样:如果是分为淘宝的小二和第三方开发者,那TAE的用户至少会分为这两种;对于淘宝内部的技术小二和业务小二来说,TAE给他们提供的是一个受控的第三方开放的方案,如果他的业务想要去引入第三方来为他的这个体系增加活力,同时又要考虑他整个的安全性,那么他就可以去考虑使用我们了。这是对内部。

对外部来说,这些业务小二所开放出来的业务是谁来使用呢?就是那些第三方的开发者,就是刚才林轩说的这两部分。有一部分的安全级别要求是很高的,即顶着淘宝天猫的域名的这种应用的开发者。对他们来说,可能会感到很辛酸。为什么?因为我们安全上实在控制的太严了,所以他们用起来会真的很不爽。

比如说JS,你是不能用jQuery的,你只能用我们的Kissy。因为,你的JS写出来之后,我们会全部用Caja这个解释容器再把它编译一遍。所以,你写的JS和执行的JS完全是两码事,重新编译过的JS,估计你在浏览器里去看,你自己都看不懂。

JS的限制太多是目前开发者抱怨的焦点,目前我们也在尝试另外的办法,提升易用性。希望我们以后能够尽量不用JS白名单这样的方式去限制JS使用。目前这些探索还处于实验室阶段,希望尽快能够和各位开发者见面。

目前,TAE的用户主要还是PHP,因为相关的业务用PHP写比较方便。现在我们Java也处于试用阶段。

InfoQ:现在外部用Java的还不太多?

伯昊:你我们目前的业务,无论是店铺的装修,还是UZ这些,都是偏展示型的。他有简单的逻辑,用PHP写是最合适不过的。

支持Java,是我们想去支持像聚石塔这样后端的业务,可能有CRM、进销存这样的业务,这种业务更多是用Java来写的。支持Java运行环境,把我们的触角伸到偏向后台的应用,是我们接下来的工作重点。

InfoQ:作为PaaS,TAE现在提供的服务都有些什么?

伯昊:PaaS类型的基础服务都有的,像fetchurl,定时程序,数据库,文件,缓存这些都有。正常的Web应用程序想用的东西基本上都有。在这个基础之外,我们还提供一些偏淘宝业务的一些独特的特性,比如说Session。

林轩:比如你是一个UZ的第三方开发者,你会通过程序里面获得一个用户的标识。这个标识当然和我们淘宝内部用的标识不一样,但是有了这个标识,你就能识别出一个用户,知道当前用户是哪个人,他下次来访问的时候知道他上次做了什么事情。你通过这个可以做很多个性化的功能。

伯昊:我们和业务靠得很近,他们在业务上需要用到什么东西的时候,我们就会研究一下,给他注入到他的执行环境里边,他就可以自己去用了。

林轩:其实每一条业务线都有很多内部的服务,他们接入第三方开发者的时候,会统计第三方开发者需要调用哪些内部服务作为接口。我们现在可以很方便的通过动态配置的方式直接注入到他的应用执行环境里面,他就可以直接用了。

InfoQ:TAE的安全设计能详细介绍一下么?

伯昊:我们安全体系是分层的:网络层,系统层,JVM层——即容器层,然后是应用层。大概是这么四层。

我们所关心的领域,我刚才说了,第一个是淘宝网络环境的安全,我们不希望恶意的第三方开发者通过突破沙箱的方式,突破到淘宝托管环境里边来干一些事情。第二个是ISV自身的安全,我们不希望某一些恶意的攻击者,或者恶意的ISV,通过一些方式拿到别的ISV的代码、数据,甚至于有些ISV的安全意识比较弱,下意识的写出很多有漏洞的代码,比如SQL注入什么的,这个是我们不希望看到的。第三个是淘宝的数据安全,就是TOP有些重要的接口暴露出去的数据,其实淘宝是希望控制的,我们希望大家通过贡献自己的程序为淘宝的整个体系注入活力,提升整个淘宝体系的用户黏性,在这个基础之上,ISV得到他自己的利益;但是我们不希望这个过程当中有很多淘宝重要的数据泄露到外边去。数据对我们来说是非常重要的。

网络层,我们主要照顾的是淘宝自身网络环境的安全。中间的容器层可以做很多事情:容器层以下的系统层和网络层往往都是在JVM层被突破的。这一层主要是防范恶意代码。

林轩:常规防护都是在容器层做的。再上面是前端安全。ISV产生的页面在某些业务场景下会嵌入到一个店铺页面里面,或者嵌入到淘宝子域名下面的某一个页面里面去,如果不做控制,它可能会改变一些父页面的元素,最典型就是装修污染。比如说有的店铺装修引入一个第三方模块,第三方模块有一些恶意的脚本或者CSS,可以去修改店铺的信誉评价,或者类似这种会影响用户行为的内容,这是一种欺骗。我们会有一个沙箱防止这个事情,就是刚才说到的Caja。

常规的安全主要是这两方面,一个容器,一个前端,也包括JS,CSS。

伯昊:容器和前端这块,我们主要是在解决刚才说的ISV自身的安全。数据安全这方面,整个体系都会照顾。

容器层的安全,我觉得比较常规,就是JVM的安全。系统这层,我们有一个基本的假设:攻击者即便突破了我们的沙箱,他进来以后,我们也希望攻击者什么事情都做不了。就是他可能很幸运的在我们机器上看看有什么文件,甚至他可以看到我们的容器代码,但是其他的什么事都干不了。

假设你拿到了本地的脚本执行权限,你可以ls,你能看到你的容器代码,但是容器代码我们很好的Review过了,我们觉得没有什么不能给你看的。这块是跟GAE学的,即使沙箱被突破了,也干不了什么事情。这是我们在系统层以及网络层的一个设计目标。

InfoQ:TAE的技术组成这块,还有哪些值得介绍的么?

伯昊:可以罗列一下。我们现在虚拟化方案已经做成可插拔了,我们可以换虚拟化方案的。当前是T4,就是淘宝内部私有云的解决方案,我们现在也在做基于阿里云的方案。

林轩:容器也可以说一下。PHP容器里做了一些防范,比如说他不断的写一些代码去耗费内存,像死循环,一次返回过多记录,这些都有防范。

伯昊:不过,我觉得如果在虚拟化层做更彻底的隔离,就没有必要去做这样的防范。

林轩:我们目前的PHP容器是没有做彻底隔离的,我们的一个VM可以有多个PHP应用,多个ISV代码,所以需要做这个事情。虚拟化不仅解决机器调用、资源分配的问题,也解决了安全隔离问题,跟安全也有关系——安全跟哪个方面都有关系。然后还有各个应用耗费系统资源的监控等等。

伯昊:监控运维日志是蛮有趣的一块,因为日志的量是很大的,你整个集群拖过来多少应用,上面承载了多大的访问量,就意味着下边会产生大量的日志。这些日志对于开发者来说是至关重要的。作为一个PaaS环境,他要看到日志,就必须通过我们给他提供的界面去看日志,那么我们就得把他的日志很好的组织、存储、展现,并提供搜索。

林轩:这个我们用了淘宝现有的一些大数据的技术。

伯昊:用了HBase。也用了Storm,主要是做业务的处理和日志的结构化,然后把它扔到HBase,在上面做一些离线处理,比如搜索的全量索引等。另外我们的日志系统这块,你可以把它看成一个管道,你在里边也可以产生很多监控报表.就是说,你可以把很多监控的数据写在日志里边,特别是系统的一些东西,然后我们去通过后边这样的一些系统来分析,比如说每个应用的PV、UV,甚至于一些业务数据,都可以在这样一个日志系统里边去采集、统计、分析。

InfoQ:你们团队自己也负责这块的运维么?

林轩:目前运维还是我们自己在做,以后希望把它移交给运维部门的同学。

伯昊:刚说到第一阶段和第二个阶段里,我们团队没有PD,甚至也没有专职的PE。大部分都是我们自己在搞。第三阶段,我们是准备把这些东西移交给更专业的团队来做。

InfoQ:PaaS的前提就是底层的资源隔离。资源隔离这方面,能否再具体说一些?

伯昊:我们现在的方案主要还是基于Linux container,就是T4用的隔离机制。阿里云下面用的是Xen,但我们最终去在上面用的时候,还是会用Linux container做隔离。因为Xen的问题在于,一个物理机不能虚很多VM出来,好像也就30多个的量级,这个数目在往上走overhead会变得很大。那么,我们在这个之上再去用Linux container隔离一下,就可以隔的更细。比如一般的应用,我们给他分0.25个CPU,甚至更低,这样刚才我们说到的PHP死循环这种问题,就没有必要在容器层面去防范,而是在下边隔离资源就直接搞定。我每一个隔离出来的资源单元,里面只放一个应用实例就可以了。

InfoQ:现在是用LXC那套方案吗?还是有自己做一些改动?

伯昊:做了一些改动,但是不能直接说有哪些改动,因为这些改动涉及到安全。安全就是,说得越多越不安全了。

InfoQ:好的。最后想问问,TAE开发过程中遇到过什么难点?不一定是技术方面的,也可以包括一些业务调度方面的。

林轩:安全肯定是最难的。业务上线推广的一个瓶颈就是JS安全,后来通过引入Caja来解决的。在这之前,店铺装修污染的问题已经存在了一两年了。

伯昊:最近都还一直在奋斗。

林轩:因为控制了JS,但CSS也非常灵活,通过CSS他也可以进行店铺装修污染。比如他拿个图片,显示自己卖出去了一万件,实际他就卖出去五件。这个问题看起来好像不是一个很要紧的问题,但实际上真的它就能阻碍你的发展。

伯昊:这个实际上是业务层面的应用安全,你如果不搞定,业务就跑不起来;只有把这个解决了之后,你才有机会能够担心你的业务系统安全问题。

还有一个点就是PHP的执行引擎,当时还是花了很多精力的。因为我们用的开源的Quercus执行引擎,它有两个版本,一个是Pro版,一个是开源版。开源版首先很多Bug,然后性能比较差。

林轩:因为它虽然很多地方用,但是应用规模没有淘宝这么大。我们修了很多Bug,修的过程中又发现各种各样的问题,这个过程中我们发觉淘宝是第一个大规模商用Quercus的。

伯昊:听说Quercus好像是一个写C的开发者,用Java写了一个库,很多地方都用得很不地道,这导致很多性能问题。我们这方面的经验积累了很多,改了很多代码。我们现在正准备把所有改的这些Bug和改进给整理一下,放出来。

林轩:最近正在做这个事情,就是在最新版上把之前的所有bugfix再应用一遍,再整理一下,提交给Resin公司。

伯昊:不过,像有些性能上的东西就没办法提交给他,那些可能在他的Pro版本里面。

林轩:Pro版还是不一样的,他只是解决了执行抽象语法树到执行Java类的一个优化,把执行语法树编译成Java类,然后动态去执行。这样的性能提升会有,但是从其他方面来看,包括字符的处理,它的Pro版和开源版有一样的问题。这块改造也比较大,我们可能也会提给他,但是他接不接受是个问题了。

伯昊:他说不接受,我们也可以把这个东西开源出来。因为Quercus作为一个Java的PHP执行引擎,它主要就两部分:一部分是做语法解析,解析成抽象的语法树;另一部分就是执行,通过Java代码执行语法树。主要就这两个部分。

其实前边一部分,业界有比较标准的参考。因为前边抽象语法树、解析这个事情完全是标准的,其实可以把第二部分的改动拆出来,发布为一个开源的项目。

非技术上的难点,就是在推广。

林轩:从业务线做平台性的产品,有优势也有劣势。优势是,做出来如果有合适的业务产品马上可以落地,推广,快速成熟,成长会很快。但是劣势也是这个:如果没有业务,就没有资源投入。

伯昊:没有资源投入,就很难进行快速的技术积累。这个是比较矛盾的,有时候就是鸡生蛋,蛋生鸡的问题,这个很痛苦。所以,就看你能不能坚持了。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

by lise lie

www.east-tools.com

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT