微服务与分布式架构

这部分不是让你背“微服务优点”,而是让你能把它和自己的项目挂上。

你最稳的定位是:

我做过的很多系统虽然不一定是我从零搭起整套微服务平台,但我长期在多服务协同、服务边界划分、接口契约、异步解耦、状态一致性和联调治理里做方案和落地。

一、什么情况下要拆微服务

标准回答

不是业务一复杂就一定拆微服务,而是要看几个维度:

  • 业务边界是否清晰
  • 团队协作是否已经被单体拖慢
  • 不同模块的扩缩容需求是否明显不同
  • 不同链路的技术栈是否有差异
  • 发布频率和变更风险是否已经影响整体系统

面试更稳的说法

我理解微服务不是“拆得越多越高级”,而是当单体已经在研发协作、发布节奏、性能隔离和业务边界上形成明显阻碍时,再拆才有价值。

结合你的项目怎么讲

  • 海外业务平台里,识别鉴定、订阅支付、后台配置、报表归因,本身就是不同性质的链路
  • 推广 ROI 线里,原始事件接入、Kafka 消费、回传处理、报表分析,也天然适合分层
  • 你不是先按语言拆,而是先按职责拆,再决定哪些更适合 Go 服务,哪些继续放 PHP

二、服务拆分原则

你可以直接说

我拆服务时一般看 5 件事:

  1. 业务边界
  2. 数据边界
  3. 调用频率和实时性
  4. 发布节奏
  5. 团队 ownership

典型例子

海外业务平台

  • 识别 / 鉴定能力层
  • 订阅支付退款层
  • 后台与运营配置层
  • 报表与归因层

推广 ROI 线

  • 原始点击曝光接入层
  • 实时归因与行为回传层
  • 规则配置与后台层
  • 报表分析层

面试官喜欢的表达

我不会按“功能菜单”拆服务,而是按业务闭环、数据特征和运行特性拆。这样后续扩容、治理和定位问题都更清楚。

三、同步和异步怎么选

什么时候同步

  • 必须立即返回用户结果
  • 结果对当前请求强依赖
  • 链路短,失败可直接反馈

什么时候异步

  • 可以延迟处理
  • 链路长
  • 容易被峰值放大
  • 涉及多个下游系统
  • 有重试和补偿价值

结合你的项目怎么讲

在推广 ROI 项目里,如果把点击处理、归因、回传、报表更新全放同步链路,高峰期接口会很重,所以会通过 Kafka 解耦,让主流程只承接必须实时完成的部分。

四、多服务需求怎么做方案

你可以直接背

一个需求涉及多个服务时,我一般先做 5 个产物:

  1. 业务链路图
  2. 服务职责表
  3. 接口契约清单
  4. 联调测试矩阵
  5. 关键日志和 trace 方案

进一步展开

1. 先梳理链路

  • 哪些服务参与
  • 哪些是主状态
  • 哪些是派生状态
  • 哪些地方同步
  • 哪些地方异步

2. 接口契约先行

  • 请求字段
  • 响应字段
  • 状态枚举
  • 错误码
  • 幂等规则
  • 超时和重试约定

3. 分段联调

  • 先 mock
  • 再本服务自测
  • 再上下游分段联调
  • 最后跑全链路

4. 可观测性先补齐

  • traceId
  • 入口日志
  • 状态变化日志
  • 消息发送 / 消费日志
  • 告警指标

五、分布式事务怎么理解

不要一上来就讲两阶段提交

更稳的说法是:

分布式事务的核心不是“怎么强行让所有服务一起成功”,而是先看业务是否真的需要强一致,很多业务更适合最终一致性。

常见方案

  • 本地事务 + 消息
  • Outbox
  • 事务消息
  • Saga
  • 补偿机制
  • 幂等控制

结合你的项目怎么讲

像支付成功后更新订单状态、发放权益、写报表、发通知,这类后续动作不一定都放一个大事务里,更合理的是订单主状态先落库,再通过消息和补偿机制推进后续链路。

六、幂等为什么重要

典型场景

  • 支付回调重复
  • Kafka 重复消费
  • 重试请求
  • 用户重复提交
  • 外部平台重复通知

你可以怎么答

我会先定义唯一键和幂等边界,再通过 Redis、数据库唯一约束或者条件更新做幂等控制。很多系统问题不是“少处理一次”,而是“乱处理一次”。

七、服务治理要点

必须准备

  • 注册发现
  • 配置中心
  • 超时
  • 重试
  • 限流
  • 熔断
  • 链路追踪
  • 降级

面试可说

微服务真正难的不是拆出来,而是拆出来以后如何治理。没有超时、重试、限流、trace 和配置治理,拆得越多问题越多。

八、技术总监最喜欢的问法和回答

1. 为什么这个系统要拆微服务

因为不同模块的业务边界、吞吐特征和发布节奏已经不同了。比如推广链路里的行为回传和报表刷新,和后台规则配置不是一类系统,继续混在一起会让扩容、故障隔离和发布都变差。

2. 你拆服务时最看重什么

我最看重业务边界、数据边界和运行特性。不是按页面拆,也不是按语言拆,而是看这段链路是不是独立闭环、是否有明显不同的吞吐和治理需求。

3. 多服务联调最容易出什么问题

不是代码写不出来,而是接口契约理解不一致、状态定义冲突、超时和重试策略不一致,最后联调阶段才集中爆出来。所以我更喜欢契约先行和分段联调。

九、你最适合背的总结句

我做微服务和分布式方案时,重点不是追求拆得多,而是看业务边界、数据边界和链路治理。我的经验更多在复杂业务系统落地,包括多服务职责划分、接口契约、同步异步拆分、幂等、补偿和联调治理,这些在海外业务平台和推广 ROI 线里都实际做过。