
后端架构的选择往往决定了你的日常工作是痛苦还是愉快。随着应用程序的增长,最初选择的裂痕开始显现,你被迫做出决定:是坚持使用可靠的单体架构,还是将所有内容拆分为微服务?
没有银弹。这两种方法都有一席之地,“正确”的选择往往更多地取决于你的团队结构和业务阶段,而不是纯粹的技术优势。让我们来看看这两个主要的竞争者,以及第三种通常最有效的务实中间路线。
微服务背后的想法很简单:与其构建一个巨大的应用程序,不如构建一组小型、独立的服务。每个服务都专注于做好一件事。
可以把它想象成一个去中心化的团队。每个服务管理自己的数据库,并且可以在准备好时随时部署,无需征求其他人的许可。如果计费团队想使用 Go,而认证团队喜欢 Rust,他们都可以按自己的方式行事。这种自主性促进了创新和速度——至少在理论上是这样。
在实践中,这对于拥有 500 名开发人员的大型组织来说非常棒,因为协调单个版本的发布简直是一场噩梦。
单体架构是传统的方法:一个代码库,一个应用程序,一次部署。所有东西——从用户界面到业务逻辑和数据访问——都生活在一起。
虽然“单体”在某些圈子里几乎成了一个脏话,但它具有不可否认的优势。它很简单。你不需要地图就能找到函数定义的位置。部署只是一个脚本。对于中小型团队来说,这种简单性是一种超能力。它让你能够快速行动,而不会陷入基础设施的复杂性中。
中小型公司中常见的一个反模式是,最终拥有的微服务数量超过了工程师的数量。我见过拥有 100 名工程师的组织试图维护 300 多个服务,结果绝对是混乱的。
当你跨过这个门槛时,许多服务不再有明确的所有者,或者所有者继承了服务却因为组织重组而完全不了解上下文。你还会花费更多时间更新所有仓库中的依赖项以清除漏洞。为了有效地运行微服务,你需要一个专门的平台团队和对工具的大量投资。大多数初创公司根本没有资源来构建这种基础设施,将他们的“敏捷”架构变成了一场维护噩梦。
不要因为流行而选择某种架构。选择它是为了解决你当前的问题。
选择微服务,如果:
选择单体架构,如果:
秘诀在于:你不必直接跳到微服务。事实上,你可能不应该这样做。
模块化单体 (Modular Monolith) 是一个很好的中间地带。你构建一个可部署单元,但在内部,你在模块之间强制执行严格的边界。模块 A 中的代码不能直接导入 模块 B 中的代码;它必须通过定义的公共接口。这为你提供了微服务的代码组织优势,而没有基础设施的开销。
随着应用程序的增长,你可以剥离那些需要独立的部分。
“微服务 vs 单体架构”的辩论往往抓不住重点。重点不在于哪种架构在理论上更优越,而在于你现在可以接受哪一组权衡。
从一个结构良好的单体应用开始。当你感到痛苦时再进行拆分,而不是在那之前。未来的你(以及你的 DevOps 团队)会感谢你的。
© Melvin Laplanche - All rights reserved.