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

技术栈的选择:从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了。

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

考虑效率

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

考虑实用

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

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

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

UX设计师应当规避的七大问题 初创公司Citus Data将CitusDB扩展到Hadoop 移动医疗:巢儿孵化器为何笃信是创业金矿? 一个新的雅虎:雅虎主页改版 谷歌发布Google Glass最新视频 公开接受预定 微软Windows Blue结束半程开发 或今年8月推出 JavaFX即将开源,支持iOS与Android开发 趣味编程网Codecademy携手Twitter、Evernote、Box等推出系列API教程 开发者,别让任何人绑架你的工作节奏 REST Style来袭 LinkedIn开源Rest.li框架 [探讨] 是用jQuery框架还是自造车轮呢? 一周消息树:Java 你还会让多少人继续“受伤”? Chromebook Pixel,揭开谷歌云世界的大幕 惠普:第一财季净利12亿 同比仍在下滑 谷歌发布超高清触屏笔记本Chromebook Pixel 传谷歌正开发触屏Chrome OS笔记本 今年或上市 估值25亿 视觉社交网站Pinterest融资2亿美元 跨平台开发框架Xamarin 2.0发布 移动新趋势:扁平化设计 vs. 拟物化设计(上篇) 杂谈 App Store 之 HIG 与 Objective-C 为什么苹果三星将主宰智能电视未来? 罗永浩可爱多:Smartisan OS即将发布 春晚 VS. 移动应用:用户注意力统计报告 Twitter发布BootStrap 2.3版本! 面向对象编程从骨子里就有问题——看看名人大家是如何诋毁面向对象的 开发者及团队能从LibreOffice那里学到什么? 8000美元存储135TB数据:打造开源的存储硬件 Bing,每月27亿的有效搜索不及僵尸网络的一半 为什么说Amazon的James Hamilton是“可遇不可求”的? Facebook背后的数据团队 红帽将产品转移到Apache社区 那里有foxpro下载?那里有sybase下载? 如何删除同一目录下的.temp文件? 想在Linux下面用C、C++编程!请问如何起步? 名词解释!急!来者有分!分不够在加!100分起步,到合理的解释为止! 请问计算机开发的基础 有点郁闷,不知道怎么学才好,到底怎么才能入门呢(JAVA)??? SendCommand这个函数的参数都是些什么?我找不到解释阿 我做局域网视频传输项目,实时接收图像有时候很连贯,有时候图像停顿就象死机现象,是什么原因?难道是网络的原因?我用到1M带宽,而所有网卡为100M,通过交换机组成局域网,交换机每个接口也要100M. 用notes做论坛:用户登录接收到的用户名存在某一个地方,供后面几个页面中的发表及回复使用? Applet在JB5环境下可以用,而在IE中失效,为什么??? MSSCOM传送文件的问题,谁能发一个完整的例子(包括发送和接收),一定给够100分! 谁在linux redhat71上安装过 weblogic61? 报表高手大哥恳请您进来帮帮小弟!!,我急晕了! 关于打印机控制!!!! "VB&EXCEL,EXCEL的关闭!!!" 问题没解决,大家在看看!两帖分一块给!!! 请问 WINDOWD AS 的 CDKEY??? marry____不知怎么办了 (★如何在控件CMSFexGrid中加载图片★) 在linux redhat71上安装 weblogic61的问题! 为什么用Getkeyboardtype()不能得到compaq usb键盘的类型? 回车和换行分别是什么ascii? 用notes做论坛:用户登录接收到的用户名存在某一个地方,供后面几个页面中的发表及回复使用? 屏幕取词的问题 宝兰的回信 里程表的制作,大家谈。 偶想编个网络游戏的外挂程序,请网络编程高手近来讨论一下(来者有分) 有兴趣的过来看一看! JSP中如何调用SERVLET? 怎样自动检测OICQ是不是在线,用C/C++A做,我可以自己输入号码(OICQ) 怎样自动检测OICQ是不是在线,用C/C++A做,我可以自己输入号码(OICQ),大家帮忙 请问各位高手改变字段类型和向一个已存在的表添加新字段的SQl怎么写? 请问在XML规范里TR是什么的缩写? 关于COM中“聚合”的问题,那位大侠给小第指点迷津,多谢多谢! 呵呵!! CSDN 茶馆 再次开张!!!!(东北分店)欢迎光临 那有pdf版的经典的英文计算机书下载。 来指教一下http://www.csdn.net/expert/topic/383/383603.shtm 发送Microsoft.XMLHTTP怎样获得验证 ldap的问题,大家都来看那, 【怎样在韩文版的windows中调出输入法?】 :)java参考书指点................. 怎样获得Microsoft.XMLHTTP请求验证??? 关于asp.net的web控件的响应事件问题! DOS程序后台运行问题? 高手请指教->多个Form间怎么互通消息? 菜问题....D3D的 谁知道怎么做oicq,分全部归他。 各位兄台:如何激活一个窗口! 我发送Microsoft.XMLHTTP怎样获得验证??? 高分相送:有没有能察看一个dll文件中包含哪些函数的工具??????? help!!!! 怎样发送Microsoft.XMLHTTP获得验证???????? 请问,ASP中,能使用类似VB中的“On Error GoTo XXXX”这样的语句吗? foxpro怎样倒入sql server? 我现在有foxpro的dbf文件?应该怎样做? 钢铁是怎样炼成的读后感60字 能给我普通阅读感受 50字左右不是新闻,要阅读50字!!!!!!! 求一篇关于中秋节你是怎样度过的的作文 600字以上速求啊 不要那些老的 我都看过了 600字以上 一道英语综合阅读, Years ago,many zoos kept all kinds of animals in small cages(笼子).Small cages made it easy for people to see the animals,(A)but a small cage is not a good place for an animal to live in. Today zoos keep animal 读鲁滨逊漂流记感悟(50字)快. 冰心的的读后感要100字,语言要通顺, 求c阅读答案,求英语高手 难忘的中秋节400字 明天就交了 哥哥姐姐们 西游记阅读感悟50字 关于中秋节的作文400字左右急只有两天了! 我家的中秋节作文400字,要像小学生写的必须400字 五年级上册精彩极了和糟糕透了读后感 精彩极了和糟糕透了 巴迪是怎样看待父母的爱? 难忘的中秋节作文500字一、提示:文中要求恰当的将“我”引入文章.1.课外书籍,阅读积累2.调查访问3.亲眼目睹4.感同身受二、结构完整:结尾两段以“我”为线索,讲述民俗习惯 英语翻译:除夕时他们团聚在一起吃团圆饭 关于中秋节的作文400字左右,快 快 快 要实际点的, 记录除夕夜到大年初一的英语小短文70字以上. 请用英语翻译:我希望能和家人一起吃团圆饭. 精彩极了和糟糕透了怎样理解文中父母对巴迪的爱? 难忘的中秋节作文600字 一家人吃团圆饭应该用英语怎么翻译如题 《钢铁是怎样炼成的》主要内容是什么?300字左右,一定要300字左右的! 精彩极了和糟糕透了的阅读练习记得七八岁的时候,我写了第一首诗.母亲一念完那首诗,眼睛亮亮,兴奋地嚷着:“巴迪,这是你写的吗?多美的诗啊!精彩极了!”她搂着我,不住地赞扬.我既腼腆又 除夕夜简单英语作文并带翻译, 钢铁是怎样炼成的主要内容200字 老舍笔下的除夕夜和大年初一,与我们现在的除夕夜和大年初一有什么不同 吃团圆饭用英语怎么说? 钢铁是怎样炼成的主要内容300字左右 难忘的中秋节作文300字 狼王梦的延伸联读怎么写?(50字就好) 请求英语大师,帮助阅读 《钢铁是怎样炼成的》1~50页读后感(500字) 读狼王梦有感 600字不要抄袭的 英语任务型阅读,求大师帮忙!很急! 精彩极了和糟糕透了的阅读答案为什么说“我越来越体会到我当初是多么幸运”用文中原句回答. 读狼王梦的感受55字 请求英语大师 “精彩极了”和“糟糕透了” 记得七八岁的时候,我写了第一首诗.母亲一念完那首诗,眼睛亮亮,兴奋地嚷着:“巴迪,这是你写的吗?多美的诗啊!精彩极了!”她搂着我,不住地赞扬.我既腼腆又 读《狼王梦》后的感悟,只要200字,要经典、经典! "精彩极了"和“糟糕透了”阅读答案,“精彩极了”和“糟糕透了” 记得七八岁的时候,我写了第一首诗.母亲一念完那首诗,眼睛亮亮,兴奋地嚷着:“巴迪,这是你写的吗?多美的诗啊!精彩极了! 帮我写一篇中秋节的习俗作文(400字以上) 请以“中秋节”为话题写一篇不少于600字的作文 精彩极了和糟糕透了 “精彩极了”和“糟糕透了”   记得七八岁时,我写了一首诗.母亲一念完那首诗,眼睛亮亮地,兴奋地嚷着:“巴迪,真是你写的吗?多美的诗啊!精彩极了!”她搂住我,赞 中秋节习俗作文不知道这么写, 作文 中秋为话题,不少于600字题目要好一点作文的题目要超好的,文章不要紧 精彩极了和糟糕透了阅读答案这些年来,我少年时代听到的这两种声音一直交织在我的耳际:“精彩极了”,“糟糕透了”;“精彩极了”,“糟糕透了”……它们像两股风不断地向我吹来.我谨 中秋节的习俗作文 冰心的《忆读书》中,为什么书怕比? 《精彩极了和糟糕透了》阅读答案.全文如下:这些年来,我少年时代听到的这两种声音一直交织在我的耳际:“精彩极了”,“糟糕透了”;“精彩极了”,“糟糕透了”……它们像两股风不断 在除夕夜,人们直到午夜欢迎新年的到来之后才去睡觉.英语翻译解释in on at的用法 谢谢 冰心会挑书的实证 忆读书 急作者对书有辨别优劣的能力,会挑选、比较的实证是什么? 以“又是中秋月圆时”为话题 写篇作文,要求500字,急.. 中秋节风俗习惯作文400字左右 除夕夜是几月几号? 以中秋为话题的作文 500字 急! 在除夕夜吃饺子看春晚 用英语翻译 请问除夕夜是几月几号 钢铁是怎样炼成的读后感50字. 英语翻译 你能告诉我全苏州最美的地方在哪里吗?为什么不在农历除夕夜帮你妈妈一起包饺子呢? 写一篇以“中秋节这天我真高兴”为题的600字作文时间
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn