加载中...

本篇要搞懂的 10 件事:分布式架构落地时绕不开的 10 个工程问题——选什么分布式数据库、分库主键怎么定、数据怎么同步、跨库怎么查、热点数据怎么扛、前后序数据怎么关联、数据中台怎么建、BFF 干什么、什么时候上分布式事务、多活怎么设计。
⚠️ 这是总结课,以 10 个问答形式覆盖分布式架构关键设计,每问先给一句话答案再展开,没有配图。

承接前文:前面的课讲的是「怎么把业务建成领域模型、拆成微服务」(领域建模、微服务设计、前端设计),这是业务侧的方法论。但中台几乎都跑在分布式微服务架构上,业务拆完之后,工程上还有一堆硬骨头要啃——数据被切成八块怎么查、跨服务改数据怎么保证一致、热点数据怎么扛住并发、机房挂了怎么不停服。20 讲就是把这些工程侧的坑列成 10 个问题,逐个给思路。可以理解为:前面教你「画图纸」,这一讲教你「图纸落地时会踩的雷」。


一、选什么样的分布式数据库?

一句话答案:看你的「钱 + 团队能力 + 业务复杂度」三件套,分别对应三档方案,从重到轻。

分布式数据库的核心套路都是数据多副本——同一份数据存好几份,靠这个实现高性能、多活和容灾。三种方案的区别就在于「副本怎么处理」和「有没有数据库中间件」:

方案 怎么干 代表产品 适合谁
① 一体化分布式数据库 数据库自己搞定多副本,多用 Paxos 协议,写多数副本成功就算成功 OceanBase、高斯 大厂,要云底座,成本高、门槛高
② 集中式数据库 + 数据库中间件 中间件管数据路由和全局数据,数据库靠自身同步机制保证副本一致 MyCat+MySQL、TBase(基于 PostgreSQL) 中大型企业,成本/能力适中
③ 集中式数据库 + 分库类库 一个 JAR 包跟应用部署在一起,管路由和归集 ShardingSphere 简单读写场景,成本最低,但强一致和聚合分析弱

🪞 辅助理解:这三档就像「自动挡豪车 / 手动挡家用车 / 加装外挂的二手车」。一体化数据库是开箱即用但贵;中间件方案是自己攒一套够用的;分库类库是给现成数据库塞个小插件凑合用。没有最好,只有最匹配你预算和团队的。

💡 选型口诀:先掂量自身能力、成本、业务需要这三样,别盲目抄大厂。大厂的方案是给大厂的体量和钱包准备的。

二、如何设计数据库分库主键?

一句话答案:和客户打交道的关键业务,建议拿客户 ID当分库主键。

把同一个客户的数据全塞进同一个数据单元里,好处是避免「跨数据单元频繁访问」——而跨数据中心的服务调用、跨数据单元的查询,对性能是致命的。

🪞 辅助理解:分库主键就像图书馆给书分区的规则。如果按「同一个客户」分区,那这个客户的所有书都在一个书架上,一次就拿全了;如果乱分,你得满图书馆跑断腿。「以客户为中心」的业务能力,第一步就是数据上做到「以客户为中心」。

💡 不一定非得用客户 ID,也可以按机构、用户等业务属性分。关键是让高频一起访问的数据落在同一单元

三、数据库之间怎么同步和复制?

一句话答案:抛弃慢吞吞的 ETL,改用基于数据库日志的增量捕获技术 CDC

微服务把数据切碎了,要整合就离不开库与库之间的批量同步与复制(用于数据迁移、备份、往数据中台汇集、多主题整合等)。

方式 特点
传统 ETL / 定时提数 时效性差,是「批处理」式的延迟
CDC(增量数据捕获) 读数据库逻辑日志拿增量,准实时,数据处理与应用逻辑解耦,用起来简单

💡 CDC 不只用来同步数据,它还能在领域事件驱动设计里当「领域事件增量数据」的获取手段——业务一改库,日志里就有增量,顺手就发成领域事件了。PostgreSQL 和 MySQL 外围有大量现成的日志捕获组件。

四、跨库关联查询如何处理?

一句话答案:别硬跨库 join,提前把数据「搬到一起」——大场景建主题库,小场景做小表广播。

跨库关联查询是分布式数据库的天生短板。实体被拆到不同微服务后,业务上又免不了要关联查。分两类场景,两套打法:

