亚马逊网站架构演进

原文:nullwy.me/2023/11/ama...

SOA 与微服务

Amazon,1994 年创立,早期网站是单服务、单数据库的单体架构的系统^1^^2^^3^,全部代码由 C++ 编写,编译成单个二进制文件,整个代码仓库被命名为 Obidos。Obidos 是底层是一个 Web 页面渲染引擎,是一个框架,业务逻辑基于这个框架开发,Obidos 渲染引擎和业务逻辑共同组成整个代码仓库。随着时间的推移,Obidos 变得越来越复杂,编译 Obidos 整个代码库耗时 12 小时,开发调试效率低下^2^。另外,全部业务逻辑在单个二进制文件中,导致紧耦合,新功能特性无法快速发布上线。1995 年,Amazon 网站的技术架构,如下图所示^3^:

到 2000 年,为了应对流量增长,解决网站的可扩展性问题,开始拆分 Obidos,向可扩展的 SOA 架构演进。拆分出的服务有,用户服务(customer service)、订单服务(order service)、商品服务(item service)等,并且每个服务都拥有各自独立的数据库。2005 年 1 月,Amazon 网站开始从 Obidos 引擎迁移到 Gurupa 引擎。Gurupa 是一个 Web 页面渲染引擎,同时也是一个 SOA 框架,Gurupa 被用于集成背后的数百个服务,使用 Perl 的 Mason 模板将各个服务响应的数据渲染成 Web 页面。到 2006 年完成了到 Gurupa 的全部迁移^4^。

Amazon 网站技术架构演进过程,如下图所示^2^:

需要注意的是,图中认为从 2006 年开始 Amazon 网站架构从 SOA 演进为微服务,但是事实上,"微服务"这个术语诞生的时间是 2012 年。2006 年的架构实现与之前的 SOA 架构实现的不同点是,开始更细粒度的服务拆分。

本质上来看,微服务架构是一种特殊的 SOA 架构,在"微服务"术语诞生之前,亚马逊的 SOA 架构实现被认为是"SOA done right"(正确实现的 SOA)^5^。Netflix 的 SOA 架构实现也在"微服务"术语诞生之前,Netflix 认为自己实现架构的是"fine-grained SOA"(细粒度的 SOA)^6^。James Lewis 和 Martin Fowler 等人是"微服务"概念的早期提倡者,他们将亚马逊和 Netflix 的 SOA 架构实现归类为微服务的经典案例^7^。所以,SOA 和微服务的关系可以简单理解为,微服务是"fine-grained SOA"或"SOA done right"。

根据 Martin Fowler 的解释^8^,SOA 与微服务的关系,如下图所示:

在 SOA 架构的具体实践上,根据前亚马逊工程师 Steve Yegge 的 2011 年的文章^9^^10^,在 2002 年左右,亚马逊创始人兼 CEO Jeff Bezos 向全公司发布了一道指令(这个指令被外界称为"API Mandate"),具体内容如下:

  1. 从今天起,所有的团队都要以服务接口的方式提供数据和各种功能。
  2. 团队之间必须通过接口来通信。
  3. 不允许任何其他形式的互操作:不允许直接链接,不允许直接读其他团队的数据,不允许共享内存,不允许任何形式的后门。唯一许可的通信方式就是通过网络调用服务。
  4. 至于具体的技术则不做规定。HTTP、Corba、Pubsub、自定义协议都可以。贝索斯不关心这个。
  5. 所有的服务接口,必须从一开始就要以可以公开为设计导向,没有例外。这就是说,团队必须在设计的时候就计划好,接口要可以对外面的开发人员开放。没有讨价还价的余地。
  6. 不听话的人会被炒鱿鱼。

技术栈演进

Amazon 网站的技术栈演进过程^2^^4^^11^:

  • 1995 ~ 2000:单体架构,Unix(Sun)、Obidos、Oracle、C++
    • Obidos 是亚马逊内部 Web 动态页面渲染引擎,编程语言是 C++。
  • 2000 ~ 2006:SOA 架构,Linux、Obidos、Oracle、C++
    • 2000 年,将 Sun/Unix 服务器替换为 HP/Linux 服务器^12^。
    • 2000 年,拆分应用服务,向 SOA 架构演进。
    • 2005 年初,开始将 Obidos 框架替换为 Gurupa 框架,Gurupa 是 Web 页面渲染引擎,同时也是 SOA 框架。Web 动态页面的编程语言从 C++ 替换为 Perl/Mason,同时应用服务开始被更细粒度的拆分。
  • 2006 年开始:微服务架构,Linux、Gurupa、Oracle、Perl & Java & C++
    • 2019.10,彻底去掉 Oracle 数据库,迁移到 Amazon RDS 和 NoSQL^13^。

