作者 | 褚杏娟
近日,GitHub 前 CTO Jason Warner 在推特上表示,“我确信过去十年中,最大的架构错误之一就是全面使用微服务 。”从单体应用到微服务的规划顺序,Warner 的建议是:单体>应用程序>服务>微服务 。
Warner 表示,这是一种思维方式而非规则 。“任何构建过大型分布式系统的人都知道他们并不真的那样工作,但还必须适应它 。”其次,Warner 表示认为,公司所处的阶段很重要 。如果是一家 5-50 人的公司,只需坚持使用单体 。
Warner 先对服务和微服务的定义进行了阐释 。服务支持应用程序/单体,是核心基础设施,被大量需要,为核心合规功能,可能不是应用程序团队编写的(基础设施团队维护);微服务则有几百行代码,大部分是一次性的,可能或应该是库、SDK 等 。对于为什么不太看好微服务,Warner 给出的理由如下:
一般来说,整个工程团队在一个大型应用程序中工作(想像 Rails 应用程序中的整个站点),比推理微服务将以何种方式失败要容易得多 。无论如何,随着企业发展而拥有的分布式系统,引入数十个微服务进行推理已经很难了,更不用说数百个各有风险的微服务 。完全微服务化时,需要引入新的概念来处理“sprawl” 。重要的是,每个定制的基础设施服务或微服务都是债务 IMV 的极端版本? 。代码是债务,但服务是债务的极端版本?? 。Warner 还指出,当涉及几十个微服务或更大规模时,企业遇到通常并非技术问题,而是组织上的挑战 。
首先,基础设施几乎不会被优先考虑(除非公司由非常随和的 CEO 领导);其次,过多的服务常常会导致所有权和边界问题;再者,为处理过多的微服务会引入更多的工具;更重要的是,本来应该是库、SDK 或其他东西的微服务都会引入生产风险 。代码过多是开销,服务过多是客户面临的产品/体验风险,两者都有开销和风险,但百分比分布不同 。
因此,Warner 鼓励企业根据自己的情况来选择,而不是盲目跟随大厂的做法,他给出的建议是:
尽可能地延长单体应用的使用时间 。服务从基础设施开始,而非应用程序 。如果要打破单体架构,打破大型应用程序,而不是小型服务 。认为每个新应用程序是贵公司的虚拟墙 。尽可能选择库而不是微服务 。对于 Warner 的观点,有开发者评价道,“我认为他提出了一些很好的观点,尤其是关于有多少东西真的应该是库 。”也有开发者表示,微服务的主要问题很简单,就是大多数人不了解如何正确设计它们 。一个设计糟糕的单体架构几乎总好过设计糟糕的微服务架构 。单体保护企业免受不良设计影响的底线要高得多 。最大的错误是人们倾向于创建太小或太多的服务 。
任职期间,GitHub 迁到微服务架构Warner 曾在 Heroku 担任副总裁/工程主管三年多,并在担任 Ubuntu Desktop 工程主管近四年后,在 2017 年 5 月开始担任 GitHub 的首席技术官一职 。Warner 现在已成为 Redpoint Ventures 的董事总经理 。
Warner 十七八岁时才真正开始编程 。当时的他刚进入 IBM 主要负责打印机联网,“他们最终说,'嘿,如果你去学校学习如何编程和学习计算机科学,毕业后我们会给你一份工作 。'”Warner 曾在博客中回忆道 。
尽管拥有计算机科学学士和硕士学位,Warner 还是认为自己可能是一名普通的开发人员 。初到 GitHub 时,Warner 将时间更多花在了产品方面,但随着开发者社区蓬勃发展,GitHub 架构面临着更大的扩展性挑战 。
Warner 刚来时,GitHub 拥有约 2000 万帐户,该网站每天大约有 150 万至 200 万活跃用户,注册量达 1 万人 。但到 2021 年 7 月 Warner 离开时,这一数字已跃升至每天 50,000 人注册,日活跃用户也达到了 700 万 。
显然,微服务架构成为当时 GitHub 减轻扩展限制的选择之一 。微服务潮流曾被 Heroku 大力推动,或许 Heroku 任职的经历也让 Warner 支持 GitHub 进行微服务改造 。“我实际上可以坐在那里倾听并真正为整体架构方法做出贡献 。”Warner 曾在采访中提到 。
如何迁移一直以来,GitHub 是基于 Ruby on Rails 的单体架构,直到 2021 年,为了让超过一半的开发人员在单体代码库之外富有成效地开展工作,GitHub 以赋能为出发点开始了向微服务架构的迁移 。
GitHub 团队认为,良好的架构始于模块化 。拆分单体的第一步是考虑基于特性功能分割代码和数据 。这个过程可以在真正在微服务环境中拆分之前在单体中完成 。
正确地拆分数据是从单体架构转向微服务的基础 。GitHub 的做法是先在现有的数据库模式中识别功能边界,并按照这些边界将实际的数据库表分组 。GitHub 研发团队将生成的功能分组称为模式域,并记录在 YAML 定义文件中 。在数据库模式中添加或删除表,都要更新这个文件 。
推荐阅读
- SpringBoot项目基础设施搭建
- Ubuntu 中安装 Microsoft Edge
- 中考前一个月如何安排时间,完成最后的复习
- 郭希宽|许敏提前出院是另有隐情?郭希宽回应网友质疑,偷换之说再添疑点
- |职场中,不要在领导面前反驳别人的说辞
- 对未来学习的规划
- 刘备在三顾茅庐前投奔了很多人 从中可以看出刘备是个什么样的人
- 据说,这是澳洲最难的7个专业
- 金铁霖|特殊的情感!李谷一在医院惊闻前夫金铁霖死讯,以另一种身份悼念
- 养殖什么动物前景最好,什么好养又赚钱?