场景 例子 解法
① 主题/维度查询(跨多业务线微服务) 客户全业务视图 面向主题的分布式数据库,用 CDC 把各微服务数据准实时汇过来,提前做好关联(合成宽表)或建数据模型,再建查询微服务
② 表与表关联(小表 + 大表分散在不同服务) 机构表 join 业务表 小表广播:在业务库里放一张冗余的代码副表;主表一变,靠领域事件异步刷新所有副表

🪞 辅助理解:跨库 join 就像你要查「学生 + 他选的课」,但学生名单在 A 楼、课表在 B 楼。硬查就得两楼来回跑。聪明做法是:要么提前把两份名单合并誊到一张大表里(宽表/主题库),要么把那张不常变的「课程代码表」复印一份贴到 A 楼墙上(小表广播)——查的时候就地解决,不跑腿。

五、如何处理高频热点数据?

一句话答案:把高频热点数据(商品、机构等代码类)从数据库挪到 Redis 缓存里扛并发。

这类数据同时被多个应用读,并发高,直接怼数据库会把库压垮。挪到缓存后既降库压力、又提访问速度。需要模糊查询的,还可以上 ElasticSearch 这类搜索引擎。

🪞 辅助理解:原文那句很妙——缓存就像调味料,投入小、见效快,用户体验提升快。撒一把就能让一盘菜(系统响应)立刻好吃很多,成本却很低。

六、前后序业务数据怎么处理?

一句话答案:靠领域事件把前序数据「冗余」一份到当前微服务,按需设计成值对象或实体。

很多数据要关联前一道工序的微服务数据:投保单关联前序投保单、运输单关联前序订单。但数据散在前序微服务的库里,没法直接跨库建关联。

办法:前后序数据一般都跟领域事件挂钩,通过领域事件实体把前序数据传输并冗余到当前微服务库里。冗余进来后,怎么设计有讲究:

前序数据情况 设计成 理由
只整体修改,不查询/不统计 值对象 当个整体引用就够了
多条数据,还要查询/统计分析 实体 能当查询条件,在本地做多维查询

💡 收益:在本地微服务一次就能拿全「前序清单 + 当前单据」反馈给前端,减少跨微服务调用;只有真要明细时才回前序微服务捞。既保数据完整,又降依赖、提性能。

七、数据中台与企业级数据集成

一句话答案:微服务拆库会拆出一堆「数据孤岛」,用数据中台三步把数据重新融合起来。

分布式架构提升了弹性和高可用,代价是原本集中的数据被拆散成孤岛,企业级用数据变难。数据中台分三步建:

步骤 做什么
第一步:汇集存储 按统一数据标准,把各微服务/各渠道的数据汇集起来,解决孤岛和初级共享
第二步:主题建模 按主题/场景加工数据,建面向不同主题的视图(客户视图、代理人视图、渠道视图…)
第三步:需求驱动 建业务需求驱动的数据体系,支撑业务和商业模式创新

💡 别把数据中台理解成「只做分析」。它也能支撑交易型场景——建在数据仓库/数据平台上,平台化之后直接喂给前台业务用。

八、BFF 与企业级业务编排协同

一句话答案:在微服务和前端之间加一层 BFF,专门干「跨微服务的协调编排 + 适配前端」。

企业级流程往往要多个微服务协作完成,每个微服务像积木块只管自己那一摊。谁来组织它们?BFF(Backend for Frontends,服务于前端的后端)。

它和微服务内部的「应用服务」都在做组合编排,区别在层级:

应用服务 BFF
位置 微服务内部 中台微服务之上
管什么 微服务内的服务组合编排 微服务之间的协调 + 适配前端
怎么发版 跟随微服务 可随前端版本协同发布

🪞 辅助理解:BFF 像汽车里的变速齿轮,夹在「善变的前端」和「要稳的中台微服务」之间适配步调。前端需求一变,改 BFF 就行,不用去动底下的中台微服务——这样核心领域逻辑才能保持稳定。

💡 设计原则:尽量把可复用的能力往下层沉淀,既复用又避免跨中心调用。BFF 做强了,它本身就是个「集成多中台能力、面向多渠道」的业务能力平台。

九、分布式事务还是事件驱动?

一句话答案:实时强一致才上分布式事务(且尽量避免),非实时的最终一致首选领域事件驱动

