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

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

考虑效率

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

  • 业务复杂度(组织性):随着业务的复杂,我们的代码会不会最终无法驾驭?无法维护?无人能懂?
  • 性能提升度(潜力):随着业务的增长,压力的提升,我们会不会最终被迫放弃现有的技术架构,重头开始?
详细信息可参阅《 技术选型:效率至上与实用至上》。

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



下面来看看大型互联网公司的产品是如何选择技术栈的。该数据来自 维基百科,这是根据网站的HTTP头信息和文件类型所统计的。

网站前端后端(服务端)数据库
Google.comJavaScriptC、C++、Go、Java、Python、PHPBigTable
Facebook.comJavaScriptPHP、C++、Java、Python、FBML,Ajax,Erlang、D、XhpMySQL
YouTube.comFlash、JavaScriptC、Python、JavaMySQL
YahooJavaScriptPHPMySQL
Live.comJavaScriptASP.NETMicrosoft SQL Server
MSN.comJavaScriptASP.NETMicrosoft SQL Server
Wikipedia.orgJavaScriptPHPMySQL,MariaDB
BloggerJavaScriptPythonBigTable
BingJavaScriptASP.NETMicrosoft SQL Server
Twitter.comJavaScriptC++、Java、Scala
Wordpress.comJavaScriptPHPMySQL
Amazon.comJavaScriptJava、J2EE、C++、Perl
eBay.comJavaScriptJavaOracle Database
Linkedin.comJavaScriptJava、Scala


五、写在最后

技术栈是产品的根基,是产品功能和用户体验的保障。每种编程语言和技术都有存在的理由,且这些技术栈都经过了时间和大型项目的验证,但这并不代表别人能用你就也能用,还需要根据产品、团队、市场等因素选择最适合的技术栈。所以,在技术栈的选择上,可以说没有最好,只有最适合。希望本文列举的这些公司的案例能够为你带来一些参考。
  • 大小: 30.6 KB
  • 大小: 17.8 KB
  • 大小: 26 KB
  • 大小: 57.3 KB
  • 大小: 14.9 KB
  • 大小: 8.6 KB
  • 大小: 43.6 KB
  • 大小: 21.2 KB
  • 大小: 116.5 KB
  • 大小: 101.7 KB
