不懂拆分的架构师,如何谈架构设计

前言:架构设计不仅仅是一门技术,更是一种在不确定性中寻找确定性、在复杂性中构建秩序的工程。通过实际项目来积累经验,但这种方式往往代价高昂且耗时。 本系列将深入剖析一套系统化的架构设计方法论。

架构设计技术方法

架构设计的核心目标永远都不是追求技术的 "高大上",而是构建一套具备可扩展、高可用、高弹性 的韧性架构体系。这些技术包括 "拆分与可扩展、主动发现、负载均衡、过载保护、灰度、自动化、柔性"等系统设计方法。

而本文主要谈论的是拆分,拆分在架构设计中至关重要。

拆分的决策依据

业务模式的深刻理解

技术是为业务服务的,再牛的技术没有业务最后也一样毫无价值。曾经做过一个业务告警系统,但说不清切实价值,最后没有用户买单。

我们搞不清楚用户是谁、解决客户什么痛点、带来什么价值,就埋头开干,最后还是会以失败收场。

组织架构决定系统架构(康威定律) : 例如,重构一个复杂的遗留系统,仅修改代码是不够的,通常还需要调整背后的团队组织结构,打破部门墙;再比如,微服务架构,需要考虑将大团队拆分成多个小而全的自治团队。

如果一个研发部门没有设立专门的基础架构团队,那么系统往往很难演化出独立的基础服务层。系统依然可以有基础能力,比如登录、鉴权等,但常常都是和业务系统混在一起的。

拆分-业务维度的逻辑拆分

拆分并非简单的 "拆小",而是基于业务边界、数据特征与流量特性等精准拆解,最终实现 "按需扩展、故障隔离" 的目标。 另外通过拆分降低系统复杂度,通过设计预留扩展能力。

通过业务域的功能与数据应该聚合在同一单元。比如针对账号管理、角色管理统一放在 IAM 中心这一个应用里面。

好的拆分,边界清晰、扩展容易。真正做到新增业务模块时无需改动核心系统,仅扩展对应服务单元。

例如:电商系统拆分为用户、商品、订单、支付服务。

控制业务上下文边界,使得每个服务独立维护自身数据与业务逻辑,保障了新业务无限扩展,同时系统复杂度不会膨胀,也使得新增业务模块也不会改动核心应用。

演进式拆分

但我们也不得不承认另外一个事实,就是架构是演进的,不是所有的系统一开始都是将边界控制很好的。也一样会随着业务、组织发展而发展。笔者也曾经处理过一次数据共享的拆分。

一开始所有应用共享一份角色数据,随着业务、组织变大。角色的变更导致各个应用角色制约影响,后来便将其拆分升级。

这也提醒我们,数据共享对不同业务而言是一种隐患。遵循演进式原则,初期避免过细拆分,将高频交互的模块聚合在一起。

拆分案例之微服务划分

好的拆分利于扩展、但不好的拆分也会带来复杂。这里面除了上面聊的边界,还有颗粒度复杂性、组织维度等权衡。那么微服务又该如何拆分呢。一个合理的拆分方案需要综合考量业务(最核心)、技术和组织等多个维度。应该按业务域拆分,不是按技术层拆分。

再补充几个点:微服务拆分最先关注的是业务、其次是组织架构,微服务拆分不是为了"微"而"微",而是为了让团队能更敏捷地交付业务价值 ,同时保证系统的稳定性可扩展性。拆分后的基础设施CI/CD 要配套跟上。

拆分需与业务规模、团队能力、资源成本匹配,遵循 "先单体模块化、再核心服务拆分、最后非核心服务独立" 的渐进式路径。过度拆分或错误拆分将导致 "分布式灾难"。综上而言,寻找合适的平衡点。

拆分-数据维度的逻辑拆分

数据维度拆分是架构设计中最为常见且基础的拆分方式,其核心思想是将庞大的数据集合按照特定维度进行物理或逻辑上的分割,从而降低单点压力,提升系统整体性能。数据是系统的核心资产,数据的拆分策略直接决定了系统的扩展上限。

垂直和水平拆分

常见的数据拆分分为两类:垂直和水平。

水平拆分:互联网架构应对海量数据的标配,实现了系统的线性扩展能力。但同时带来了跨库Join和全局聚合等难题。

垂直拆分: 将不同的业务表拆分到独立的数据库中,也可以是将大字段(如文本、图片存储路径)与核心字段分离。

延伸:区分热数据、温数据、冷数据。 冷数据存对象存储。提升了热数据访问效率,另外避免全量存储的资源浪费。

数据聚合方案

针对分库分表引入的问题,分库分表后COUNT/SUM/AVG/GROUP BY/ORDER BY/LIMIT 等聚合查询直接失效,核心原因是数据分散在多库多表,无法单机内存 / 单机索引完成全局计算。当然也就有对应的成熟方案。

方案 实时性(粗略) 复杂度 适合场景 公司案例
应用层聚合 实时 简单 COUNT/SUM,小数据 初创 / 中小业务
Elasticsearch 秒级 多维聚合、报表、筛选 几乎所有中大厂
ClickHouse 秒~分钟级 中高 海量数据、超复杂报表 抖音、快手、B 站
OLAP 数仓 小时级 数据仓库、BI 分析 阿里、腾讯

二次拆分迁移

水平拆分,由于拆分的key,系统仍可能面临二次拆分及数据迁移的挑战。这种就跟随系统演变做好迁移即可。

最后总结

优秀的架构设计,核心是通过合理的拆分(业务域拆分、数据拆分、演进式拆分) ,在业务敏捷性与系统复杂度之间寻找最佳平衡点。

本文到此为止,感谢阅读。

相关推荐
量子罐头2 小时前
银行网络安全升级实战:四光口物理隔离架构,破解信创难题
安全·web安全·架构
用户585343788432 小时前
Harness Engineering:从 Prompt、Context 到 Agent 系统工程
人工智能·后端
ServBay2 小时前
这9个高性能的Rust库不容错过
后端·rust
兔老霸夏2 小时前
claude_agent_sdk 功能简介
架构·claude
snakeshe10102 小时前
从零理解容器化:Docker 核心原理与 Kubernetes 初探
后端
也许明天y2 小时前
Spring AI 核心原理解析:基于 1.1.4 版本拆解底层架构
java·后端·spring
舒一笑2 小时前
一文讲透 Temporal:为什么大厂都在用它做 AI 与分布式系统的“流程大脑”?
后端·程序员·llm
你听得到112 小时前
Get 这波之后,我把 Flutter 状态管理重新看了一遍:新项目到底该选谁?
前端·flutter·架构
希望永不加班3 小时前
SpringBoot 自定义 Starter:从零开发一个私有 Starter
java·spring boot·后端·spring·mybatis