单体、微服务、集群、高可用:把软件架构听明白

"系统要做集群""这个平台是微服务""数据库已经主从了"------这些说法经常出现在同一场会议里,却在回答不同的问题。

理解它们,先抓住三个问题:**功能怎么组织,程序在哪里运行,出故障后怎么办。**应用拆成几个部分,服务器用了几台,坏一台能否继续工作,需要分别判断。

下面用一个虚构的企业研发平台举例。它有用户管理、试验管理、文件转换、知识库几个功能。例子只用于解释原理。

一、应用如何组织

单体架构与模块化单体

如果几个功能都放在一个后端应用里,通常一起构建、一起发布,就可以叫单体应用。内部照样能分成用户模块、试验模块和文件模块,代码清楚、职责明确的做法常被称为模块化单体。

单体可以配一个 Vue 前端,也可以使用数据库、缓存和后台任务。前后端分离描述界面与服务端的分工,不能仅凭"Vue+Django"判断是否微服务。一个 Django 项目里有多个 app,也不等于多个可独立部署的服务。

单体常见的好处是部署链路较短、事务容易处理;随着业务增多,也可能出现改一个功能要发布整套应用、某个模块拖慢整体的问题。是否需要拆分,要看这些问题是否已经影响交付。

服务化与面向服务架构(SOA)

将用户管理、文件转换等能力拆成独立程序,通过接口协作,就有了服务化特征。面向服务架构(SOA)也是按服务组织能力的一类思路,常用于不同系统之间的集成;实际边界和粒度因项目而异。

微服务架构

微服务更强调围绕业务能力划分边界,服务能独立部署和演进。判断时可以看下面这些问题,而不是数容器有几个。微软的微服务架构说明

判断问题 它说明什么
文件服务升级时,其他服务能否保持运行? 发布是否独立
文件任务增多时,能否只增加文件服务的副本? 扩容是否独立
其他系统通过接口获取用户信息,还是直接改用户表? 数据和接口边界是否清楚
一个服务失败后,其他服务会不会一直等待并拖垮? 故障是否有隔离措施

"微"没有统一的代码行数标准。多个完整业务系统通过网关连接,可能是多应用集成或较大粒度的服务化架构;若各系统内部又分别作为一个整体发布,也可以形成多个单体应用互联的形态。共享数据库会增加耦合,但还要看是否共享表、谁能修改数据、表结构变更是否迫使各方同时发布。

二、程序如何部署

分布式部署

数据库、业务程序、文件存储分别运行在不同节点并通过网络协作,就是典型的分布式场景。微服务经常采用分布式部署,但分布式系统也可能是一个单体应用配远程数据库。分布式带来扩展空间,也带来网络超时、部分失败、数据一致性等问题。

集群部署

集群可以先理解成一组共同承担任务的节点或实例。它们可能一起分担请求,也可能一个工作、其他接班,还可能把数据拆开保存。不同产品的"集群"工作方式差别很大。

听到的说法 具体可能是什么
应用集群 同一应用运行多个实例,共同处理请求
数据库集群 数据库节点复制或分片,按规则读写、切换
Kubernetes 集群 一组机器由统一控制面管理容器任务
计算集群 多个节点协同执行计算任务

"三台服务器"本身不能说明集群能力。如果三台机器各自运行互不相关的软件,更适合直接称为多服务器部署。讨论集群时,还要问成员关系、任务分配、健康检查和故障处理。

实例、节点与副本

实例通常指一份正在运行的程序;节点通常指系统中的一个运行成员,例如一台物理机或虚拟机;副本指同一服务或数据的另一份。具体含义要结合产品,比如数据库副本与应用副本承担的职责不同。

同一台服务器运行三个应用副本,可以分担部分请求,也能应对某个进程退出;整台服务器断电时,它们仍会一起停止。要防服务器故障,副本需要分布在不同机器上;要防机房故障,还要进一步考虑跨机房部署和数据、网络等依赖。

路由与负载均衡

网关看到"用户接口",转给用户服务;看到"文件接口",转给文件服务,这是路由。如果文件服务有三个健康实例,入口再把请求分配给它们,这是负载均衡。APISIX、Nginx 都能承担其中一些工作,实际能力取决于配置。

因此,使用 APISIX 不能单独证明是微服务架构。网关可以连接多个完整应用,也可以连接细分服务。给一个上游配置了轮询算法,但它只有一个实例,也没有获得多副本容错能力。APISIX 官方上游说明

