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

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

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

考虑效率

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

考虑实用

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

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

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

自适应表单的实现-Delphi资料 COM/DCOM的区别与联系-Delphi资料 CoolBar上控件的排列顺序-Delphi资料 Delphi 4 WebBroker Delphi 中自做动态显示的控件 Delphi3的DBGrid中的下拉列表和查找字段编程方法 DELPHI常见问题 Delphi的竖排标签 DELPHI构件制作方法 DELPHI控件Tweblabel的编制 DELPHI中MEMO组件的光标定位 Delphi中RichEdit的奥妙 Delphi中TApplication类 Delphi中日期时间输入的简洁方法 delphi中怎么调用interbase数据库? Memo的Undo功能-Delphi资料 RECT在Delphi中的灵活使用 StringGrid制作只读列-Delphi资料 TADOQuery下主明细表其属性关系如何设置,如何保存主表和明细表?-Delphi资料 TBatchMove用法-Delphi资料 TMemo的真正插入字符-Delphi资料 TREEVIEW的使用-Delphi资料 TreeView在电信综合统计管理系统中的应用-Delphi资料 VB6.0动态加载ActiveX控件漫谈-Delphi资料 捕捉来自 Thread 的异常-Delphi资料 定制Speedbar-Delphi资料 动态产生构件并相应事件-Delphi资料 对Borland可视部件的一处改进-Delphi资料 控件使用技巧-Delphi资料 改变VCL的行为--一个使用可视化元件的实例-Delphi资料 具有不同字体的列表框-Delphi资料 简单的问题:关于符号' " & 在word文档中使用active控件引发的问题,想请大家帮忙。急!!! 为什么G.723.1 在DShow里面用不了? 大虾呀、小弟我求救呀!快来帮帮我!郁闷呀! 我安装了win2003后,为什么声音驱动装不了? release为何不行? 在delphi中如何得到mysql里所有的数据库名?急!在线等!! 怎样获得例如另一个网页的内容,然后部分现实,原理是什么 怎样获得例如另一个网页的内容,然后部分显示,原理是什么 100分求MSDN下载地址!!! 菜鸟苦难,高手达人入,简单问题! 我有白头发了,你们也? 请教一个关于datagrid的弱弱的问题 DirectShow中通过摄像头获取图像,如何改变分辨率 关于Win2000做服务器,Win98做客户端,在98中如何设置连接Internet的问题? 我的php是怎么回事呀? 如何访问带密码的Access数据库? 关于程序员的数组方面的问题? 救菜鸟!给个范例! 为什么我在XP下文件夹加密加不了? 在word文档中使用active控件引发的问题。急!!! 我在我的frame中的一个页面中用一个button的onClick="javascript:window.close()"怎么关闭不起作用呢? 帮帮我吧,我asp刚入门,就要做网站,感觉心里好没底...... 红色紧急求救 我在北京找工作,各位仁兄帮帮看看 如何在窗体中动态生成组件? 如何实现显示在线者的信息,如注册会员多少人,访问者多少人等等(附三问) 50分求救,哪里有下载免费的VB6中文版? 求救!!!!!!!!!高分!! 大家进来看看这个效果怎么做! 哪能找到关于网络侦听的源程序?用VC做的,谢谢! 九月份就大四了,要分方向了,大家给点意见? 如何禁用ie选项中的“显示友好的http错误信息” 接了一个小小的酒店管理系统,问一下,值多少钱?(可别说我做坏了市场:)) 程序员考试的资料在哪下载?(.pdg的文件用什么阅读?) 我下载了JDK1.4.1_03安装以后JDK目录里没有1.3的Javac文件呀? 新手的问题(asp的源代码): vector&父类子类的问题 单片机如何实现霓虹灯控制,谢谢。 ASP操作oracle数据库,是不是只能用SQL语句实现 哪里有介绍NAT(网络地址转换)原理的网站? win2000下,的计算机管理--磁盘管理--选中c盘--右键--属性--工具--查错,选中扫描并试图恢复坏扇区........... Session会无故消失!! 请大家注意FAQ的提交! ---如何在linux下编译IDL文件--- 求Rational purifyplus for Linux 的license 简单sql语句问题 VB编译好的程序为何不能在没装VB上运行? vector&父类子类的问题 有关三角矩阵乘法 如何编写ASP类? 几何概型1.平面上一组平行线,且相邻平行线间的距离为3cm,把一枚半径为1cm的硬币任意抛掷在这个平面上,则硬币不与任何一条平行线相碰的概率为多少2.铺满边长为9cm的正方形塑料板的地面上 已知点A(8,0)及在第一象限的动点P(x,y),且x+y=10,设三角形AOP的面积为S(1)求S关于x的函数关系式 (2)求x的取值范围.(3)求S=16时点P的坐标、 (4)画出函数S的图像、 六年级数学应用题(列方程的)甲乙两人同时绕400米的环形跑道行走,如果他们能同时从同一起点背向而行,2分30秒首次相遇;如果他们同时由同一起点同向而行,12分30秒首次相遇.求甲乙两人每 若logaC+logbC=0,(c不等于1),求ab+c-abc的值 双生的反义词有 哪些?有意境的那种 请大家帮忙解释:“心祥宇泰”具体意思.谢谢! 已知a>1.b>1.c>1,且lga+lgb=1.求证:logaC+logbC>4lgc 一个x霍的词语我是帮同学问的,“x霍”是一个词语,X是一个字(不认识所以用x代),这个字提手旁,然后同学说 提手旁右边好像是点,四横,一竖谁知道这个词语,请在回答里打出来告诉我, 高一数学平面向量,有答案,并且已照只是看不懂我用红笔画的地方,不应该是4等于a2+b2-2abcosc吗? large的ar的发音是什么 已知:a、b>1,0 如何用一微安表同时改装成一档电流表和电压表 西安事变发生后,中共提出了什么解决方针?中共的出发点是什么 赖的部首 红笔画出部分如何得到的? 如图,已知:∠A=114°,∠1=66°,求证:AD//CF 以《路人》、《曲折的故事》为题的作文各一篇,800字 红笔画出部分是怎么得到的 如图,已知AD//CF,角C=角D,角B=角E,求证AB//EF 望岳这首诗中,诗人自我期许,展示他雄心和气魄的诗句是【】 一个20兆的光纤,这个20兆具体是什么意思? 意思相同但还是反义词的成语 月亮的月加个水井的井读什么? big 是神马意思? 成语及含义、同义词、反义词、造句要有含义、同义词、反义词、造句 多多益善 井字是什么偏旁 surprise motherfucker是神马意思 若loga(π-3) 已知点A(8,0),点P在第一象限,P的坐标为(x,y),且2x+y=10,设三角形OPA的面积为S,求S与x之间的函数解析式和x的取值范围,并求当x=3时,S的值.关键是求S与x之间的函数解析式.我已经开窍了. lx+2l+[y+3]平方=06xy平方-[3x平方y-{2x平方y-xy}] 若a,b为不等于1的正数,且a<b,试比较loga 1∕b,loga b,logb 1/b的大小 已知点A(4,0),P(x,y)是第一象限y=2x图像上的点,△OPA的面积为S,写出y关于x的函数 100m光纤到家庭 改和赖是怎么偏旁 如图,点P(a,b)是第一象限内在直线y=x-3上的点,又已知点A(0,4),△AOP的面积是S.(1)写出用b表示a的代数式;(2)写出S关于b的函数解析式及定义域;(3)如果△AOP的面积为10,求点P的坐标好的追 是入到楼内还是每户家庭内?现在新建小区都有光纤入户吗? y=(4∧x)+(2∧x+2)+5 (求函数的值域) 有关几何概型已知半径为的圆及圆内接三角形求下列情况的概率.1、在圆内任取一点,以该点为中点的弦长超过内接正三角形的边长.2、在圆周上任取两点连线的弦长不超过内接正三角形的边 已知函数f(x)=x的三次方+ax的平方+bx+c,g(x)=12x-4,若f(-1)=0,且f(x)的图像在点(1,f(1))处的切线方程为y=g(x),求函数h(x)=f(x)-g(x)的单调区间 函数y=x^(5/2)的值域是 已知函数y=1/2x+3和点A(2,0),在直线y+1/2x+3上找一点P使S△AOP=4求P点的坐标. 我是中国人怎么说英语 goldwave的多普勒怎么增加时间默认的就到40秒、怎么加时间? 怎没才能提高作文水品 我们是中国人怎么说 用英语 帮我翻译英语可能是自已放不下,他有什么放不下的呢?也许是自已自作多情吧啦 几何概型什么意思 关于时间的四字词语,要可以用诗的题目 索额图与明珠为什么会被称作“索相”与“明相”明朝和清朝当时己都不设宰相 京东方A的A代表什么意思 在△ABC中,∠A-∠C=35°,∠B-∠A=5°,求∠B的度数 多普勒三大定律是什么?能做什么呢 境界的反义词快,急,一定要有 求不定积分, 已知abc均大于1,切logaC乘以logbC=4,求证:ab大于等于c 意境的反义词 △ABC三边比为2:4:3,周长为18cm,求△ABC三边长,并问这三边上对应高之比为多少主要是后面那个问、 设a,b,c均为大于1的正数,且a乘以b等于10.求证,logac+logbc大于等于4lgc 高度的反义词是什么? 六年级列方程应用题5 道谢谢帮忙 英媒称斯诺登一机密文件披露美监听35第九届北京—东京论坛26日在北京开幕欧洲多国一致声讨美国监听事件 默克尔希腊疑遭拐卖女童证实身份 其母曾企图国际新闻早报:日本发生7.1级地震马凯会见欧盟委员会主席巴罗佐美媒力赞英国查尔斯王子 称其眼见高过英国王储查尔斯否认说过“当国王像蹲监俄学者:不要对伊核谈判前进步伐抱过高小偷夜闯国务卿克里家车库 美警方调查中欧推动世贸组织在MC9上达成早期收李某某案31号二审开庭 受害人心情未《三国演义》连环画法文版在法国上架马凯会见比利时首相迪吕波沃尔玛3年欲设新址110个查尔斯不想当国王? 英媒爆王储担心被《中国人看白俄罗斯》首发 获赞民间外希腊疑遭拐卖女童证实身份 其母曾企图英国王储查尔斯否认说过“当国王像蹲监韩调查显示 面试官平均14分钟决定是日媒称4架中国军机同一天越过冲绳飞向竞彩受注赛事一览大家快来看梅西!英意大战,萌宠咋选?屌丝的逆袭?!巴西,爱并抗议着“军刀”霍霍欲砍“瓜”谁是MVP?没了大刺头,雄鸡要高歌高潮来得如此之快“魔兽”肆虐?!乡村小子内马尔王志文孙俪获视帝视后明年底形成10家大型乳企一粒乌龙,让我爱死你21家医疗机构违约违规被查处你的回眸,让我乱了阵脚四省会大型仪器试验装备可共享在他们手中“活”起来了偶尔觉得委屈,后来理解他了黄毅清回呛黄奕:为无偿献血者提供更好服务
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