“在编写分布式应用程序时,传统观点认为将应用程序拆分为可以独立推出的独立服务。这种方法的初衷是好的,但像这样基于微服务的体系结构往往会适得其反,带来的挑战抵消了体系结构试图实现的好处。”
文章认为,从架构上讲,微服务本身设置就有问题,它是一个没有边界的结构:“从根本上说,这是因为微服务将逻辑边界(如何编写代码)与物理边界(如何部署代码)混为一谈。”
(1)鼓励开发人员编写分为逻辑组件的单片应用程序
(2)将物理分布和执行模块化单片的挑战推迟到运行时
(3)原子部署应用程序。
这三个指导原则带来了许多好处,并会为未来的开发创新打开大门。无独有偶,同样是在6月,亚马逊流媒体平台 Prime Video发布的一则案例研究似乎改变了风向:“我们放弃了无服务器、微服务架构,改用单体架构取而代之,此举为客户节省90%的运营成本,还简化了系统复杂度”。
单体应用对微服务的“反戈一击”,还是亚马逊团队提出来的,再次让这个话题迅速引爆技术圈。整个案例看下来,微服务跟降本增效似乎也扯不到一起去。问题出在哪里?Prime Video 团队需要一个监控视频流质量问题的工具,由于视频数量太大,就要求该工具有很强的可扩展性。最初这项工作是由一组分布式组件完成的,这些组件由AWS Step Functions(一种无服务器编排服务,AWS Lambda无服务器服务)编排,分分钟就能搭出一个有模有样的监控系统。但谁能想到,Step Function 伸缩问题竟然成为最大的绊脚石。
具体来看,一是对于视频流的每一秒,需要很多并发的 AWS Step Function,所以很快就达到了账户限制;二是 AWS Step Function 是按照状态转换向用户收费的,太贵了实在用不起。无奈之下,Prime Video开始考虑用单体的解决方案以降低成本和增加应用的扩展能力,在经历了反复试验后,团队最终决定重建Prime Video的整个基础设施。
亚马逊在博客文章总结道:“微服务和无服务器组件是可以大规模工作的工具,但是否在整体上使用它们必须根据具体情况而定……将服务迁移成单体让我们的基础设施成本降低了 90%以上,还提升了我们的伸缩能力。”
最近几年,无数的中小团队在权衡利弊后选择放弃微服务。Uber 就是其中一家,此前 Uber 通过构建微服务来完成很小的需求或功能,甚至出现很多由一个人构建维护的微服务。这些微服务的存在给Uber带来了更多的挑战,比如监控、测试、持续集成 / 持续交付(CI/CD)、服务级别协议(SLA)等。踩了微服务的“坑”之后,Uber 团队对新服务进行了更加深思熟虑的规划:不再只是完成一件事,而是使其服务于一项业务功能,由 5-10 个工程师负责维护,还总结出了血泪教训:要在正确的时间选择正确的解决方案来构建产品。
办公管理软件公司 Managed by Q 的应用程序是一个部署在 ECS 上的 Django 单体。为了赶上现代化开发实践的步伐,他们转向微服务架构。但他们很快发现,每多一个新服务,就会增加一些基础设施,而且开发一个跨多个服务的功能需要做更多的工作。结果,在转向微服务两年之后,他们开始合并微服务。一些微服务被合到了单体中,其他的则合并成较大的服务。他们也在实践中得出经验:不能理所当然地认为微服务就是正确的选择。
API变得脆弱:微服务互操作性的关键是,一旦建立了微服务,API就不能改变,让它们破坏任何其他依赖API的微服务。因此,API只能用更多的API进行扩展,从而产生膨胀。
看起来跟之前提到的“过度设计”的概念不谋而合。事实上有些团队在将集中式单体应用拆分为微服务时,首先进行的往往不是建立领域模型,而只是按照业务功能将原来单体应用的一个软件包拆分成多个所谓的“微服务”软件包,而这些“微服务”内的代码高度耦合,逻辑边界不清晰,本质上还是单体架构模式,所以只是实现了“表面繁荣”,并没有实现想要的结果。
业内有这样一种依旧支持微服务架构的观点:微服务需要与之匹配的规模。“如果你知道最终会以一定的规模来做这件事,在开始时可能会以不同的方式来构建它。但问题就在于,你知道如何做这件事情吗?你知道你将以多大的规模来运营它吗?”
经过了许多基础架构的重新思考,微服务并不是唯一被质疑的泡沫。例如,云计算也受到了审查。6月,同时运行Basecamp和Hey电子邮件应用程序的37signals公司采购了一批戴尔服务器,并离开了云计算,打破了几十年来大家抛弃老旧拥抱新故事的传统。
David Heinemeier Hansson在一篇博客文章中解释道:“这是云营销的常用话术:它会变得容易得多,几乎不需要任何人来操作。”“(但事实是)我从来没有见过。37signals没有,来自大型互联网公司的人也没有见过。云有一些优势,但它通常不会减少运维人员。”
当然,DHH是一名赛车手,有可能更喜欢裸机。但也有不少拥趸愿意支持这一赌注。晚些时候,Oxide Computers推出了他们的新系统,希望能为其他人提供类似的服务:运行云计算工作负载,但在自己的数据中心更具成本效益。
此外,在云账单即将到期的情况下,这种情绪似乎更加强烈。2023年,随着越来越多的组织转向KubeCost等公司来控制其云支出,FinOps成为一件引人注目的事。一位DataDog的客户收到6500万美元的云监控账单的消息,也再次让业界无数人惊到了。