东亚银行、岚图汽车带你解锁 AIGC 时代的数字化人才培养各赛道新模式! 了解详情
写点什么

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

评论

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

融云发送语音消息

融云 RongCloud

融云 AMR(Aduio) 播放 AMR 格式 Base64 码音频

融云 RongCloud

集成融云 SDK 怎么实现多端同步未读数

融云 RongCloud

使用融云 IM SDK 实现 H5 直播聊天

融云 RongCloud

区块链农产品溯源方案,区块链溯源平台

13530558032

加快数字化发展 建设数字中国

CECBC

大数据

集成融云 IM 问题总结

融云 RongCloud

图片社区类APP增加评论表情包功能

🙈🙈🙈

极客大学产品经理训练营

集成融云 Web 音视频通话踩坑之旅

融云 RongCloud

结合融云 WebSDK 了解 WebSocket 基本原理

融云 RongCloud

融云 IM 那些事儿

融云 RongCloud

中关村软件园与百度飞桨启动AI人才培养计划:AI发展,人才先行

百度大脑

人工智能 百度 人才培养

什么是 Git? - 探索分布式版本控制工具

码语者

git DevOps

融云 Web SDK 如何实现语音的收发 ?

融云 RongCloud

平安智慧社区解决方案,平安社区综合管理平台

13530558032

融云 Web SDK 删除历史消息

融云 RongCloud

集成融云小程序 SDK 遇到的问题

融云 RongCloud

使用融云 Web SDK 撤回消息

融云 RongCloud

融云 Web 播放声音 — Flash 篇 (播放 AMR、WAV)

融云 RongCloud

融云 CallLib 集成遇到的问题

融云 RongCloud

融云 Web SDK 如何实现只有一个设备登入

融云 RongCloud

融云 RTC SDK 集成实现直播,趟坑之旅~~~

融云 RongCloud

区块链版权保护平台--催生版权保护新格局

13530558032

通过融云 WebSDK 简单了解 WebSocket

融云 RongCloud

SDK 兼容 JSON

融云 RongCloud

提醒小程序的产品文档——大作业心得总结

小匚

产品经理 随笔杂谈 产品经理训练营 极客大学产品经理训练营

融云 Web 播放声音(AMR 、WAVE)

融云 RongCloud

融云 IM SDK 发送语音消息

融云 RongCloud

最高法两会报告聚焦区块链惩治抄袭,区块链在保护网络著作权方面如何作为?

CECBC

法律

Web 端集成融云 SDK 如何发送正确图片消息给移动端展示?

融云 RongCloud

区块链如何走向云端?

CECBC

云技术

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