把握行业变革关键节点,12 月 19 日 - 20 日,AICon北京站即将重磅启幕! 了解详情
写点什么

Yelp 研发实践:使用服务拆分单块应用

  • 2015-03-27
  • 本文字数:1811 字

    阅读完需:约 6 分钟

Yelp 工程师团队表示,面对团队和代码库规模不断增长的情况,他们通过实践向面向服务架构迁移,得以使开发过程同步具备扩展能力,并且保持了快速的软件交付。这一切取决于以下因素,包括对团队灌输分布式系统的理念,创建一组基本的服务设计原则,定义服务接口规范,实现可扩展的测试方法,将对数据存储的访问封装到各自的服务接口中,同时部署一个健壮的服务发现方案。

Yelp 工程师团队在博客中表明他们很看重快速交付代码的能力。他们需要不断地进行生产系统的变更,而且这种频繁变更需要常态化保持,即便开发团队已经增长到300 人以上,Python 代码库规模也超过了几百万行。能够确保这样迭代速度的核心因素恰恰就是转向了面向服务的架构(SOA)。在过去的三年里,Yelp 工程师团队已经研发并在生产环境部署了超过七十个各式服务。

Yelp 工程师博客提出,构建面向服务的架构会迫使程序员应对分布式系统需要面临的现实挑战,例如需要面对系统部分失效以及代码由不同的团队开发的情况。Yelp 尝试采用一些手段去缓解这些问题,例如参考 Netflix Twitter ,实现并管理一套底层的基础研发平台。然而,Yelp 工程师团队还是提出,程序员只能靠自己去理解系统需要面对的这些现实问题,任何其他东西都帮不上忙。

Yelp 工程师团队倡导用多种技术手段在团队间扩散知识,包括建立一套编写和维护服务的基本准则,建立每周服务专题的例会,程序员可以自愿参加并提问探讨,同时通过咨询有过惨痛教训的人,从而帮助工程师团队从错误中汲取经验教训。

Yelp 的大多数内部服务都是以 HTTP 的方式暴露接口,并且传递的数据结构采用 JSON,这样既有优点也有缺点:

我们使用 HTTP 和 JSON 是一种折中的选择。使用标准化 HTTP 协议有一个巨大的好处,那就是可以使用业内成熟优秀的工具去调试、缓存和负载均衡。而最显著的缺点是在不考虑数据接口实现的情况下,没有标准的方案去定义服务的接口(这一点与 Thrift 这样的技术不同)。这样使得定义和检查接口变得很困难,并且会导致很糟糕的缺陷(“我原以为你的服务应该返回‘username’字段?”)

Yelp 工程师团队通过使用 Swagger 解决了以上问题。Swagger 是基于一套 JSON Schema 标准构建的,它针对 HTTP/JSON 服务接口提供统一的文档描述语言。 Swagger UI 则可以用来提供一个所有服务的集中式目录,允许所有 Yelp 开发团队成员检索已有的服务,避免重复发明轮子。

Yelp 工程师在博客上同时探讨说,对服务自身的测试应当采用标准的方法,包括单元测试和使用模拟对象集成测试。然而,跨服务的测试可能需要复杂的编排协调。Yelp 使用 Docker 容器快速提供私有的服务测试实例,包括数据库实例。核心的想法是服务的研发团队有责任发布自身服务的 Docker 镜像,供其他服务开发人员可以将这些服务置为依赖项,并在对其他服务进行验收测试时使用。

Yelp 服务中有很大一部分需要对数据进行持久化,工程师团队使用了 MySQL、Cassandra 和 ElasticSearch 的组合。Yelp 工程师在博客上说,无论数据库存储选用什么产品,底层的实现细节只需要服务自身了解。这种做法能够使服务作者拥有长期的灵活度,可以随意更改底层数据的表述方式,甚至是改变整个数据库。

