说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

技术栈的选择:从Groupon转向Node.js、淘宝去IOE谈起

HTML文档下载 WORD文档下载 PDF文档下载
今年10月份,知名团购网站Groupon宣布完成了为期1年的工作——将Groupon美国站点从Rails迁移到了Node.js;在2010~2013期间,阿里巴巴逐步完成了“去IOE”运动……这些公司为什么要如此“折腾”呢?

在本文开始之前,先来看看一些案例。

  • 今年10月份,知名团购网站Groupon宣布完成了为期1年的工作——将Groupon美国站点从Ruby on Rails全面迁移到了Node.js。
  • 2010~2013期间,阿里巴巴逐步完成了“去IOE”运动,将“IBM小型机+Oracle数据库+ EMC2存储”架构逐步转向了“MySQL+PC Server”。
  • Twitter将其一些后端服务从Ruby on Rails迁移到了JVM上。
  • 京东商场后台抛弃.NET,使用Java重写。
  • Facebook iOS客户端使用HTML5重写,后又换回原生应用。
  • ……

一、这些公司为什么要如此“折腾”

关于技术栈的选择和迁移,并不是几个简单的原因就能说清楚的,也并不是说新的技术栈就比老的技术栈要优秀很多,其实每种技术都有存在的理由,并在特定领域内有其强大的优势的,当然也有缺点,比如 C的性能很高,但是开发效率较低;Java的功能强大,但是没有Ruby简单灵活。

那么这些公司为什么要如此折腾呢?下面以一些公司的实际案例,仅列出一些主要、常见的原因。

1.  速度、可维护性——Groupon从Rails转向Node.js


为什么要放弃原有技术栈?

Groupon目前在全球共有两套站点——美国网站和欧洲网站,其美国网站前端最初是一个单一的Rails(最流行的Ruby开发框架)代码库。对于为什么会选择Rails来开发最初的网站,Groupon开发人员表示,Rails非常适合小型团队快速开发,可以让网站快速启动并运行起来,这对于初期功能不断变化的Groupon来说,是个非常不错的选择。

随着Groupon的发展和新产品不断推出,这个代码库越来越大,有太多的开发者在同一个代码库工作,他们很难在本地运行并测试产品,如果有问题需要回滚,那么每个人的工作都前功尽弃了。

Groupon团队决定将原有的单一Rails库分割成小的、独立的、更易于管理的库。

为什么选择Node.js?

Groupon团队评估了不同的软件栈,想寻找一个能够解决这些问题的方案——有效处理大量传入的HTTP请求、使并行API请求服务于每一个HTTP请求、将结果渲染为HTML5,并可以有效实现监控、部署和支持。

该团队使用不同的软件栈开发了原型,并测试了它们,总体来说,发现Node.js是个非常适合的解决方案。

如何迁移?

Groupon团队使用Node.js重建了网站页面的每个主要部分,将它们作为一个独立的Node.js应用程序,然后重建了基础设施,使所有独立的应用程序可以一起工作。迁移之后,Groupon成为了全球最大的Node.js部署产品之一。

迁移带来的好处

  • 之前单个Rails前端代码库被分割成了20个独立的应用程序,其带来了如下的好处:
  • 页面加载更快——快了50%
  • 与之前相比,处理相同的流量所使用的硬件资源更少
  • 团队可以独立地更改、部署各自负责的模块
  • 网站功能和设计实现可以快速迭代

更详细的信息可参阅 Groupon开发团队的博客。

2.  原有技术栈已无法满足如今的规模——Twitter部分服务从Rails迁移到了JVM


Twitter在2006创建初期也是基于Ruby on Rails开发的,其架构设计也是完全可以应付当时的访问量。但是随着Twitter的快速发展,在每秒上万访问量的处理上,原有架构开始出现各种性能问题,比如Twitter开源负责人Chris Aniszczyk称,在2010年世界杯期间,球员进了一个球或者得到红黄牌,网站就宕机了。

为了解决这个问题,Twitter急需开发一个全新的架构,以应付现在越来越大的访问量。对于Twitter为什么从Rails转向JVM语言,来看看Ruby创始人松本行弘是如何说的。

