写点什么

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:202892

评论

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

深入Linux性能与统计命令:优化、监控与管理的首选工具

测试人

软件测试

10月回顾 | Apache SeaTunnel社区动态与进展一览

白鲸开源

大数据 开源 数据同步 数据集成 Apache SeaTunnel

Termius for mac(终端模拟器/SSH/SFTP客户端)

Mac相关知识分享

图文教程 | 阿里云市场 Serverless GreptimeDB 购买和使用指南

Greptime 格睿科技

数据库 阿里云 使用指南

【论文速读】| 注意力是实现基于大语言模型的代码漏洞定位的关键

云起无垠

架构图怎么制作?盘点10个优秀的架构图模板!

职场工具箱

职场 在线白板 架构图 绘图软件 组织架构图

10月回顾 | Apache DolphinScheduler社区动态与进展一览

白鲸开源

大数据 开源 Apache DolphinScheduler 工作流任务调度

虚拟化技术:新能源汽车空调控制系统的智能新突破

DevOps和数字孪生

汽车

大模型应用开发初探 : 通用函数调用Planner

不在线第一只蜗牛

大模型

万界星空科技装备制造业MES解决方案

万界星空科技

mes 万界星空科技mes 装配行业 装配制造业 装配行业MES

从模型到应用,大模型产业落地进入加速期

Geek_2d6073

【GreatSQL优化器-02】索引和Sargable谓词

GreatSQL

测试如何帮助开发同学更愉快的“修BUG”

Hi-CodeCaptain

软件质量 测试覆盖率 精准测试 bug 软件项目管理

【JIT/极态云】技术文档--日期字段任务

武汉万云网络科技有限公司

【JIT/极态云】技术文档--Excel模板

武汉万云网络科技有限公司

Unveiling the IPQ5312 vs IPQ5322: A Comprehensive Deep Dive into Qualcomm's WiFi 7 Chips

wifi6-yiyi

WiFi7 IPQ5312

智源六周年 | 矢志星海,奋楫争先

智源研究院

空壳产品之路:直面自身的缺点

iofomo

产品 设计 工具 摸鱼 微信分身

SaaS,PaaS,IaaS是什么意思?一文教你弄懂!

积木链小链

IaaS PaaS SaaS 平台

这个 AI 懂 Vue 吗?

豆包MarsCode

程序员 AI 智能 智能云

第一!中国专属云服务市场,荣誉+1!

天翼云开发者社区

云计算 云服务 天翼云

我手搓了个“自动生成标书”的开源大模型工具

白鲸开源

人工智能 机器学习 GAN 大模型

鸿蒙Navigation拦截器实现页面跳转登录鉴权方案

龙儿筝

鸿蒙

百度多模态大模型内容安全解决方案获WitAwards 2024年度大奖

百度安全

金字塔原理:解决问题的高效思维框架

易成研发中心

项目管理 金字塔原理

利用官方授权API接口item_get_app,深度挖掘淘宝/天猫APP商品详情数据

代码忍者

API 接口 pinduoduo API

安徽等级保护测评机构名单【2025】

行云管家

等保 等保测评 安徽

Vscode 远程切换Python虚拟环境

EquatorCoco

Python vscode

广告行业需要用到堡垒机的几个原因分析-行云管家

行云管家

广告 等保 等保测评

下周二!白鲸开源WhaleStudio将亮相AWS数据合作伙伴荟萃周,探讨DataOps新质生产力

白鲸开源

AWS DataOps 数据集成 数据调度 白鲸开源

云行| 金陵古都焕发数智活力,天翼云为南京创新发展注入新动能!

天翼云开发者社区

云计算 云服务 天翼云

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