Etsy 如何及为什么迁移到 API 优先的架构

  • Thomas Betts
  • 谢丽

2016 年 8 月 8 日

话题:重构架构性能调优DevOps语言 & 开发

在 QCon 纽约 2016 大会上,Etsy 软件工程师 Stefanie Schirmer 介绍了其公司如何成功转换到 API 优先的架构,实现了多设备支持,解决了服务器端性能问题,被开发团队迅速采用。

Etsy 工程团队已经名声在外,他们设计的架构针对变更进行了优化,方便了持续试验,让他们可以每天部署 50 次。因此,你可能会觉得意外,几年前,他们还在研究解决严重的性能问题。

他们的目标是 1000 毫秒以下,因此,他们需要降低每个客户端请求的服务器处理时间。遗憾的是,单线程的 PHP 世界轻易不允许并发 API 调用,只能缓慢地顺序执行。Schirmer 及其同事需要解决如何实现并发,否则,他们就会冒着永久性性能问题的风险。更为复杂的是,他们并不清楚,性能退化的根本原因是后台问题,还是客户端请求的性质。

遗憾的是,开发团队不能只是致力于提高性能。除了要支持和升级 Etsy.com 网站外,移动应用的新特性需要从平台上增加可扩展性。这两个问题的解决方案需要 API 团队采用一种新的设计哲学,同时要保证它们是开发团队所熟悉且易于为他们所使用的 API。

Etsy 使用“元端点(meta-endpoints)”创建了一个两层的 API,而不是依赖于一个有一组扁平端点的 API。和NetflixeBay 的 ql.io的模式类似,Etsy 的每个元端点都聚合了多个其他的端点。这让服务器端可以将底层的通用资源组合成设备或视图特有的资源。

整个技术栈构成了一棵多层的树,如下图 Schirmer 的幻灯片所示。面向客户的“订制(bespoke)”主页被裁剪成了特定的视图。它使用了一个并行元端点层,后者反过来又调用了原子组件端点。只有最底层的组件(它们不是元端点)能够和数据库交互。

元端点层降低了组合网站和移动应用订制视图的复杂性。不过,多个元端点单线程处理无法满足性能需求。Etsy 工程师利用 cURL 发起并行 HTTP 调用,甚至是修改 libcurl以满足需求。自定义的监控工具在请求通过框架扇出时将其调用层次可视化,让开发人员可以定位故障点。

他们还创建了其他的内部工具,用于简化新 API 的应用。Etsy 首先自动化了 API 客户端(它知道每个端点的具体参数)生成,然后又配上了文档,简化了开发人员的学习曲线。团队没有采用一种通用的培训方法,而是参加实验小组、代码实验室、午餐和学习研讨班,以及与有经验的开发人员结对。

Schirmer 认为,她讲述的故事是一个关于架构变革的案例,可以移植到其他系统。与 API 辅助工具和服务相关的工作有助于平台团队将新 API“卖给”开发人员。为此,Schirmer 及其同事一直保持着与开发团队的沟通,以确保框架在不断演化的过程中可以照顾到所有人的利益。

查看英文原文How and Why Etsy Moved to an API-First Architecture

重构架构性能调优DevOps语言 & 开发