Twitter刚开始开发的时候不可能考虑到会有现在这样大的访问量,可以说现在的Twitter发展到当初在设计上的极限了。
一个网站在遇到设计极限的时候,有很多解决方法,比如重写架构、换其他语言等等,他们的工程师想要挑战一些新的东西,就提出要改用Scala,因为Scala是编译型语言,性能也不错,正好适合编写新的架构,我觉得这样也不错。
在我看来,在网站所提供的服务还没有完全成型的时候,最重要的是能够对需求的变化做出快速的反应,这个时候就需要Ruby这样灵活性比较高的语言;而在网站获得成功之后,遇到了设计瓶颈,用一种新的语言,比如Scala,来编写一个新的架构,以节约一定的资源,我认为这也是很好的一个结果。Twitter转向Scala还只是在其核心部分,而在Web前端和一些内部工具上还有很多地方在用Ruby。

此外Twitter还将一些后端服务使用Java和 Clojure(基于JVM的Lisp方言)进行了重写,其基础设施也采用了一些开源项目。

迁移后,Twitter在美国总统竞选期间没有出现宕机。目前Twitter每秒处理约6000条消息,加起来每天处理超过5亿或每周35亿条消息。

3.  技术上更可控,规模上更易扩展——淘宝去IOE


2010~2013期间,阿里巴巴逐步完成了“去IOE”运动,将“IBM小型机+Oracle数据库+EMC2存储”架构逐步转向了“MySQL+PC Server”。

至于阿里巴巴为什么要“去IOE”,阿里技术保障部DBA负责人周宝方表示主要从以下几个因素考虑:

  • 集中式的严重制约:集中式强大单点远远满足不了阿里特别是当时淘宝爆炸式业务增长应用的模式,这里可分为三个方面,稳定性、跨IDC容灾切换、快速扩容;
  • 技术面临失控,创新潜力受限;
  • 专用设备规模化场景下诸多限制;
  • 成本(这应该是整体最次的因素);
  • 安全

“去IOE”之后,阿里的技术架构非常灵活,支撑了业务的快速发展,比如在双十一,阿里可以很淡定地做业务扩展;其次是阿里掌握了技术自主可控操作;另外还包括基础工程技术和人才的积累、技术的沉淀、成本、安全性的提升等等。

详细信息可参阅《 阿里周宝方谈“去IOE”战略及实施》。

4.  快速开发需要——PayPal使用Node.js重写其支付系统


PayPal 公司长期存在着“ 非我所创 ”的文化,这导致 PayPal 采用新技术的态度很消极,项目开发进度也极其缓慢。正是由于 PayPal 行动缓慢,其他支付服务商 Stripe 和 Square 趁机成长,逐渐撼动 PayPal 的市场地位。同时,PayPal 当时的开发技术也已经无法满足快速开发的需求,因为当时的开发基本全是 Java,不需要用 Java 来实现的也会用 Java 完成。

2012年4月,David Marcuss成为 PayPal 的总裁后,任命工程师团队重写支付系统,最终,工程师团队用了8周时间完成了该项任务,他们选择了Node.js和一些开源项目对系统进行重新开发,最终他们将这一技术栈整合成了一个 快速开发框架——Kraken,以实现公司其他产品的快速开发。

5.  追随潮流,但这是有代价的——转向HTML5


HTML5 是应用开发领域的未来趋势,由于其跨平台性,一些企业也开始将应用使用HTML5重写。

比如Facebook和LinkedIn采用HTML5重写其iOS客户端。但是他们也付出了一定的代价——由于用户的网络环境并没有预想的那么好,结果导致应用启动、浏览信息流、打开图片都比较慢,因此他们后来又放弃该技术,转而使用苹果的iOS SDK重新构建,由于是本地应用,速度提升非常明显。

当然,这并不是说HTML5不好,而是时机还未成熟。

6.  成本考虑——选择开源软件


