飞天发布时刻:2024年 Forrester 公有云平台Wave™评估报告解读 了解详情
写点什么

Whitepages 的架构变迁:从 Ruby 到响应性更好的 Scala 和 Akka

  • 2014-08-26
  • 本文字数:1609 字

    阅读完需:约 5 分钟

Whitepages 是位于美国的一家公司,主要负责提供个人和企业的联系信息,供用户搜索。其业务每个月要服务 5000 万独立用户,每天要完成 3500 万次搜索。其移动产品每个月也有超过 1800 万的活跃用户。

随着业务的增长,Whitepages 的架构出现了瓶颈。经过评估,开发人员将出现瓶颈及代价较高的部分从原来的 Ruby 语言实现迁移到了更为现代、响应性更好的 Scala 语言和 Akka 框架。Whitepages 的开发人员 John Nestor 和 Dragos Manolescu分享了他们的经验。

在介绍了公司要应对的业务规模之后,他们提到了 Ruby 遗留系统存在的问题:

  • 较高的延迟
  • 较高的资源消耗,包括内存和处理器两个方面
  • 对于上游服务的降级支持较差
    • 并发能力有限
    • 当阻塞在较慢的上游服务上时,工作线程会饥饿
    • 连接管理和恢复能力不佳

之所以选择 Scala,是因为这门语言具有如下优点:

  • 优雅地结合了函数式编程范型和面向对象编程范型
  • 静态类型系统
    • 类型推导可以避免编写大量的 Java 样板代码
    • 编译器可以捕获很多错误
  • 运行在 JVM 上
    • 速度快
    • 几乎可以无缝地与 JVM 库互操作
    • 相当成熟的工具支持
  • 基于 Actor 的并发框架——Akka

Whitepages 的响应式服务的特点:

  • 面向服务的架构:通信采用 Thrift 或 HTTP 上的 Json
  • 延迟和吞吐量非常重要
  • 对日志和监控有很高的要求
  • 敏捷的开发、测试、构建和部署流程

在使用 Scala 和 Akka 迁移了服务之后,改进非常明显。

Service

p50 ms

p99 ms

throught RPS/core

DirSvc - Scala

25

300

80

DirSvc - Ruby

140

1200

7

他们先从 1 个单一的后台服务入手,现在已经完成了 4 个服务的迁移;还有 6 个服务尚在开发之中。Scala 开发人员也从最初的 6 个增加到 20 个。未来他们还将迁移更多服务。

他们总结的成功经验主要有以下几点:

  • Scala 简洁的语法提高了开发效率。
  • 异步代码提高了性能。
  • 不可变集合和函数式编程减少了 bug。
  • 强类型检查也有助于减少 bug,并使代码的可维护性更好(不过元编程变困难了)。
  • 并发能力提高。
  • Spray 具有极好的性能,而且提供了一个异步 API。
  • SBT 能够根据需求轻松定制,尽管学习曲线有些陡峭。
  • IntelliJ IDEA 对 Scala 的支持非常好。
  • Typesafe 的开发者支持合约非常不错,Typesafe 反馈非常快,对复杂的问题也可以给出很好的答案。

当然,迁移过程中也遇到了不少问题,比如:

  • 差劲的文档,SBT 就是个典型,很多时候还不得不阅读 Scala 和 Akka 库的源代码。
  • API 不稳定,升级步子太大。
  • 缺乏好用的并发构件分析工具:尝试过 Typesafe Console,但是一直没有完整地跑起来,最后放弃;虽然有些新工具,但没有时间一一评测。
  • 生态系统不如 Java,缺乏一些所需的组件;有时候选择太多,比如 Json 库就有 10 多款;GitHub 上存在大量的 Scala 项目,但质量参差不齐。
  • 难以调试,尤其是异步代码和 Actor。
  • 语言和库的问题:类型擦除是一个主要缺陷;Actor 缺乏类型检查;某些 Scala 代码看上去简单直观,但是要了解其背后的机制也非常困难。

不过整体而言还是利大于弊,Scala/Akka 非常适合构建响应式系统。

最后,他们讲到了开发人员这个关键因素。有经验的 Scala 开发人员还不够多。所以他们一方面招聘 Scala 开发人员,一方面培训现有的 Ruby 开发人员,促其转型。

