AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

移动后端支持平台 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:453172
用户头像

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

关注

评论

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

全新体验:借助海外云手机畅玩TikTok

Ogcloud

云手机 海外云手机 tiktok云手机 电商云手机 跨境云手机

一“云”在手,监控无忧——为何一个观测云即可满足全方位监控需求

可观测技术

可观测性

图像处理-Java-OpenCV-水印编码/解码

alexgaoyh

OpenCV java 数字版权保护 图像水印 基于离散余弦变换

v1.8.1🔥httpsok一分钟搞定SSL证书自动续期

物有本末

运维 SSL证书 免费SSL证书

Linux查看文件内容常用命令

霍格沃兹测试开发学社

从ESB总线到iPaaS集成平台,如何选择最佳集成方案

RestCloud

ESB 系统集成 ipaas

IT驻场外包能提供哪些类型的服务?

Ogcloud

IT IT外包 IT外包公司 IT外包服务 IT驻场外包

iOS全局自动化代码混淆工具!支持cocoapod组件代码一并混淆

雪奈椰子

探索TikTok云手机在社交媒体营销的作用

Ogcloud

TikTok 云手机 海外云手机 tiktok云手机 tiktok运营

观测云产品服务引领监控观测服务新高度

可观测技术

COB封装小间距LED可在哪些领域发挥潜能?

Dylan

技术 cobra LED LED display LED显示屏

如何在 Windows 系统电脑中安装 CentOS 7 虚拟机

霍格沃兹测试开发学社

【FAQ】推送获取push token报错6003,如何排查?

HarmonyOS SDK

HarmonyOS

Spring多线程事务处理

快乐非自愿限量之名

数据库 spring 多线程

体育赛事直播平台的市场集中度和差异化程度,有这些特点

软件开发-梦幻运营部

Graph+LLM 更进一步|悦数图数据库推出 AI 知识图谱构建器及图语言生成助手

最新动态

低代码的高性价比,企业:嘎嘎香!

EquatorCoco

低代码 企业开发 项目开发 企业转型

AI时代的API新经济:程序员如何利用API轻松实现月收数万?

幂简集成

API 接口 API 策略 API创新

今天来聊聊Hybird app技术

FinFish

小程序容器 跨端框架 Hybird App Hybird开发

走进甲骨文云服务器:打造专属的云资源管理空间

Geek_2d6073

观测云赋能云计算服务商,提升监控观测服务价值与竞争力

可观测技术

Linux常用统计命令大全

霍格沃兹测试开发学社

革命性创新:聚道云软件连接器如何为企业重塑财务管理流程?

聚道云软件连接器

案例分享

图像处理-Java-以图搜图

alexgaoyh

Java lucene OpenCV 以图搜图 KNN算法

Vue常用指令-条件渲染(v-if)

霍格沃兹测试开发学社

低代码与AIGC实战:引领软件开发的新风潮

不在线第一只蜗牛

低代码 AIGC

灰度发布难以追踪?你可能用错了工具

观测云

可观测性

《实现领域驱动设计》-聚合

不在线第一只蜗牛

DDD

“仍有 5 亿人坚持用 QQ”;马斯克:本周开源 xAI 人工智能助手丨 RTE 开发者日报 Vol.162

声网

深入理解 Nginx:原理和基础介绍

霍格沃兹测试开发学社

甲骨文云中的区间管理:从基础到策略

Geek_2d6073

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