当前 Amazon 网站的主要技术栈:

  • 应用服务 ^4^^11^:
    • 展示层 :Perl/Mason^14^
    • 业务逻辑层:Java(主要)、C++ 等
    • RPC框架 :Gurupa 框架(自研闭源)
      • 2006 年更早之前使用 Obidos 框架
    • 消息队列MQAmazon SQS
  • 数据存储 ^13^:
    • 关系数据库 :Amazon RDS for PostgreSQL^15^、Amazon Aurora (PostgreSQL)
      • 2019 年 10 月彻底去掉 Oracle 数据库,迁移到 Amazon RDS 和 NoSQL。
    • 键值存储Amazon DynamoDB
    • 缓存 :Amazon ElastiCache for Redis^16^
    • Blob文件存储Amazon S3

AWS 的诞生

Amazon 网站架构演进的过程,伴随着 AWS 云服务的诞生,促使 AWS 云服务诞生的因素主要有^17^^18^:

  • 技术价值 :Amazon 网站在向可扩展架构演进的过程中,其基础设施团队开始善于运营像计算、存储和数据库这样的基础设施,团队已经变得能非常熟练地运营可靠的、可扩展的、具有成本效益的数据中心,这些专业能力推动了亚马逊电商平台的发展。将维护可靠、可扩展的基础设施专业能力通过服务的方式对外交付,能有效节省第三方企业或初创公司的成本,当时亚马逊预计基础设施的成本可能会从 70% 降低至 30% 或更低^19^。
  • 原始动机 :Amazon 网站的流量有很强的季节性,每年 11 月和 12 月(尤其是在感恩节和圣诞节前后)流量都会飙升。为了应对购物季,不得不扩容,增加服务器资源。在购物季结束后,服务器资源被大量闲置。零售电商的利润很薄,却要面对数据中心基础设施不断扩展所带来的成本压力。所以,很多人(包括部分亚马逊员工)^20^^21^认为推出 AWS 产品的一个重要原因是为了出租 SOA 网站在销售淡季时的过剩服务器容量。不过,出租过剩容量的故事是一个神话,因为不可能在每年购物季时把开发商从服务器里踢出去,而且实际上在推出 EC2 云服务后的 2 个月内,AWS 就已经烧掉了过剩的 Amazon 网站容量^19^。
  • 商业理念Jeff Bezos,将亚马逊定位为一家技术公司,而不仅仅是一家在线零售商,所以在亚马逊的核心业务之外进行很多投资尝试,AWS 产品就是其中之一^17^。

于是,在 2003 年亚马逊团队内部逐渐开始形成销售基础设施服务的设想。2003 年 9 月^22^,Andy Jassy 写了 6 页纸的关于 AWS 的愿景文档(vision document)并提交给管理团队,愿景文档中提议了设想的 AWS 业务,并概述了 AWS 提供的初始的基础设施服务集,首批提供的服务包括存储、计算和数据库等。同年,Jassy 组建了由 57 人组成的 AWS 团队,AWS 团队的 CEO 由 Jassy 担任(Jassy 担任 AWS CEO 一直到 2021 年,2021 年 7 月开始任职亚马逊 CEO)。三年之后,2006 年 3 月 AWS 对外发布 S3 云存储,8 月对外发布 EC2 弹性云计算服务器,S3 和 EC2 是行业内最早的云服务产品 。S3 发布的刚开始几个月,并没有引起太大的关注。EC2 发布后,大量开发商开始飞速涌入。在没有其他类似云服务产品最初几年,几乎每一家创业公司都在亚马逊的服务器上构建自己的系统。能吸引大量开发商的原因主要是,按需使用和收费的商业模式,以及亚马逊故意压力利润的价格策略^17^。

迁移到 AWS

