GMTC全球大前端技术大会(北京站)门票9折特惠截至本周五,点击立减¥480 了解详情
写点什么

从单体应用转为分布式系统:来自 Deliveroo 的实践

2017 年 3 月 20 日

过去一年中, Deliveroo 在商业和 IT 领域成长迅速,这导致它的大型单体应用面对不少的技术挑战。 Greg Beech 在近期的 QCon 伦敦大会演讲中指出,Deliveroo 对此问题的解决方案并非依靠微服务,而是向分布式转变。Beech 介绍了 Deliveroo 在从单体应用转变为分布式系统过程中的一些做法。

Deliveroo 公司创立于 2013 年,Beech 现任公司的首席工程师。公司起步于采用传统 Ruby on Rails 开发的单体应用,数据存储使用了 PostgreSQL Redis ,通过不断增大数据库规模而处理日益增长的业务。一年前,他们需要运行大约 20 台 Heroku 托管服务器。当前运行的服务器规模达数百台,这已成为 Keroku 上部署的最大规模应用,峰值情况下需要使用 1800 个内核和 3TB 的内存。公司由 2015 年的 10 名工程师已成长为 2017 年的近 100 名工程师,主代码库中的有效代码行达到约 60 万行。

采用单体程序架构是一个经过深思熟虑的决策,他们因此可以快速添加适合市场需求的特性,但是现在这种架构需要面对一些问题。由于当前单体程序的规模增长得很大,Deliveroo 受困于性能下降和构建时间增加的问题,构建时间已经从两年前的 7 分钟左右增加到目前的两个小时左右,进而延缓了开发的速度。大型单体程序也会导致可靠性下降,因为出现一个问题就可能使得所有的服务宕机。

Deliveroo 的解决方案是转向分布式,实现中采用了一种将单体程序切分为三大类“十二要素”(Twelve-Factor)应用的方法。这三类应用分别是领域服务(Domain service)、外围服务(Edge service)和客户端应用(Client apps for the UI),事件总线为这些服务提供了支持。

领域服务是:

  • 占有领域的重要部分。这些服务占有了领域的重要部分,这些部分只有紧密粘合在一起才具有作用。这就是 Beech 不喜欢称其为微服务的原因所在。
  • 暴露内部真实的 REST API,包括超媒体。
  • 从事件总线收发事件。
  • 可以使用其它域服务的 API。

外围服务是:

  • 不具有任何一部分领域。
  • 向外部暴露聚合的 API。
  • 从事件总线接收事件。
  • 可以使用其它外围服务和领域服务的 API。

在这种分布式解决方案中,不存在共享的数据存储。每个应用都具有自身的数据存储,除非存在例外情况,否则每个应用的数据存储是不能被其它的应用访问的。此外,所有数据是作为 REST API 方式暴露的,Beech 指出这是真正包含超媒体的 REST。举个例子,API 返回的集合(Collection Resource)是一系列到实体的链接,而非内嵌的对象。他同时指出,RPC 是不允许使用的。

在创建、更新或删除实体后,领域服务会通过事件总线发送事件,他们将这种技术称为“呈现状态通知”(RSN,Representational State Notification)。事件中从不包含载体,只是链接到事件相关实体。这样做的部分原因是出于避免总线成为数据损失的一个关键源头。但是一些非关键的不可变值对象是可以在消息中发送的,这是一种例外情况。

Beech 指出虽然 Deliveroo 对于服务如何构建、如何分层及如何通信给出了相当强有力的指南,但依然可以从简单处着手,按自己需要去演化成一个更为复杂的架构。这样做的目的在于,允许团队就像具有自身问题切入点和目标的初创公司那样运行,按团队需求演化自身的架构,并在分布式架构经验有限的条件下取得成功。

查看英文原文: Moving Deliveroo from a Monolith to a Distributed System


感谢薛命灯对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017 年 3 月 20 日 19:009325
用户头像

