写点什么

移动后端支持平台 Parse 将 API 由 Ruby 迁移到 Go

  • 2015-06-16
  • 本文字数:1856 字

    阅读完需:约 6 分钟

Charity Majors 是移动后端支持平台 Parse 的工程师。近日,他撰文介绍了他们将API 从Ruby 迁移到Go 的过程。

2011 年, Parse 借助 Ruby on Rails 快速推出了第一个版本。他们用 Unicorn 作为 HTTP 服务器,用 Capistrano 部署代码,用 RVM 管理环境,并用许多开源 gems 处理 YAML 解析、oAuth、JSON 解析、MongoDB 及 MySQL 等方面的工作。此外,他们还用 Chef 管理他们的基础设施。

起初,平台运行良好。但随着代码库的增长,部署时间越来越长,Unicorn 服务器无法很平稳地重启。到 2012 年底,他们有 200 个 API 服务器运行在 m1.xlarge 类型的实例上,每个实例 24 个 Unicorn 工作进程。该平台每秒需要为来自 60000 个移动应用的 3000 个请求提供服务。一次完整部署或回滚需要 20 分钟。另外,在通常的 Ruby on Rails 设置中,工作进程池大小固定,每个工作进程一次只能处理一个请求。随着 API 流量和应用数量的增加,“一个请求一个进程”的 Rails 模型开始无法满足平台的扩展需求,而增加数据库和工作进程也增加了故障点和性能退化的可能。

于是,他们认为,他们需要迁移到一个完全不同于 Rails 的异步工作模型。他们对比了如下选项:

  • EventMachine:绝大多数 Ruby gems 都不是异步的,而且许多不是线程安全的,所以经常很难找到一个库可以异步地处理一些常见任务。
  • JRuby:JRuby 从根本上说还是 Ruby,同样缺少异步库支持。而对于 Java,他们的后端或 Ops 团队不愿意部署和调优 JVM。
  • C++:他们现有的 C++ 代码已经难以调试和维护。与其它现代编程语言相比,C++ 开发的效率不是很高。C++ 也缺少一些他们需要的库,比如 HTTP 请求处理。C++ 可以处理异步操作,但并不好用。
  • C#:C#有最好的并发模型,并且支持 Async 和 Await。但真正的问题在于,Linux 对 C#开发的支持不够好,缺少一些与常用开源工具互操作的库。如果选择 C#,那么他们就需要对工具链做重大调整。
  • Go:同 C#一样,Go 也在底层内置了异步操作。MongoDB Go 驱动程序可能是现有最好的 MongoDB 驱动程序,而与 MongoDB 的复杂交互是 Parse 的核心所在。Goroutines 比线程更轻量级。

最终,他们选择了 Go,用它重写了 EventMachine 推送后端、核心 API 服务器,实现了 Rails 中间件的处理功能,结果:Parse 平台的可靠性提高了一个数量级;API 不再因为数据库和后端服务的增加而日益变得脆弱;由于去掉了大量的 gems 和隐含假设,代码库变得更干净;Ops 团队不用每周处理多次 Ruby API 故障了;预分配的 API 服务器池缩减了约 90%;移除了孤立的 Rails API 服务器筒仓,简化了架构;完整集成测试的时间由 25 分钟缩减至 2 分钟;完整 API 服务器部署(包含滚动重启)的时间由 30 分钟缩减至 3 分钟;Go API 服务器启动更平稳。

虽然 Parse 成功地实现了迁移,但是许多网友都认为 Majors 给出的选择理由并不充分。网友 pron 指出,JVM 易于监控、控制、调试和性能分析。在大多数情况下,JVM 调优只需要设置 GC 方式、最大堆大小和新生代比率三个值。对此,Majors 的答复是,“我们讨厌有关 Java 和 JVM 的一切”。网友 headius 则为 Parse 团队没有试用 JRuby 感到可惜,因为单个 JRuby 实例就可以处理成百上千的并发请求,而且不需要采用异步方式。他认为,JRuby 团队不需要重写就可以解决 Parse 的问题。网友 Zazi Bazuka 则这样评论道:

我讨厌这篇博文,攻击 Ruby 成了现在的一种趋势。但攻击总是来自不了解 Ruby 生态系统的人。为什么不使用 Puma 或其它多线程服务器?!为什么使用 EventMachine?互联网上到处都是不应该使用它的文章,你们应该使用 celluloid.io 代替它。

