合适的架构才是最好的架构?

简介: 合适的架构才是最好的架构?


Andrew Hunt 和 David Thomas 的《程序员修炼之道:从小工到专家》无疑是软件开发者们最喜爱的书籍之一。但是,我有时会想,到底有多少软件工程师真正阅读过这本书呢?

尽管这本书并没有详细阐述微服务和单体架构的方方面面,但它也提供了足够多的信息 —— 甚至可以说是全部信息 —— 帮助我们做出最好的,或者说是最务实的决定,来构建软件。仅仅是目录本身就值得称赞!但是,即使过去了 25 年,这个行业似乎仍未领会到其最基本的教诲 —— 那就是,根据实际情况选择合适的工具

另一个大名鼎鼎的人物,就是 Martin Fowler,他因遵循 “根据实际情况选择合适的工具” 这一理念而崭露头角的。任何熟悉持续重构这一概念的人,也很可能听过 Martin Fowler 的名字。他甚至写了一本专门讲述这个主题的书。

但如果你不想读或者买不起,这里有一个极简的版本:“始终保持重构。如果你接触到代码,并且有能力改进它,那就去改进,但绝不提前优化。 ” 这本书的精髓被浓缩为这句话。在这本书里,他不仅分享了他对重构的见解,还讨论了许多其他现代软件开发的主题,比如架构,更具体地说,单体架构和微服务。

相反,从单体开始,使它保持模块化,一旦单体成为问题时把它分解成微服务。

——martinfowler.com

在 2023 年初,React 的开发人员和维护人员的行为让开发者们大吃一惊,现在又出现在了亚马逊 Prime Video 的开发者身上,最近他们发表了一篇文章,讨论了从微服务转向单体架构的过程(❗如果你还没读过,为了理解背景,请阅读❗)。这引发了很大的讨论,因为考虑到亚马逊还拥有 AWS,在其上建立的无服务器和微服务架构远比我们都应该接受的多 —— 但那是另一个故事了。

那么,到底发生什么事情了呢?好吧,想象一下。悬崖边上的第一只羊跳了下去,然后其他羊都跟着跳了下去。但是后面的羊都没注意到,第一只羊 —— 亚马逊 —— 是穿着降落伞跳的。后面的羊都没有注意到。不幸的是,这种情况并不少见,而这也是我多年来一直在反对的。

仅仅因为大型科技公司正在采用一些新的架构、工具或库,并不意味着它对每个人,包括推出它的那个公司,都是可行的。还记得谷歌的 Angular.js 吗?就是这个道理……

亚马逊 Prime Video 的故事与此非常非常相似。推动了云服务发展的这家公司的部分部门,已经意识到了 Martin Fowler 在 2014 年非常恰当地指出的一个事实 —— 这种模式可能并不适用,而且还没有足够的证据来证明它会有效。当然,这并不意味着亚马逊就不应该尝试这种架构,或者不应该构建支持这种架构的 AWS 产品。Martin 本人也同意,这种尝试是有价值的。但是,尝试与采纳是有很大差异的,在产生实际效果之前的盲目尝试和盲目采纳差异更大。

尽管对许多人来说,亚马逊开发者决定放弃部分微服务,转而选择单体架构的决定可能令人震惊,但这其实一点都不出人意料。微服务是否能成功的可能性一直是五五开。

与那些永远看好未来、天真乐观的人不一样,软件开发并非非黑即白,无论它最终如何编译成 0 和 1。这就是为什么我们需要回归到由 Andrew Hunt 和 David Thomas 在《程序员修炼之道:从小工到专家》中阐述的基本原则,这是每一个紧随亚马逊步伐,一头扎向同样深渊的人都应该做的。

亚马逊 Prime Video 团队的决定并不应被视为一种普遍的方案,尽管我确信会有许多人走进办公室,或者登录 Slack,准备召开紧急的工程全员会议,提出一个计划,要么恢复原状,要么将他们的微服务 “单体化”。我相信我不必须这么说,但请你不要这样做。如果你最终运行的微服务是从解决实际问题的单体架构中剥离出来的,那么你显然已经做出了正确的选择,推翻这个决定至少不会解决任何问题。

另一方面,如果你从一开始就由于像 “其他人都在这么做” 这样的轻率理由而采用微服务,那么你可能需要坐下来对你的架构进行一次真正的成本效益分析,甚至可能需要与亚马逊 Prime Video 的案例进行对比。他们勇敢地承认微服务是错误的选择,这至少表明这个决定并非出于市场炒作。你的分析结果可能会证明,采用单体架构所解决的问题少于其带来的问题和投入,在这种情况下,你应当坚持你现有的选择。

Martin Fowler 和我都赞同一个简单的事实,那就是

我们在讨论这个话题,对前端开发也同样适用。微前端是一种可能的解决复杂前端问题的方案,但这并不一定意味着它是每个复杂前端的正确解决方案。

这篇文章就是要说明,不要盲目追随大型科技公司。务实的编程依然占主导地位,根据实际情况选择合适的工具永远是最佳建议。

相关文章
|
5月前
|
安全 数据处理 数据安全/隐私保护
C/S架构与B/S架构的适用场景分析
C/S架构(客户端/服务器架构)与B/S架构(浏览器/服务器架构)在适用场景上各有特点,主要取决于应用的具体需求、用户群体、系统维护成本、跨平台需求等因素。
385 6
|
9月前
|
存储 SQL 分布式计算
TiDB整体架构概览:构建高效分布式数据库的关键设计
【2月更文挑战第26天】本文旨在全面概述TiDB的整体架构,深入剖析其关键组件和功能,从而帮助读者理解TiDB如何构建高效、稳定的分布式数据库。我们将探讨TiDB的计算层、存储层以及其他核心组件,并解释这些组件是如何协同工作以实现卓越的性能和扩展性的。通过本文,读者将能够深入了解TiDB的整体架构,为后续的学习和实践奠定坚实基础。
|
9月前
|
机器学习/深度学习 资源调度 并行计算
VGen整体架构
【1月更文挑战第7天】VGen整体架构
237 1
VGen整体架构
|
存储 缓存 算法
架构设计第八讲:架构 - 理解架构的模式2 (重点)
架构设计第八讲:架构 - 理解架构的模式2 (重点)
161 0
|
存储 缓存 负载均衡
架构系列——架构师必备基础:单体、分布式、集群与冗余的区别
架构系列——架构师必备基础:单体、分布式、集群与冗余的区别
|
运维 Kubernetes 监控
K8S(二):整体架构,从全局上把握K8S核心组件
整体架构,从全局上把握K8S核心组件
188 0
K8S(二):整体架构,从全局上把握K8S核心组件
|
安全 Cloud Native 架构师
如何设计或选择合适的研发模式|学习笔记
快速学习如何设计或选择合适的研发模式
227 0
如何设计或选择合适的研发模式|学习笔记
|
安全 Cloud Native 架构师
如何设计或选择合适的研发模式 | 学习笔记
快速学习如何设计或选择合适的研发模式
如何设计或选择合适的研发模式 | 学习笔记
|
缓存 运维 监控
服务化架构增加了哪些复杂度:微服务架构谈(5)(下)
服务化架构增加了哪些复杂度:微服务架构谈(5)(下)
242 0
服务化架构增加了哪些复杂度:微服务架构谈(5)(下)
|
资源调度 监控 负载均衡
服务化架构增加了哪些复杂度:微服务架构谈(5)(上)
服务化架构增加了哪些复杂度:微服务架构谈(5)(上)
183 0
服务化架构增加了哪些复杂度:微服务架构谈(5)(上)

热门文章

最新文章