由于昂贵的成本,开源软件往往是小型初创公司的首选。比如服务器方面:

  • 单从系统的性能和吞吐量来讲,Windows Server也不差,但是Windows在管理和部署方面没有Linux方便;
  • Windows服务器的授权费用使架构规模的横向扩展成本偏高;
  • 一些高端的服务器软件只有UNIX/Linux版本
  • 一些优化、缓存、数据库解决方案只针对Linux。

7.  更换技术团队或CTO


有这样一种情况存在,比如原有代码库相关开发者大部分都离职了,且相关工作没有交接好,文档又不全,导致现有的开发人员难以维护,或者现有开发人员认为原有代码“坏味道”太多,不愿意维护,所以团队一拍即合,重写架构。

也有可能公司更换CTO后,公司的原有架构不是新CTO所熟悉的,而且他认为原有架构有一定的问题。

8.  被迫选择


如果公司正使用的某些产品的原开发者不再提供支持,那么只能寻找其他替代品。

还有就是在特定平台上,你只能选择某个技术栈,比如iOS开发,你只能选择Objective-C(当然也可以选择其他跨平台开发工具,但是性能上比不上原生应用)。

二、大公司是如何做的

在技术栈的选择和迁移上,大公司会非常慎重,不仅要考虑新的技术栈是否能解决现有的问题,还需要从公司战略(比如发展方向)、技术发展局势(比如移动化、云端化)方面考虑。

1.  不断尝试新技术栈——Groupon

迁移现有架构或技术栈,需要大量的人力和其他资源,此外,为一个线上产品更换底层设施需要非常高的技术,比如有人将淘宝去IOE比喻成在公路上为一个高速行驶的汽车更换轮胎。

一些公司的开发团队会尝试不同的技术栈,制作出原型并进行测试,以此来看是否满足需求。

除了做好预备工作外,开发团队还会选择先迁移部分应用或服务,小步前进,并在此过程中,快速验证新技术栈的适用性,并及时反馈,以便能够发现问题后快速回滚。

2.  优化原有技术栈——Facebook

当然,也有一些公司不愿放弃原有的技术栈,比如 Facebook,转而在原有技术栈的基础上进行优化。

Facebook的前台主要使用PHP编写,尽管PHP编程效率高,能够支持产品的快速迭代,但是与传统的编译语言相比,脚本语言在CPU和内存使用率上不够好,随着Ajax技术的广泛采用,加上SNS对动态要求较高,这些缺点更显得突出。

自2007年以来,Facebook尝试使用多种不同方法解决这一问题,比如使用另一种语言重写Facebook、重写PHP的核心部分Zend引擎,但最终还是没有获得所需的性能。

于是HipHop for PHP诞生了,该项目由一个PHP到C++的转换程序、一个重新实现的PHP运行库和许多常用PHP扩展的重写版本构成,可大大加速和优化PHP应用。据悉,由于HipHop,Facebook Web服务器上的CPU使用率平均减少了50%。

3.  也有失败案例

当然,在技术栈迁移过程中,也有失败的案例,比如5173网站从.NET转向Java以失败告终。详细信息可见范凯 《对.NET系统架构改造的一点经验和教训》。

三、如何选择技术栈


选择技术栈需要参考的因素有很多,一些基本因素如下:

  • 产品预期上市时间
  • 开发团队和生产力情况
  • 可维护性
  • 可扩展性
  • 使用环境
  • 社区和许可情况(开源项目)

对于实际上该如何选择,华为开源支持平台专家庄表伟给出了他的建议。庄表伟认为:

在快速原型的阶段,就可以选择快速开发的语言,而在实用的阶段,就应该选择更加实用的语言。而在一些极端的领域,效率至上与实用至上可以毫不相干,各自有所追求,前期追求效率的开发产品,由于成本极低,大多是可以随时抛弃的。而真正的困难在于想要兼得。常见的与架构相关的两种痛苦:

  • 一种是,刚开始为了追求快速开发,在技术选型上怎么快怎么来,结果系统越来越大,越来越复杂,等到想要考虑架 构优化,想要重构的时候,却已经积重难返,改起架构来伤筋动骨;
  • 另一种是一开始想得太多,架构做得太复杂,杀鸡用牛刀的技术用得太多,往往还没有等到系统开发完成,就已经Game Over了。