35
1
评论 共 8 条 请登录后发表评论
8 楼 新来的菜鸟 2014-02-10 17:56
7 楼 qixingbeidou 2014-01-04 17:44
6 楼 doccent 2014-01-03 22:16
多谢份享,受教了。
5 楼 quitgame 2014-01-03 17:44
好啊好啊好啊好啊
4 楼 zhangfortune 2014-01-03 15:38
如一楼所说淘宝的去IOE确实令人震惊。这么大的一个工程。2012年的双11获得了成功。支持下。今天我才知道gogole也用php这样差劲的语言,真有点不相信。
3 楼 allwefantasy 2014-01-02 21:46
果大大写的文章越来越精品了 赞一个
2 楼 qingyue 2014-01-02 21:14
技术栈是什么意思,求拍我。
1 楼 Tyrion 2014-01-02 16:33
淘宝能够完成去IOE确实令人刮目

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 对javaeye发发牢骚

    今天是个郁闷的一天,至少到现在为止我觉得好郁闷,因为robbin不停的吹捧...而是这里的技术气氛跟程序员的水平让我们这些菜鸟觉得我们来对了地方。 可自从javaeye2.0上线后,出现了很多小bug,有很多js错误, ...

  • 少发牢骚,多做事情..

    其实,只要你少发点牢骚,多做点事情就好了. 首先我不是什么高手,也不是专家.只是和大家一样都是一步一步走过来的. 我来讲讲我的经验. 我毕业河北农大,专科,还是分校... 学习不能说差,也不是很好.好在我追我女朋友...

  • 在学习Tapestry之前,先发发牢骚

    看看这个历史(来自javaeye): 1. 1999~2001之间EJB被各大厂商热炒 (IBM, Bea, Oracle, etc...) 2. 广告铺天盖地, Transaction, Security, Spec, Architecture, Remote procedure calls, Code reuse, Assembly...

  • 失业了,发下牢骚!

    还没有找到工作的各位兄弟姐妹们,咱也加入到这个庞大的队伍了! 在此激励下自己,希望能尽快找到工作, 也祝javaeye的博友们能找到心仪的工作,一起努力,相信自己。...

  • 我的帖被评为“新手帖”,发发牢骚

    也许我就认为它对我来说就是一个很难的问题, 但对于一些牛人来说, 可能就是小儿科, 当然这个牛人就可以理所当然的把这个帖子作为“新手帖”给处理了。。。。。。 其实没有人真在乎什么积分啊什么的,可是”新手帖...

  • 呵呵,我发牢骚,这么快就有人回应了,帖子没了!!

    呵呵,我发牢骚,这么快就有人回应了,帖子没了!!javaeye,工作积极,致敬!!(O(∩_∩)O~)

  • 因为JavaEye有你有我

    昨天看到下面这篇文章我很是感慨,也许真的是只有经历过,才真正懂得,还是那句话,我对你充满信心,也请你对我充满多点耐心。 许多人们可以牵着手一起逛街,为彼此精心挑选衣服,或是礼物;每一个...

  • javaeye被封后的一些思考和后怕

    javaeye被封后的一些思考和后怕 前几天百度查了个技术问题,javaeye的解决方法如以前一样排在了结果的前列,点击去后发现有违规内容网站被关闭了,第一反应就是很气愤,一个纯技术网站被干掉了,也不是教人怎么破坏...

  • JavaEye论坛热点推荐-2009年1月

    JavaEye论坛热点推荐-2009年1月 JavaEye论坛是JavaEye文章质量最高讨论最活跃的版面之一,我们为您总结了2009年1月份的论坛Java,AJAX,Ruby,综合技术和项目管理等热点文章,欢迎您也发表文章到论坛,并参与...

  • ROR I10N问题及关于javaeye论坛的一些闲话

    众所周知,javaeye是国内开发者知名论坛,因为昨天下了个Typo(ROR开源的weblog引擎),想打造自己的一个blog,因为没有看源码,大致跑了一下,首先想到的一个问题就是本地化(I10N),就到javaeye发了个帖子,...

  • 从所谓“IE6盒子模型”说起

    事情要从6月份锐商企业发的那篇《IE6 很邪恶,但我爱它的盒子模型》[1]说起,这篇文章已经被转了又转(Google的搜索结果相当多,百度倒是挺“干净”的),此文对于盒模型是这么描述的: “可以看出,IE6 盒子...

  • 在不确定的世界里,确定的当个程序员

    2.2 交流:输出点儿东西 在淡出论坛后(灌水太累, 论坛人多了噪声也多了),我写起了博客,技术笔记书评影评发牢骚都写一点,比如最近看了本什么好书,写了什么程序有啥心得,玩开源软件遇到什么坑,突然有什么...

  • 阅读前人的帖子,站在巨人的肩上,中国程序员的心路追寻

    javaeye和csdn上有很多牛和不牛的人分享自己的想法,我也总是喜欢把很老的帖子翻出来反复的读,喜欢对比历史和现在的状况,  站在前人和巨人的肩上,让自己少走N多的弯路。尤其是对新入职场不久的人来说特别...

  • 站在巨人的肩上,中国程序员的心路追寻

    JavaEye和CSDN上有很多牛和不牛的人分享自己的想法,我也总是喜欢把很老的帖子翻出来反复的读,喜欢对比历史和现在的状况。 站在前人和巨人的肩上,让自己少走N多的弯路。尤其是对新入职场不久的人来说特别重要,...

  • 办事拖沓人的七种习惯: 7 Habits of Highly Ineffective People

    导读: 就像通常有些对我们有益的习惯我们要培养一样,这里有7个你最好不要养成的坏习惯. 就像养成一些有益的习惯十分重要一样,你也要知道那些习惯是妨碍你的生活的。 人们在日常生活中很容易养成这些习惯,你几乎...

  • 企业2.0雾里看花

    希望我在javaeye的文章能够给大家一点启示。原文您也可以光临我的blog: www.wikidao.org   用一句话来定义企业2.0并不是件容易(甚至有意义)的事,但无论如何,本文至少试图让大家看到企业2.0 这朵“花”的轮廓...

  • 牛X是种态度(答复: 对于水平一般的程序员,技术要深度还是广度)

    如果“牛人”们能把发牢骚的时间放到有意义的事情上,我们可能会早几天用中文跟计算机打交道。 在国内的状况下,楼主要学会自我激励,不去鸟别人毫无信息量的话。再就是灵活运用搜索引擎,自己找想要的信息。另外...

  • 被隐藏的或许才是金子

    公开skylark计划的帖子,被无情的n个“隐藏”后,收到一个邮件,说被隐藏了。 还是挺失望。不过最后收到一个精华。...毕竟也就发发牢骚,对事不对人。一个成熟的勇者,更需要心胸和谋略。自我一下。 :D

  • setting.xml文件,修改Maven仓库指向至阿里仓

    setting.xml文件,修改Maven仓库指向至阿里仓

  • 基于java的玉安农副产品销售系统的开题报告.docx

    基于java的玉安农副产品销售系统的开题报告

Global site tag (gtag.js) - Google Analytics