发布了 226 篇内容, 共 61.1 次阅读, 收获喜欢 17 次。

关注

评论

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

Flink + Iceberg 全场景实时数仓的建设实践

Apache Flink

flink

百度信息流和搜索业务中的弹性近线计算探索与应用 | 文末送福利

百度Geek说

Java 前端工程 算法工程师 技术宅

2年5个月13天,从外包到拿下阿里offer,没想到屌丝也能有今天

周老师

Java 编程 程序员 架构 面试

七面阿里成功offer,入职就是25k*16薪,还原我的大厂面经

云流

Java 程序员 面试

我国首个自主可控区块链软硬件技术体系发布

CECBC区块链专委会

区块链

android开发面试准备!Android高级工程师进阶学习,已开源

欢喜学安卓

android 程序员 面试 移动开发

阿里Java性能优化最佳实践指南全新发布!(编程、多线程、JVM、设计模式、数据库优化全都有)

程序员小毕

Java 面试 性能优化 JVM 数据库调优

推荐给所有程序员!这份“Netty最强宝典”你不服不行(实战+权威指南+项目+面试题库)

Java成神之路

Java 程序员 架构 面试 编程语言

京东资深架构师推荐学习6本实战文档:多线程+Redis+Nginx+MySQL+JVM....

Java成神之路

Java 程序员 架构 面试 编程语言

安卓驱动开发!系统盘点Android开发者必须掌握的知识点,搞懂这些直接来阿里入职

欢喜学安卓

android 程序员 面试 移动开发

十年运维经验总结出的智能运维系统落地方案

小术晓术

人工智能 运维 企业信息化 运维自动化 信息化

【Mysql-InnoDB 系列】幻读、死锁与事务调度

程序员架构进阶

MySQL 架构 innodb 事务 28天写作

Maintainer 聚光灯:KubeEdge 和 Volcano 的王泽锋

华为云原生团队

开源 边缘计算 开源项目 华为云 批量计算

深扒!用6部分讲完Java性能调优:多线程+设计模式+数据库

996小迁

数据库 JVM 设计模式 多线程 性能调优

个人信息严控的时代,AI如何实现“安全”的智能营销?

星环科技

大数据

首发10万字Mysql实战文档,几乎涵盖你需要的所有操作|超清PDF

Crud的程序员

MySQL 数据库

try-catch-finally中的4个大坑,不小心就栽进去了!

王磊

Java 异常处理 try finally

「产品经理训练营」第三章作业

Sòrγy_じò ぴé

产品经理训练营 极客大学产品经理训练营 产品训练营

为什么这么一道iOS小题目,这么多面试者搞不定?

Geek_24a3d9

面试题 技术交流 面试官 ios开发

是我太菜,美团四面+蚂蚁金服四面全部凉凉,太难了!!!

Java成神之路

Java 程序员 架构 面试 编程语言

产业区块链蓬勃发展 联盟链成为落地应用最大杀器

CECBC区块链专委会

区块链

程序员必知的几种限流方案

Java架构师迁哥

IntelliJ IDEA 20周岁啦,为期2天的周年庆活动对开发者免费开放

YourBatman

eclipse ide IDEA IntelliJ IDEA

IDEA Malformed argument has embedded quote

会飞的猪

IDEA

Spring Security 实战干货:分布式对象SharedObject

云流

Java spring 分布式

Elastic开源协议改了,用户怎么办?

星环科技

Android JNI模板与读取系统属性笔记

Changing Lin

android

“删库跑路”,这背后的数据安全你悟到了吗?

CloudQuery社区

数据库 大数据 数据安全 数据库管理工具 删库

数学,离一个程序员有多近?

小傅哥

程序员数学 谷歌公司数学面试题

DjangoRestFramework框架简介及基本使用

行者AI

RESTful

技术资讯 | 百度智能云拿下MTCS最高安全评级

百度开发者中心

行业资讯

从单体应用转为分布式系统:来自Deliveroo的实践-InfoQ