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

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


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 和我都赞同一个简单的事实,那就是

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

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

相关文章
|
算法 调度
详解操作系统的调度
详解操作系统的调度
1542 0
|
11月前
|
数据采集 API 开发工具
CNFANS模式淘宝1688代购系统搭建指南
CNFANS模式整合国内电商资源,对接淘宝、1688商品库,为海外用户提供代购、集运、物流清关等一站式服务。通过API打通电商平台、支付(PayPal/Stripe)、国际物流及仓储系统,实现商品采集、下单、支付、发货全流程自动化,解决海外用户“买不到、价格高”难题,提升跨境购物体验。(238字)
|
4月前
|
安全 关系型数据库 MySQL
阿里云代理商零度云lingducloud教新手快速部署数据库!
新手部署阿里云RDS MySQL常被VPC、可用区、ESSD等术语困扰。本文以通俗语言讲清核心概念,手把手指导选型、创建、白名单配置、账号设置及连接验证,并提醒避坑要点,助你30分钟快速上手安全可用的云数据库。
|
12月前
|
数据采集 运维 监控
金融行业RPA案例全解析:银行、证券、保险落地实践与价值数据
凌晨两点,银行、证券、保险、基金从业者仍在与数据搏斗。RPA“数字员工”正颠覆这一现状,通过自动化处理开户、清算、理赔、净值计算等高重复任务,大幅提升效率与合规性。实在智能的实在Agent以AI能力破解非结构化数据难题,助力金融行业实现从“人海战术”到“智能协同”的跨越,释放人力聚焦高价值服务,推动数字化转型迈向新阶段。
1042 1
|
SQL XML Java
【mybatis】第二篇:@Select注解中加入字段判断
【mybatis】第二篇:@Select注解中加入字段判断
|
存储 人工智能 运维
AI 网关代理 RAG 检索:Dify 轻松对接外部知识库的新实践
Higress AI 网关通过提供关键桥梁作用,支持 Dify 应用便捷对接业界成熟的 RAG 引擎。通过 AI 网关将 Dify 的高效编排能力与专业 RAG 引擎的检索效能结合,企业可在保留现有 Dify 应用资产的同时,有效规避其内置 RAG 的局限,显著提升知识驱动型 AI 应用的生产环境表现。
3955 155
|
10月前
|
人工智能 定位技术
不读完这3000篇文献就没法写论文?你的"穷举法"正在拖垮你的科研生涯
针对科研人员面临的"文献海量增长"困境,本文提出了一种基于系统性综述方法论的AI指令方案。通过"认知跃迁"和"三种实战模式",帮助研究者从机械阅读转向精密过滤,利用AI构建高质量的学术综述框架。
565 8
|
11月前
|
人工智能 自然语言处理 数据挖掘
Python在Excel中创建与优化数据透视表的完整指南
本文介绍如何用Python结合Spire.XLS与Pandas高效创建Excel数据透视表,解决百万级数据卡顿问题。涵盖环境搭建、自动化生成、多维分析、样式优化及性能提升技巧,并结合零售、金融行业案例,展示动态更新、AI智能推荐等前沿应用,助力构建智能数据分析体系。(238字)
612 1
|
Linux 网络虚拟化 Docker
新手向导:轻松掌握Docker搭建OpenVPN
OpenVPN 是一个开源的VPN软件包,支持多种操作系统和平台。它包含社区版(免费但需具备Linux命令
7087 2
|
存储 人工智能 程序员
【C语言】一篇通关所有 “关键字”,值得收藏篇!
关键字是编程语言预定义的保留词,代表特定的操作或结构。C语言中的关键字用于定义变量类型、控制语句、存储类、数据类型等。使用这些关键字可以创建函数、控制程序的流程、声明变量和常量等。
2790 0