一个操作动了多个微服务的数据,就有一致性问题。一致性分两种,代价完全不同:

强一致性 最终一致性
方案 分布式事务 领域事件驱动(异步)
适用 实时性要求高的场景 非实时场景
代价 性能代价,复杂 解耦、削峰填谷、可读写分离
建议 设计时平衡拆分/一致性/性能/复杂度,尽量避免 推荐(基于消息中间件的事件发布订阅)

🪞 辅助理解:分布式事务像「几个人必须同时按下按钮才生效」——只要有一个慢了/卡了,所有人都得等,强但累。事件驱动像「群里发个通知,大家各自异步去办」——发完就走,办完总会办好(最终一致),系统轻快得多。也可以类比成:强一致像「同步加锁」,事件驱动像「消息队列异步解耦」。

💡 实战取向:能不用分布式事务就不用。多数业务场景其实接受得了「过几秒就一致」,那就老老实实用领域事件削峰解耦,性能和扩展性都赚到。

十、多中心多活怎么设计?

一句话答案:多活是个超复杂的系统工程,记住四个关键设计:选对数据库、单元化、访问路由、全局配置同步。

关键设计 要点
① 选合适的分布式数据库 支持多数据中心部署、多副本、底层复制同步、数据恢复时效
② 单元化架构 一组应用打包成「业务单元」当部署单位;单元业务自包含(流程在本单元内闭环)、数据多中心有副本、单元故障不互相影响。尽量避免跨中心/跨单元调用
③ 访问路由 接入层 / 应用层 / 数据层都要路由,确保请求准确到达对应的数据中心和业务单元
④ 全局配置数据管理 各中心全局配置统一管理、实时同步、保持一致

🪞 辅助理解:单元化就像连锁餐厅——每家分店(业务单元)都能独立做完一整顿饭,不用跑去别的分店借厨具(跨中心调用)。一家店停电了,其他店照常营业(故障隔离);而总部的菜单(全局配置)每家店实时同步、保持一致。

总结

这一讲把分布式架构落地时绕不开的工程难题列成了 10 问。可以归成几条主线:

  • 数据怎么存:选数据库(一体化 / 中间件 / 分库类库,看预算和能力)、分库主键(以客户为中心)。
  • 数据怎么流通和查:CDC 做准实时同步;跨库查靠主题库(宽表)和小表广播,核心思路都是「提前把数据搬到一起,别临时硬跨库」;前后序数据靠领域事件冗余过来。
  • 数据怎么扛压力:热点数据进 Redis 缓存(投入小见效快)。
  • 数据怎么整合和编排:数据中台三步融合孤岛;BFF 当变速齿轮做跨微服务编排 + 前端适配。
  • 怎么保一致、保高可用:能不用分布式事务就用事件驱动(最终一致);高可用靠多活四件套(选库 / 单元化 / 路由 / 全局配置)。

一句话:业务建模教你怎么拆,这一讲教你拆完之后数据散了、调用远了、机房会挂,工程上怎么补回来。

一句话速记

数据散了就提前搬到一起(主题库/小表广播/事件冗余),压力大了进缓存,一致性能用事件就别用分布式事务,高可用靠单元化多活,跨服务编排交给 BFF。

思考题

你设计过或读过一套跑在多个微服务上的系统(哪怕是练手项目或开源项目),试着用这 10 问给它「体检」:

  • 如果你让 AI 帮你写一段「下单 + 扣库存」跨两个服务的代码,它默认给你的是分布式事务还是事件驱动?哪种更适合你的场景,你能讲清理由、而不是照单全收吗?
  • 你的项目里有没有「跨库 join」?是临时硬查,还是用了宽表 / 小表广播 / 事件冗余把数据提前搬到一起?
  • 站在数据一致性与运维的角度想一想:数据冗余到多个微服务、缓存里放热点数据、CDC 抓数据库日志——这几处分别会带来哪些数据不一致 / 数据延迟的风险?你会怎么兜底?
公告栏
这是我的个人知识库。
记录技术,也记录生活 —— 读过的、试过的、想明白的,都堆在这儿。
最新文章
网站资讯
文章数目 :
5
已运行时间 :
本站总字数 :
15.7k
本站访客数 :
本站总访问量 :
最后更新时间 :
全局知识图谱
当前页面 已访问 文章 标签
ESC 关闭 · 滚轮缩放 · 拖拽移动 · Ctrl+G 开关