更多细节,可以观看讲座视频下载讲稿

Whitepages 并不是第一家尝试从 Ruby 向其他开发语言迁移的公司。Twitter 早在 2011 年就开始从Ruby 向Scala 和Java 迁移 Iron.io 从 Ruby 迁移到 Go ,服务器从 30 台减少到 2 台。 LinkedIn 从 Rails 迁移到 Node ,服务器减少了 27 台,速度提升高达 20 倍。

项目创建初期,开发效率往往是首先要考虑的,以保证产品尽快推向市场。而随着业务规模的扩大,性能、可伸缩性方面的需求又会凸现出来,上述几家公司都选择了切换编程语言。亲爱的读者,您对此有何见解呢?欢迎和我们分享。


感谢郭蕾对本文的审校。

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

2014-08-26 07:074017
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 139.2 次阅读, 收获喜欢 35 次。

关注

评论

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

mybatis面试题及答案,尚硅谷java入门,专属于Java程序员的学习福音

Java 程序员 后端

MySQL优化原理分析及优化方案总结,Java入门

Java 程序员 后端

JVM虚拟机原理深入解析,springboot实战视频教程百度云,你不懂还不学?

Java 程序员 后端

kafka面试题阿里,牛客网面试题库java,农民工看完都会了

Java 程序员 后端

kafka教程pdf,spring入门教程,你会的还只有初级工程师的技术吗

Java 程序员 后端

linux学习笔记,springboot前后端分离教程,我先收藏为敬

Java 程序员 后端

mybatis入门案例,图灵学院第三期视频百度云,阿里中间件

Java 程序员 后端

JVM面试题附答案,Dubbo高频面试题+解析

Java 程序员 后端

kafka实战最佳经验,牛客网华为机试题答案,Java开发面试问题

Java 程序员 后端

linux基础教程试题,linux驱动程序开发视频教程,netty入门与实战

Java 程序员 后端

MyBatis整体架构分析:牛客网字节跳动面试,你连原理都还没弄明白

Java 程序员 后端

kafka入门与实践百度云,牛客网平安科技,和快手大牛的技术面谈

Java 程序员 后端

kafka入门教程,linux教程第四版pdf下载,mysql基础教程

Java 程序员 后端

linux内核教程推荐,尚硅谷mysql,一文轻松搞定

Java 程序员 后端

mysql的面试题及答案,尚硅谷与达内哪家好,Java虚拟机学习集锦是我攒来的

Java 程序员 后端

Mycat和Mysql搭建高可用企业数据库集群,程序员35岁真的是分水岭吗

Java 程序员 后端

mysql数据库优化面试,孙鑫java视频教程百度网盘,程序员必学

Java 程序员 后端

netty实战pdf,拉钩教育java就业集训班,Java开发热门前沿知识

Java 程序员 后端

linux基础入门知识,kafka入门教程步骤,2021年Java网络编程总结篇

Java 程序员 后端

linux应用开发面试题,极客时间破解付费课程百度云盘,Java面试官

Java 程序员 后端

kafka入门教程,springboot高级教程,聊聊你对分布式锁技术方案的理解

Java 程序员 后端

Mybatis-plus常用API全套教程,springcloud实战视频

Java 程序员 后端

linux应用开发面试题,java黑马程序员资源,如何保证redis高可用

Java 程序员 后端

Mybatis-Plus的使用小技巧,linux数据恢复教程,Nginx面试

Java 程序员 后端

mybatis总结,java思想编程百度网盘,Java开发工程师常见面试题

Java 程序员 后端

MyBatis整体架构分析:腾讯笔试牛客,阿里程序员的Java之路

Java 程序员 后端

Kafka必须掌握的核心技术,尚硅谷java入门,Nginx面试

Java 程序员 后端

linux内核教程推荐,兄弟连尚硅谷,顺利收获Offer

Java 程序员 后端

netty架构图,linux教程视频,缓存+一致性哈希+分布式面试题

Java 程序员 后端

MySQL+Tomcat+JVM,看完还怕面试官,阿里程序员的Java之路

Java 程序员 后端

mysql基础教程视频,牛客网中级项目异步队列,这操作真香

Java 程序员 后端

Whitepages的架构变迁:从Ruby到响应性更好的Scala和Akka_Ruby_臧秀涛_InfoQ精选文章