面向服务架构的一个核心问题是如何发现其他服务实例的位置。Yelp 使用了 AirBnB 的 SmartStack 服务发现机制,将服务发现的问题从应用自身中脱离出来,交由其他独立进程来解决。SmartStack 包含两个进程; Nerve 用于服务注册,Synapse 用于服务发现。Yelp 研发团队在博客上说每一个服务节点都运行着一个绑定本地节点的 Synapse HAProxy 实例。HAProxy 负载均衡会读取 Nerve 在远程 Zookeeper 上服务注册的信息,并动态配置服务路由。这样一来,本地的负载均衡器可以将服务请求路由到其他健康的服务实例上,从而使一个服务可以连接其他额外的服务。

Yelp 工程师在博文结束时表示下一代名为 Paasta 的服务平台研发工作已经开始,项目会使用 Apache Mesos Marathon 框架的组合,在集群机器之间分配容器化的服务实例。关于这个项目的更详细的内容将于今年晚些时候在博客上发布。

在Yelp 官方博客上,大家可以找到更多关于 Yelp 开发团队使用服务分解单块应用的细节。

查看英文原文 Yelp Engineering: Using Services to Break Down a Monolith


感谢赵震一对本文的审校。

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

2015-03-27 02:203304

评论

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

华为云VPN为企业数据上云保驾护航

爱尚科技

架构训练营 模块四

张建闯

架构实战营

轻松解决企业数据高延时,华为云全球加速GA使用更灵活!

科技之光

华为云大数据BI赋能企业数字化发展

i生活i科技

5分钟搞懂分布式可观测性

俞凡

架构 微服务 最佳实践 云原生

前端工程师leetcode算法面试必备-二分搜索算法(下)

js2030code

JavaScript LeetCode

远程办公小助手——华为云虚拟专用网络VPN

爱尚科技

耳东的2022 年度总结

耳东@Erdong

年度总结

从非洲到全球,看华为云连接CC如何助力出海企业更好发展

科技之光

红海竞争下,华为云CDN凭借什么冲出重围?

i生活i科技

CDN

华为云弹性云服务器ECS,助力企业业务持续稳定运行

科技说

同是弹性公网IP,华为云弹性公网IP的优势有哪些?

科技说

深入理解 Linux 物理内存分配全链路实现

bin的技术小屋

Linux 操作系统 内核 内存分配

华为云虚拟专用网络VPN,如何解决企业出海难题

爱尚科技

SCQA模型

GeekYin

表达 讲故事能力

架构训练营 模块五

张建闯

架构实战营

react源码中的生命周期和事件系统

flyzz177

React

华为云虚拟专用网络VPN,为企业铺就数据上云的安全路

爱尚科技

拒绝内卷挖掘境外新蓝海,华为云虚拟专用网络VPN有多特别?

爱尚科技

10 分钟带你一览 SOFAStack 的 2022!

SOFAStack

开源 云原生 中间件

【深入浅出Sentinel原理及实战】「基础实战专题」零基础实现服务流量控制实战开发指南(2)

码界西柚

微服务 Alibaba Alibaba技术 1月日更 Sentinel 系统

企业数字化转型?华为云CDN为你提供智能加速!

i生活i科技

CDN

网络堵塞?华为云CDN为你带来一站式解决方案

i生活i科技

CDN

react源码中的hooks

flyzz177

React

前端工程师leetcode算法面试必备-二分搜索算法(中)

js2030code

JavaScript LeetCode

华为云全球加速GA,赋能现代企业出海加速发展

科技之光

华为云全球加速GA,敲开企业跨境业务的大门

科技之光

华为云全球加速GA的“加速”,你真的了解嘛?

科技之光

react源码中的协调与调度

flyzz177

React

在Windows绿色安装Go

独钓寒江

Thanos 升级顺序分析

耳东@Erdong

Prometheus 版本 Thanos 升级迭代

Yelp研发实践:使用服务拆分单块应用_SOA_Daniel Bryant_InfoQ精选文章