瞎扯淡 Groupon 抛弃 Rails

newghost · 2013年10月11日 · 最后由 kgen 回复于 2013年10月12日 · 5996 次阅读

知名团购网站 Groupon 近日在官网宣布,目前 Groupon 已经完成了从 Ruby on Rails 向 Node.js 的迁移过程,这一过程历时 1 年之久。迁移后,Groupon 将成为全球最大的 Node.js 部署产品之一。

Groupon 工程师团队表示,迁移后,整体响应时间继续减少。Groupon 会在接下来的几个月中,逐步发布驱动其 Node.js 平台的相关库。

Twitter 在 2008 年将其业务后端代码从 Rails 迁移到了 Scala,而 Groupon 如今也抛弃了 Rails 架构,其原因大致相同——在大型系统的可扩展性和性能上,Rails 显得捉襟见肘。

在过去一年半的时间中,Groupon 的后端服务已经全面过渡到了 SOA(面向服务架构),并且在前端也应用了这这种模式。这样,每个团队可以只 拥有他们所负责的服务页面或应用,而不是有一个大型的应用程序,共享的逻辑已经被移到了服务和库中,以便团队只需专注于构建自己所负责的功能。

Geekon: I-Tier Today is exciting: we’ve completed a year-long project to move Groupon’s web traffic from our legacy Ruby on Rails application to Node.js. We’ve been working hard on this transition and have learned a lot along the way. Groupon will be one of the largest production deploys of Node.js worldwide. We’re currently serving ~50,000rpm and our overall response times have dropped dramatically. Over the next few months we’ll be releasing the libraries we used to power our new Node.js platform and we will be blogging stories about this intense transition.

Some history: Groupon started as a monolithic Ruby on Rails app. Over the last year and a half we’ve been transitioning to a service oriented architecture (SOA) for all of our back-end services. We applied the SOA design pattern to our front-end as well. Instead of having one large web application each internal team can own their own application that only serves the pages for which that team is responsible. Shared logic has moved into services and libraries so teams only need to focus on building the features that their teams own. Groupon is doing cutting edge work in mobile, with nearly 50% of our North American transactions completed on a mobile device in June. Our mobile applications use a JSON API, and our web applications now use the same API, allowing us to focus on maintaining a single contract for all of our consumer web data.

转自: http://ourjs.com/detail/525750fd0a44ef3c03000013

nodeJS 我不懂。但实事求是的讲,当程序规模很大时,java 语言层面上虽然没什么优势 (写过 ruby 代码再回去写 java 代码真是写的想哭,每天都要漱漱口,心情才会好些 ),但是其周边产品都非常多和成熟。你能想到的框架或者解决方案都已经有成熟的产品,反观 rails 还显得很年轻,单单靠几个 NB 的程序猿写的 gem(第三方库)是不够的,需要有更多的企业加入进来,改进并提高 ruby 和 rails,提高第三方库的质量。比如像 Rspec, sidekiq, devise 都做的比较好了,但还不够,需要更多。

我很好奇,ruby 打造 soa 服务,如何?

#1 楼 @outman 个人认为 Java 的性能也好不到哪去,有名的吃内存……

Ruby 或者说 Rails 的 omakase 在 SOA 确实有阻力,

显然大多是还是用 Rails,所以还是按 Rails 的来讨论:

Service

因为 ActiveRecord 包含了数据库的访问,所以没有 Plain Object,这样没法把 Model 作为 Gem 发布。因为 SOA 讲求 Service 接口(广义上的接口)之间的调用,比如 A 团队负责订单,他们提供 Order Service,B 团队负责支付,他们提供 Pay Service,那么他们内部可以访问自己相关的数据库表,对外提供 Service 接口,跨业务的访问都是调用对方的 Service。而 Service 调用后必然要序列化为 Model,这个 Model 应该由各相关业务团队提供的,里面可以包含非持久层访问的业务方法(即充血模型)这样其他团队可以使用(类似 Java 里的 POJO)。

Web

既然 SOA 了,Web 里就不会直接调用类似 ActiveRecord 的对象直接请求 DB,肯定调用 Service,因为肯定存在不同团队的 Web 跨业务调用其他 Service。其次整个 Route 方面也是分开了,每个团队的 Web 有自己的路由,xxx_path 这种,还有 Rails 根据 Resource 和 Route 的关系派发到 Controller 肯定要绕弯子了。整体上看访问方面需要有一个总的反向代理能将请求派发到不同 Web 上。

当然其实还有很多问题的,基本上原本的 Rails 优势都没了。真的要做 SOA 也是可以的,只是这样,就不需要 Rails 了,需要搞出符合 SOA 的 Stack。

rails 不是用来大型团队协作的,是用来一个人掌控全局的,最适合个人或小型团队创业,创大了转到别的技术平台是自然而然的事。

不过,还没创业就考虑负载、性能这些问题,是蚂蚁站在大象的角度思考。

#4 楼 @kenshin54 对的,就是这问题,确实需要用 ruby 打造一套 soa stack.我知道国内已经有公司再尝试了,感觉还不错。 另外为什么老是拿 nodejs 和 rails 比?为啥不拿 nodejs 的一个框架来比呢?比如 express 和 sinatra?