庄表伟认为想要兼得鱼和熊掌的确困难,但是并非没有可能,我们可以找到一些优秀的、可选的技术集合,对于技术选型的判断,需要考虑理论情况与实际情况:

考虑效率

  • 技术复杂度(复用性):学习并掌握一组技术栈,需要了解多复杂的技术;相应的,当我们掌握了这门技术,它可以在多少地方复用?
  • 技术友好度(优雅性):在开发的过程中,会不会有各种莫名其妙的陷阱,会不会让我纠缠于各种莫名其妙的细节?

考虑实用

  • 业务复杂度(组织性):随着业务的复杂,我们的代码会不会最终无法驾驭?无法维护?无人能懂?
  • 性能提升度(潜力):随着业务的增长,压力的提升,我们会不会最终被迫放弃现有的技术架构,重头开始?

详细信息可参阅《 技术选型:效率至上与实用至上》。

四、看顶尖互联网企业的技术选型

冲榜不一定要刷榜:增加游戏曝光度的7大杀手锏 科技vs政治:FTC对Google的反垄断调查结束背后 威胁百度:奇虎360确认将与谷歌达成合作关系 Facebook更新Messenger应用 推免费网络电话服务 网上疯传iOS7概念设计:Dashboard是真是假? 过时的UI设计 Ubuntu手机系统前途不被看好 三星将于今年发布Tizen设备 将对苹果形成威胁? 分享9条经典的编程语录 国际著名黑客大赛介绍与比较 微软Azure CDN服务全球范围内出现宕机 双向多功能U盘:从Android设备到PC还有多远? 证明了自己:微软Win8获美国防部6.17亿订单 2013 Facebook黑客杯报名即将开始 解决Win8下IE10无法打开的故障 [简讯] Scala 2.10.0发布! 收购传闻:Apple一厢情愿还是Waze待价而沽 回顾过去,展望2013:移动开发引擎、工具和语言盘点 成本为0!Netflix开源工具Janitor Monkey清理AWS iOS开发者讲述在Google工作的三个月 GitHub历史上最糟糕宕机事故回放及反省 疑因竞争 谷歌有意让地图与WP手机不兼容 移动游戏开者必看:海外VC最关心什么? 淘宝UED:随侃设计师的个人素养 TIOBE 2013年1月:不负重望 Objective-C再次赢得桂冠! 大数据:商业或技术的挑战? 开源移动统计:Cobub Razor近期版本大升级 无人机应用,为何屡遭苹果拒绝 2013年Java继续火的五大理由 Rails所有版本都有SQL注入漏洞?其实没那么严重 如何设置Windows Server 2012 NTFS权限 智能手机大局已定 HTC难扭转乾坤? 为什么RealPlayer放有些网站的流媒体文件时会出错? 请问什么地方有软件开发标准。如国标,国军标等。 如何取得读网页时ie的状态,如正在下载,完毕等等? 朋友们能不能提供我一些关于VC读取文件操作的资料? 关于数据库服务器和备份的问题 win2kPRO 简单问题,高分相送!!在线发分,第一个答对者,定送此分!!!!!! c程序总出现"out of memory..." bzszp(蝎子)和ATCG(ATCG),谢谢!请问可以给我你们的E-mail吗?我以后还有些问题想请教你们! 如何设置java环境 更改工作站的下载等权限 制作一个修改程序外表的东西 怎样ENABLE 注册表编辑 MFC向导生成的基本对话框程序,一按回车就会退出,怎么设置都没有用.怎么办? 小弟下个学期就学vc了,想在这个暑假里好好的去接触接触但是不知道改看那些书好!还请~~~~~~~?高分!! 请问这个错误是什么原因啊? QMAIL高手:关于分页的问题,函数vauth_getall() 制作修改程序外表的东西 初学者学习编程什么样的学校比较适合? 制作修改程序外表的东西 原本对这个世界失望了,居然还发现还有和我一样善良的人,你让我有了活下去,继续灌水事业的勇气,谢谢给我捐献可用分的好人! ******初学者问题 ,如何实现2个Edit框同步******* 请问DataGrid如何和ADO控件梆定? 在servlet中设置了一个javaBean的属性,怎样把他传递到jsp中呢? ADOStoredProc1中存的游标数据如何附给变量中???带原码) 如何提取OLE 容器的嵌入对象? 大家喜欢什么格式的电子书? chm, pdf, html, doc,.... 怎样才能向一个文件中插入一个汉字? 在Word中快速插入日期和时间 备份access数据库原代码,看看错在哪里? 如何写收取、检索POP3邮箱的页面? 代码智能感应? 请教:c++编译器的问题 承蒙看得起~~最近半个月平均没天收到两封带毒邮件,散分:( WinSock控件编程中的一个小问题 QMAIL高手:关于分页的问题,函数vauth_getall() 高手们你们好,请您帮助 大家都在网上混了这么长时间了,有谁知道新浪网的sina是什么意思?俺不知道阿!!! 请大家帮忙看一下,这个问题怎么办???? QMAIL高手:关于分页的问题,函数vauth_getall() 哪里有英文的win2000下阿? 大家帮我看看如何在更新不成功的情况下,能提示出“更新出错” 打开一个任意一个目录下grid的存档程序怎写? 有没有办法防止<Frameset>拖动? 关于boost 请教有关于RichTextBox的问题,高手进来看! 这个ASP提交数据为什么出错,代码如下,在线给分 如何在内存中对一副图进行操作呢 订了一年的杂志,至念只收到2期!!!!!!!!!!!!!!!!!!!!!!!!!!!! 如何做点击一个超链接来运行exe文件?谢谢 在线等候 char * aaa 和CString abc之间的转换问题 跪求'对数平均温差法进行热设计基本思路'是什么啊? 黑龙江漠河日照现在的时间 潮汐,火山爆发,雷电,龙卷风,是怎么一回事 对数平均温差 1n代表的什么 1n等于多少对数平均温差 因为在冷凝器 板换 一系列的换热器中 温度是变化的 为了我们更好的选型计算所以出来一个相对准确的数值,当 △T1/△T2>1.7时 用公式: 漠河夏至节旅店、宾馆的标间普间价格及电话. 一物体用弹簧称测得它的重力为100N,将它放在水中弹簧称示数为20N,求它在水中受的的浮力? 怎样判断线圈是否产生感应电流或者怎样判断磁通量发生变化 描写长城的诗句有哪些? 有人说,湿地是一个地区的“肾”,它能起到调节的作用,请你提出几条保护湿地的措施 制冷系统冷凝器为水冷,其对数平均温差为20度正常么?是不是太大了?冷却水进出口为32和37,冷凝温度为55,是否合理…… 氯化铵的化学式怎么写 世界湿地保护区曾经在盘锦呆过,知道那里有个叫红海滩的观鸟湿地保护区,其实我们家乡岳阳的东洞庭湖也是观鸟湿地保护区,想知道世界上一共还有多少湿地保护区,有没有什么尺度来区分? 用导电塑料作成线圈,改变穿过线圈的磁通量,导电塑料会不会产生感应电流? 夏至日下列地区白昼最长的是A曾母暗沙B漠河C乌苏里江上D帕米尔高原上 一根一端封闭的玻璃管开口向下插入水银管中,内封一定质量的气体,管内水银面低于管外,当温度不变时,将玻璃管向下压一段距离 能受力分析一下 为什么 P气体=P0+P液面差 黄河湿地国家级自然保护区在河南省焦作市孟州段有没有分布,范围包括那些乡镇? 描写长城的句子和词语同问 一端封闭,粗细均匀的U型玻璃管两边长度均为1米,内装水银并封入一定质量的气体.在大气压为75cmHG时,水面高度相同,空气柱长50cm,如图所示.如果在开口端接上抽气机,把开口端的气体缓慢抽成 长时间加热水为什么水不能沸腾 某晶体的熔点是120摄氏度,那么当该晶体的温度是120摄氏度时,其状态.A 一定是固态 B 一定是液态 C 一定是固、液共存状态D 以上三种情况都有可能我选的C,同学选的D. 电阻应变片与半导体应变片的工作原理有何不同?它们各有何特点? 水在长时间加热能变为土吗 请问此化学式的反应结果NH4Cl+Na2SO3 电阻R=30Ω,Rх的电阻未知.闭合开关S,电流表的示数为1A,断开开关S,电流表的示数变为0.8A,求RхR1 R2串联,开关与R2并联,电流表串联在电路中 小石潭记,岳阳楼记,醉翁亭记,满井游记的区别 请问北京漠河夏至日和冬至日的昼长求具体的数字 一道高中的函数题(高手进)下列四个函数中,在(0,+∞) 上为增函数的是A.f(x)=3-xB.f(x)=x的平方-3xC.f(x)=-(1/(x+1))D.f(x)=-|x|不要只给答案.答案我已经知道是c了, 小石潭记、岳阳楼记、醉翁亭记、满井游记相同点和不同点~ 求f(x,y)=x∧2-y∧2,求f(x+y,y/x)的函数表达式还有有f(x+y,y/x)=x∧2-y∧2,求f(x,y)的函数表达式, 世界海洋灾难之最损失最惨重 死亡率最高 我国漠河冬至时昼长约为7小时,相当与夏至时昼长的12分之5,夏至时漠河昼长达约为几小时写算式啦 核弹爆炸原理是什么? 我们在开发海洋的同时,给海洋带来了什么样的灾害 《小石潭记》《岳阳楼记》《醉翁亭记》《满井游记》四文中心句? 求几部关于核弹爆炸的电影 为什么天会打雷下雨 小石潭记 岳阳楼记 醉翁亭记 满井游记 的原文 核弹爆炸电影看着视频刚开始这么多核弹,炸了,是什么电影 下雨打雷天,为什么先看见闪电,然后在听见声音? 比较《小石潭记》《岳阳楼记》《醉翁亭记》《满井游记》的相同点与不同点····表格的形式 导体应变片与半导体应变片工作原理有何不同? 下雨天为什么会先看见闪电后听到打雷每次下雨天我们都会先看见闪电后再听到打雷的请问为什么? 请问北京、漠河等中国城市夏至日和冬至日的昼长?请说详细点,备考用的 (1)设函数f(x)=x^2-x+1/2的定义域是[n,n+1],那么f(x)的值域中共有( )个整数(2)对于任意实数x,设f(x)是 4x+1,x+2,-2x+4中的三者中的最小值,则f(x)的最大值为() 正确答案是8/3这个我题目也看不懂在说 超导体有什么实际意义 黄河国家湿地公园怎么样 核弹爆炸时我们应该怎么做 湖泊湿地对气候的影响是什么? 请问膜盒压力表就是两个膜片对接之间通入测量流体对吧?1,我的问题是那和膜片式有什么区别,不都是通过膜片变形吗?只不过膜片式一个传到弹簧管测压膜盒是两个膜片传到弹簧管测压? 2,还 核弹爆炸 人会怎么样?最好有图,描述,好的话我加50 人类的哪些活动对湿地环境有影响,分别造成了那些后果?人类的哪些活动对湿地环境有影响 是不是夏至的时候在漠河村可以看见极光?怎么去?我是哈尔滨的,想去看极光,要怎么样才能到达那传说中的北极村呢?是不是黑河市漠河县的漠河村?还是什么?有点搞不清楚……请大家帮帮忙~ 描写春天天气好的成语,段落 天为什么是大海的颜色其实我想问的是大海为什么是蓝色的 不能是红的 黄的 绿的吗 在夏至时,曾母暗沙和漠河哪个日照时间长 5月2日在智利南部查纳拍到的照片中,闪电正在划破被柴滕火山喷发出的火山灰笼罩的天空.目前已有许多证据显示火山喷发有时会伴随着雷电天气,科学家怎么解释引发此现象的原因? 天是什么颜色,海是什么味道. 我想问问你,我们家的电水壶里面的水烧开后忘记带了,凉了后又自动加热,是正常现象么? 黑龙江漠河日照时间只有7个小时应在什么时候? 火山爆发时伴随着雷电和暴风雨 是为什么?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