三、故障后如何继续运行

高可用与单点故障

高可用(HA,High Availability)关注故障发生后服务是否能继续提供,以及恢复需要多久。它通常依赖冗余、故障检测、切换和恢复机制。

即使业务程序有三份,如果网关只有一个、数据库只有一个,或者文件仅保存在某台机器的本地目录,这些依赖仍可能让整套服务中断。这样独一份、坏了便影响整体的关键环节,就叫单点故障。

讨论高可用时,具体问题比标签更有用:停掉一台机器后谁接管?需要人工操作吗?用户要重新登录吗?正在上传的文件和进行中的任务怎么办?是否做过切换演练?

主从复制、读写分离、分片与备份

名词 主要作用 需要注意
主从复制 把主库变更复制到副本 可能有延迟,切换能力需另行配置
读写分离 写请求去主库,部分读请求去副本 刚写入的数据可能暂时读不到
分片 将不同数据分配给不同节点 查询与事务可能跨节点
备份 保存可恢复的数据版本 必须确认恢复方法和恢复所需时间

复制不能直接替代备份:如果误删操作也被复制,副本同样可能丢失数据。MySQL 支持不同复制方式,异步复制也是常见方式,不能听见"主从"就默认副本始终与主库完全同步。MySQL 官方复制说明

四、常用部署与性能工具

Docker 与 Kubernetes

Docker 容器提供相对隔离的运行环境,镜像打包应用及所需文件。Docker 官方容器介绍 Kubernetes,常缩写为 K8s,负责在节点上调度和管理容器化应用;它的集群由控制面与工作节点组成。Kubernetes 官方架构说明

它们都能运行单体或微服务。安装 Kubernetes 后,还需要配置副本、健康检查、持久化存储、访问入口等。基础平台能够帮助恢复程序,业务本身是否能正确恢复仍要设计。

扩容、异步任务与缓存

名词 直观理解 适用问题
纵向扩容 给原机器增加资源 单机能力不足
横向扩容 增加实例或机器 请求或任务可分摊
异步任务 先接收任务,后台处理 文件转换等耗时工作
消息队列 任务先排队,消费者陆续处理 流量波动、任务解耦
缓存 暂存可复用结果 减少重复计算或查询

横向扩容尤其需要考虑状态。登录会话、上传文件、任务进度如果只存在某个实例里,换一个实例处理请求就可能找不到。缓存还要考虑失效,异步任务还要考虑失败重试和重复执行;这些机制需要配合业务规则。

五、怎样判断一个系统的架构

看架构图或听方案介绍时,可以按下面三个维度判断。一个系统可以同时具有多种特征。

维度 需要确认的问题
应用组织 哪些功能一起发布?哪些服务能独立发布和扩容?数据由谁管理?
运行部署 有多少实例?分布在哪些机器上?请求和任务如何分配?
故障恢复 坏一个节点后谁接管?是否需要人工切换?数据能恢复到哪个时间点?

例如,"模块化单体+多实例部署+数据库主从"是一种可以成立的组合。是否具备高可用,还要继续检查访问入口、数据存储和故障切换机制。

相关推荐
Ikalus19881 小时前
四枚 JWT 全部验签通过,两个被算成了同一个人——错在 sub 少了 iss
安全·架构
智驭未来掌门人2 小时前
架构师笔记:问卷调查的重要性
架构
吴佳浩 Alben2 小时前
一文讲透推理引擎性能指标:TTFT、TPOT、KV命中率、并发,到底对应 vLLM / SGLang 的哪个参数?
人工智能·python·语言模型·架构·ai编程·vllm·sglang
ting94520002 小时前
Kilo Code for JetBrains 深度技术剖析:原生开源编程智能体内部实现与工程实践
人工智能·架构·开源
淡海水3 小时前
03-02-架构篇-Boehm GC架构解析
unity·架构·c#·gc·boehm
海姐软件测试3 小时前
IT疑难杂症诊疗室:从故障现象到根因定位的实战指南
架构
mldong4 小时前
工作流引擎的委托代批:一张单,两个办理人
后端·架构
Joy T9 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
微订校园外卖平台12 小时前
同城外卖小程序开发:校园外卖系统四端架构与订单链路拆解
架构·外卖系统·本地生活·微订