到了大型团队的时候,到时候用什么技术,很多程度都是政治因素了。从微软新请来个老总,不懂 Rails,你说用什么技术。。

现在看,Robbin 那篇‘去 Rails 化的’神文真有远见啊。

9 楼 已删除

对于创业公司来说,采用 Rails 确实能带来快速的开发效率;但是系统规模和 PV 上去之后,Ruby 和 Rails 的性能问题确实就凸显出来。

ruby 其实性能很好,尤其是字符串处理,程序慢多是不会写程序或者架构有问题。快速开发往往也会不管三七二十一引入大量的第三方库,不管用什么语言,规模上去都会有性能问题

并不是 rails 不适合大团队,而是人力资源多了开发效率的重要性就降低了

#10 楼 @luikore 完全赞同,我一直都相信 Ruby 或者 Rails 根本不是系统瓶颈,大型系统的瓶颈几乎全部都出在子系统之间的通讯上。

#10 楼 @luikore 是的,实际上瓶颈不在语言层。

#10 楼 @luikore 你不就在 groupon 么

顺便吐槽下 SOA,架构转向 SOA,整体复杂度上升,包括测试,联调,业务对接,监控都会上好几个难度。

真相是这样的 前期加入了大量的 rails 工程师,在上市后,手里期权都变现了,卖掉离职玩去了。 然后,公司里面没有 rails 工程师了,然后,就换 node 啦!

PHP 倒是有大型公司在用,Rails 真的是系统大了没法维护。

#16 楼 @jimrokliu 维护 PHP 比维护 Rails 方便?

维护 js 想想就觉得好疼

#17 楼 @fengkuok PHP 没有用过,不过 Facebook 倒是用的蛮高兴的。

ruby 在面对高并发,复杂事务运算性能确实中下。 可以将最复杂的业务用更高效的语言重写 (我的经验是如果能将性能最差的前 10-20% 的功能重写,基本上整个系统性能能大大改善)。

#19 楼 @jimrokliu facebook 用 php 用得很不高兴,不过积重难返,只能从重写 VM 下手,几年搞了 N 个不同的 jit PHP VM, facebook 的原 CTO 自己创业搞 quora 就跳过 php 直接选了 python.

比较讽刺的是,能算 php 半个爹的 yahoo 现在也在转型 node.

大型系统的选型并不是因为性能或易用性,而是为了符合当前开发团队的协作模型。

#11 楼 @lgn21st 到这个程度,如果不能很好的协调的话(没有相对应的人),用 rails 也不太合适了。

#24 楼 @googya 你说的没错,之前 Twitter 换用 Scala 改善后端系统,但是后来 Yammer 好像也转 Scala 但是因为团队开发的关系以及招聘上的原因,又退回到了 Java,道理是一样的。

@kgen 说的对

大型系统的选型并不是因为性能或易用性,而是为了符合当前开发团队的协作模型。

其实更重要的是 是 Rails 让 Groupon 和 Twitter 成功了

有空用 Node,不如直接用 java 算了。写 SOA 的话,没有 web 或者客户端的一些很繁琐的细节要处理。只关注功能的话,ruby js 的表达力强未必有多少优势。

才有几个 rails 创业个人 or 团队做到 groupon 那个流量那个规模? 等你到了那个地步,估计开心的自己姓什么都忘了,还会在乎用什么语言 or 框架?

#6 楼 @small_fish__ node 下的 web 框架和 rails 都不是一个水平线的。而且主要目的是产生 json 的话,老实讲用不用 web 框架都无所谓。Rails 里面 ActionView ActionPack 是整个框架的代码大头,例如只返回 json 的话,ActionView 就没了,那么基本上整个 Web 框架的 60% 代码都可以不需要了。如果后台 ORM 又不是在 Web 框架里面的(Java 和 Node 的 web 框架默认都没有 orm 这些东西),那么基本就只剩下语言和自己定义的库了,此时根本不需要用什么通用的 web 框架。

#30 楼 @swachian 我上面说到了,比如 express 和 sinatra 比较才算比较公平。。

#16 楼 @2vive 这个解释,我喜欢。。

1 楼不喜欢 java 可以用 groovy,语法层面会改善很多。 语言之争多了去了,比如说我就不太了解(喜欢)ruby,coffescript,sass 这一系列的语法,而更喜欢 groovy + javascript + less 的组合。

当然这些说多无益,还是要看团队和生产力。

等有 groupon 的规模再考虑这种事情吧

瓶颈往往不在语言。

#33 楼 @jeff_duan 个人口味问题,想什么用什么,但是到了一个团队,考量的东西就多了,选择就不能只依个人喜好

匿名 #38 2013年10月12日

昨天看到相关的新闻,果然坛子里也会有相关的帖子,然后就等待@luikore大牛出现

创业初期,人力成本占公司成本比重大,随着业务量增大,服务器,带宽的成本增加应该是大大超过人力的增速,而降低这个成本最有效的办法就是采用更好的计算架构,增加的人力很大一部分就是为了这个目标招聘的,像 facebook 就直接改进了 php

其实 ruby 社区没有更贴合 SOA 架构风格的 stack 可能是个很重要的技术因素 cc @luikore

... 其实我在的 team 是用 rails 的。关于 itier 的更多细节那个博客今后会逐渐放出。

#41 楼 @guotie 哈哈,我自己设计的~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号