2011 年 11 月,Amazon 网站全部都迁移到了 AWS 云服务器上^23^。迁移到 AWS 上最大的动机是能利用 AWS 云服务器的弹性伸缩能力,从而节省成本。如果没有弹性伸缩能力,在淡季时,总体上服务器资源容量的利用率是 61%,无法有效利用的容量是 39%,到购物季的 11 月,无法有效利用的容量高到 76%。引入弹性伸缩技术后,可以按网站的实际流量负载情况,供应恰当的容量,避免资源浪费。Amazon 网站在淡季和购物季时的静态伸缩与弹性伸缩,如下图所示^23^^24^。

参考资料

Footnotes

  1. 2006-05 ACM Queue Interview: A Conversation with Amazon CTO Werner Vogels queue.acm.org/detail.cfm?...

  2. 2021-02 Amazon's architecture evolution and AWS strategy (AWS re:Invent 2020) www.youtube.com/watch?v=HtW... ↩^2^ ↩^3^ ↩^4^

  3. 2022-11 Reliable scalability: How Amazon scales in the cloud (AWS re:Invent 2022) www.youtube.com/watch?v=_Ah... ↩^2^

  4. 2011-04 Charlie Cheever: How did Google, Amazon, and the like initially develop and code their websites, databases, etc.? qr.ae/pKKyB0 ↩^2^ ↩^3^

  5. 2007-06 SOA done right: the Amazon strategy www.zdnet.com/article/soa...

  6. 2011-05 How the cloud helps Netflix (interview Adrian Cockcroft) radar.oreilly.com/2011/05/net...

  7. 2014-03 James Lewis & Martin Fowler: Microservices martinfowler.com/articles/mi...

  8. 2014-11 Microservices • Martin Fowler • GOTO 2014 youtu.be/wgdBVIX9ifA...

  9. 2011-10 Steve's Google Platform rant gist.github.com/chitchcock/...

  10. 2016-09 亚马逊如何变成 SOA(面向服务的架构)?(摘录自Steve Yegg的《程序员的呐喊》) www.ruanyifeng.com/blog/2016/0...

  11. What programming languages are used at Amazon? qr.ae/pKFwnw ↩^2^

  12. 2001-10 How Linux saved Amazon millions web.archive.org/web/0/http:...

  13. 2019-10 Migration Complete -- Amazon's Consumer Business Just Turned off its Final Oracle Database aws.Amazon/blogs/aws/m... ↩^2^

  14. 2016-04 Is Amazon still using Perl Mason to render its content? qr.ae/pKFwFm

  15. Amazon RDS for PostgreSQL customers aws.Amazon/rds/postgre...

  16. Amazon ElastiCache for Redis customers aws.Amazon/elasticache...

  17. 一网打尽:贝佐斯与亚马逊时代,Brad Stone,2013,豆瓣:第7章 一家技术公司,而非零售商 ↩^2^ ↩^3^

  18. 2016-07 AWS CEO Andy Jassy: How AWS came to be techcrunch.com/2016/07/02/...

  19. 2011-01 Amazon CTO Werner Vogels: How and why did Amazon get into the cloud computing business? qr.ae/pKscWd ↩^2^

  20. 2016-07 前亚马逊员工在 Reddit 上对文章"How AWS came to be"的评论 www.reddit.com/r/programmi...

  21. 2021-01 前亚马逊员工 Dan Rose:全球最大云厂商AWS是如何诞生的? mp.weixin.qq.com/s/C7Mqeh1hy...

  22. 2013-11 Andy Jassy's Book Review of "The Everything Store" www.Amazon/review/R1Q4...

  23. 2011-07 2011 AWS Tour Australia, Closing Keynote: How Amazon migrated to AWS, by Jon Jenkins www.slideshare.net/AmazonWebSe... ↩^2^

  24. 2017-03 AWS: Elasticity and Management www.slideshare.net/AmazonWebSe...

相关推荐
javaDocker14 小时前
业务架构、数据架构、应用架构和技术架构
架构
JosieBook16 小时前
【架构】主流企业架构Zachman、ToGAF、FEA、DoDAF介绍
架构
.生产的驴17 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
丁总学Java17 小时前
ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)
arm开发·架构
ZOMI酱19 小时前
【AI系统】GPU 架构与 CUDA 关系
人工智能·架构
天天扭码1 天前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
余生H1 天前
transformer.js(三):底层架构及性能优化指南
javascript·深度学习·架构·transformer