亚马逊网站架构演进

原文: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...

相关推荐
mit6.8247 小时前
[Docker#4] 镜像仓库 | 部分常用命令
linux·运维·docker·容器·架构
乌恩大侠11 小时前
了解 Open RAN 架构中的 DU 和 CU
架构
贵州晓智信息科技11 小时前
深入理解 React 架构从概览到核心机制
前端·react.js·架构
W Y11 小时前
【架构论文-1】面向服务架构(SOA)
架构·架构设计
Hello.Reader12 小时前
解析Eureka的架构
云原生·eureka·架构
航火火14 小时前
回首遥望-C++内存对齐的思考
c++·面试·架构
执着码农14 小时前
Tomcat源码解析之架构设计
后端·架构
白总Server17 小时前
Swagger UI
后端·ui·spring cloud·ribbon·架构·scala·1024程序员节
infiniteWei17 小时前
【Lucene】架构概览和核心组件介绍
搜索引擎·架构·全文检索·lucene
未命名冀20 小时前
微服务day06
微服务·云原生·架构