Majors 的文章在 Hacker News 上也引发了激烈的讨论,其中许多网友同样对 Parse 的选择过程存在疑问。网友 aikah 就表示:

当了解业务域和性能问题时,Go 是一个不错的迁移目标。但是,我不推荐初学者用它构建安全的 Web 应用程序,因为……Go 确实不适合用于传统 Web 站点的快速开发。让我吃惊的是,Parse 用 Rails 编码,我原以为他们以 Node.js 为基础构建,因为 Cloud Code 用了 JS。

对此,lacker 答复说:

我们考虑过它。那时,一个很大的 Node 代码库看上去很难维护。不过,工具比那时好了。如果我们现在重新讨论,我认为,采用 Node 的理由会更令人信服,如果我们等到 ES6 成为标准后再讨论,理由还会更充分。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-06-16 21:453449
用户头像

发布了 1008 篇内容, 共 423.7 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

一文了解openEuler SIG组角色划分与管理运作

openEuler

开源

简述机器学习库

穿过生命散发芬芳

机器学习 11月月更

MySQL能力全开放,OceanBase 社区版 4.0 正式上线

OceanBase 数据库

从1开始,扩展Go语言后端业务系统的RPC功能

闫同学

后端 go语言 11月月更

专访微盟CTO黄骏伟:WOS将为去中心化商业提供一整套数字基建

B Impact

圆满落幕!回顾 eBPF 技术的发展与挑战

OpenAnolis小助手

Linux 云原生 ebpf 云栖大会 龙蜥社区

跟着卷卷龙一起学Camera--信号采样01

卷卷龙

ISP camera 11月月更

Vue组件入门(十五)异步组件

Augus

vue3.0 11月月更

互联网安全体制的挑战与机遇

阿泽🧸

互联网安全 11月月更

StarRocks 技术内幕 | Join 查询优化

StarRocks

数据库

2022-11-03:给定一个数组arr,和一个正数k 如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号, 而且可以涂上1~k每一种颜色 如果arr[i] != 0,表示i这里已经确

福大大架构师每日一题

算法 rust 福大大

史海峰:成为技术领导者 从技术到管理的必经之路丨声网开发者创业讲堂 • 第 5 期

声网

技术管理 人工智能’

企业级业务架构设计:方法论与实践 学习笔记

程序员架构进阶

业务架构 TOGAF 11月日更 Zachman

设计模式之美-面向对象、设计原则、设计模式、编程规范、重构的关系

GalaxyCreater

设计模式

一次基于Fastjson的JNDI注入

网络安全学海

网络安全 安全 信息安全 渗透测试 漏洞挖掘

📢利用Vite插件助力证书安装

小鑫同学

前端 插件 11月月更

如何在知乎平台上做营销推广:推荐几种引流方式

石头IT视角

Ansible 部署的时候提示错误 SSH password instead

HoneyMoose

promise执行顺序面试题令我头秃,你能作对几道

loveX001

JavaScript

433MHz自发电无线控制器

不脱发的程序猿

物联网 嵌入式 无线通信 ​433MHz自发电无线开关

Linux中 dir 命令还能这样玩!

wljslmz

Linux 11月月更

跟着卷卷龙一起学Camera--MIPI 03

卷卷龙

ISP camera 11月月更

跟着卷卷龙一起学Camera--信号采样02

卷卷龙

ISP camera 11月月更

极速体验docker容器健康

程序员欣宸

容器化 docekr 11月月更

这样回答前端面试题才能拿到offer

loveX001

JavaScript

详解CAN总线:CAN总线通信优先级机制

不脱发的程序猿

汽车电子 CAN总线 详解CAN总线 CAN总线通信优先级机制 CAN优先级

设计模式之美-代码评价标准

GalaxyCreater

设计模式

我上了个假“中台”!

雨果

数据中台

从0开始,用Go语言搭建一个简单的后端业务系统

闫同学

后端 go语言 11月月更

从2开始,在Go语言后端业务系统中引入缓存

闫同学

Go 设计 后端 11月月更

js异步编程面试题你能答上来几道

loveX001

JavaScript

移动后端支持平台Parse将API由Ruby迁移到Go_Ruby_谢丽_InfoQ精选文章