写点什么

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

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

关注

评论

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

微软安全更新指南新增安全公告标签,强化漏洞管理透明度

qife122

微软安全 安全公告

云闪付联合HarmonyOS SDK打造更便捷安全的支付体验

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

书写不再“断片”!Pen Kit报点预测丝滑如真笔

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

创建南网特色科技成果转化生态中枢——南方电网创新加速器首期路演活动成功举办

新消费日报

高性能通知系统架构设计与运维

俞凡

架构

基于YOLOv8的X光安检图像智能检测系统:八类违禁品/可疑物精准识别与实战部署

申公豹

yolo

干货:Gemini与jobleap.cn联动,一种邪修找工作的新方法,让你面试成功率立即提升500%!

Y11

求职 找工作 应届生 找实习

绕过使用__PSLockDownPolicy时的约束语言模式限制

qife122

PowerShell 约束语言模式

2025年 华为鸿蒙创新赛比赛流程 全攻略

万少

HarmonyOS

OpenAI GPT-Realtime 发布:支持 SIP、MCP、异步函数调用和副语言信息捕捉,但依然贵丨日报

声网

一步完成CalDAV账户同步,日历服务助力钉钉日历日程集中管理

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

网龙公布 2025 年中期业绩

财见

BigCache: Go 高性能内存缓存实现

俞凡

golang 架构

自控学习历程系列 自控维护经验总结(14)

万里无云万里天

工厂运维

大数据-82 Spark 集群架构与部署模式:核心组件、资源管理与调优

武子康

Java 大数据 flink spark 分布式

大数据-83 Spark RDD详解:特性、优势与典型应用场景

武子康

Java 大数据 flink spark 分布式

攻击性威胁情报:红队视角下的CTI实战应用

qife122

红队 威胁情报 攻击模拟

AI如何重塑网络路由与交换技术

qife122

人工智能 网络设备

使用Prodfiler优化eBPF编译器性能:零代码修改实现近2倍提升

qife122

编译器 ebpf profiling

为什么说jobleap.cn是最适合大学生找工作的App

Y11

求职 找工作 招聘 应届生 大学生

自控学习历程系列 自控维护经验总结(13)

万里无云万里天

工厂维护

地平线具身智能算法H-RDT斩获CVPR 2025 RoboTwin真机赛冠军

地平线开发者

自动驾驶 地平线征程6 机器人展会

极兔速递2025上半年经调整净利润同比大增147.1%

财见

搭建一面LED广告墙的总成本解析

Dylan

广告 LED LED display LED显示屏 LED屏幕

卡片一放,服务直达!实现信息零层级触达

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

HPE推出Mist智能体人工智能原生,加速推进自我驱动型网络运维

科技热闻

新手必看:如何使用问小白生成mp.jobleap4u.com站点简介(含精品prompt分享)

Y11

求职 找工作 招聘 应届生 大学生

开发者说|H-RDT:基于人类操作数据的跨本体机器人学习

地平线开发者

自动驾驶 算法工具链 地平线征程6

AI中的潜意识学习:大语言模型隐藏的安全隐患

qife122

神经网络 AI安全 潜意识学习

Node.js HTTP请求走私漏洞利用(CVE-2025-23167)

qife122

node.js 网络安全 漏洞利用

2000年模糊测试技术在Windows系统中的重现与安全影响

qife122

漏洞挖掘 模糊测试

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