写点什么

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:074140
用户头像
臧秀涛 略懂技术的运营同学。

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

关注

评论

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

AOP实现系统告警

Java aop spring aop 告警系统

大数据调度平台Airflow(二):Airflow架构及原理

Lansonli

airflow 9月月更

Elasticsearch聚合学习之五:排序结果不准的问题分析

程序员欣宸

elasticsearch 9月月更

项目进度delay怎么办

Ian哥

项目管理 项目进度 项目计划

【云原生 | 从零开始学Docker】九丶完结篇 Docker Compose

泡泡

容器 云原生 Docker 镜像 9月月更

户外服装品牌TheNorthFace遭遇撞库 撞库究竟如何成功窃取账户信息

郑州埃文科技

撞库 拖库 洗库

Qt|QGraphicsView总体架构学习

中国好公民st

c++ qt 9月月更

带你掌握如何使用CANN 算子ST测试工具msopst

华为云开发者联盟

人工智能 算子 CANN 企业号九月金秋榜

Java中的Request和Response详解

共饮一杯无

Request 9月月更 Response 请求与响应

最被夸大的6项技术

雨果

新技术

跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样

华为云开发者联盟

Python 人工智能 企业号九月金秋榜

2022 IDC中国未来企业大奖颁布,华为云数据库助力德邦快递获奖

华为云开发者联盟

数据库 后端 华为云 物流 企业号九月金秋榜

高性能 Java 计算服务的性能调优实战

vivo互联网技术

Java 缓存 性能 JVM 内存

性能测试知识科普(一):核心术语

老张

性能测试

Flomesh Ingress 的 SSL 透传

Flomesh

手把手教你:轻松打造沉浸感十足的动态漫反射全局光照

HarmonyOS SDK

移动开发 图像 Andriod 引擎

本地部署 VS 云服务

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

【云原生 | 从零开始学Docker】八丶Docker网络与部署redis集群

泡泡

Docker 云原生 9月月更

中智车联:用TDengine高效处理车辆运营可视化管理

TDengine

数据库 tdengine 时序数据库 企业号九月金秋榜

[极致用户体验] 为什么建议2022年不用"等比设计稿"+rem,而用"灵活设计稿"+px

HullQin

CSS JavaScript html 前端 9月月更

又创新作!阿里SpringBoot高阶手册爆火,简直不要太香!

收到请回复

Java 云计算 开源 架构 编程语言

String,StringBuilder,StringBuffer区别,竟有这么多不同

知识浅谈

string string buffer 9月月更

怎么开Scrum五大会议?

敏捷开发

项目管理 Scrum 敏捷

聊聊Kafka在生产实践中出的一个问题

Java永远的神

kafka 源码 程序人生 中间件 Java 面试

案例拆解:重要节日客情维护的礼品卡券应用

boshi

运营 礼品

FeatureStore meetup V4回顾|腾讯 & 微软 & 第四范式特征平台技术解析与应用实践

星策开源社区

机器学习 微软 特征平台 MLOps FeatureStore

终于大橘已定,分享一波测开面经(美团、小米、华为、阿里等)

Java-fenn

Java 程序员 java面试 Java学习 Java面试题

新消费时代,零售业的进与退?

华为云开发者联盟

中台 后端 开发 企业号九月金秋榜

数据科学公司Anaconda最新调研报告:40%因安全顾虑将减少开源软件使用

雨果

数据科学 开源软件

Java进阶(二十六)公司项目开发知识点回顾

No Silver Bullet

Java 9月月更

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