标准架构设计步骤(以支付平台为例)
从业务领域分析出发,先做逻辑架构(模块划分),再定义运行架构(交互时序与通信方式),结合数据架构(一致性方案与存储策略)和高可用设计,最终落地为部署架构。 每一步都有明确的产出物(如时序图、组件图、ADR决策记录)。
1. 业务领域分析与建模
-
基于业务域:识别核心业务子域(支付域、账务域、渠道域、对账域)、支撑子域(权限、日志)及通用子域(消息通知)。
-
梳理业务流程:端到端流程(用户下单 → 支付路由 → 渠道调用 → 资金记账 → 异步通知),标注关键决策点及异常路径。
2. 逻辑架构设计(模块与组件划分)
-
分层/分区:按照职责划分模块,例如:
-
接入层:收单网关(协议转换、验签)
-
业务层:交易核心、路由引擎、渠道适配器
-
支撑层:对账服务、清算中心、账务系统
-
基础层:配置中心、注册中心、日志链路
-
-
定义组件职责:每个模块解耦,明确输入输出、依赖关系及对外接口(REST、RPC、事件)。
3. 运行架构设计(交互流程与通信方式)
-
绘制时序图/协作图:描述关键业务流程中各模块的交互顺序。
-
明确交互方式:
-
同步:收单网关 → 交易核心(RPC,要求低延迟、强一致性)
-
异步:交易核心 → 对账服务(消息队列,削峰填谷、最终一致性)
-
消息驱动:渠道回调 → 消息总线 → 交易状态更新(解耦、重试)
-
-
标注非功能约束:超时、重试策略、熔断降级边界。
4. 数据架构设计(一致性方案与存储策略)
-
数据分布:识别聚合根、事务边界,定义分库分表键(如按用户ID哈希)。
-
分布式事务方案:根据场景选择不同模式,如:
-
TCC:核心资金链路(Try 冻结 → Confirm/Cancel),确保强一致且无全局锁。
-
本地消息表 + 消息队列:非核心链路(如积分赠送),保证最终一致性。
-
-
数据一致性保障:设计补偿脚本、对账机制、幂等接口。
5. 高可用与容错设计
-
多副本:无状态服务部署 ≥3 副本,使用负载均衡(如 K8s Service + Ingress)。
-
流量削峰:消息队列缓冲突发流量(如秒杀支付),下游按能力消费。
-
渠道降级:主渠道不可用时自动切换备用渠道(如微信 → 支付宝),并配合熔断器。
-
超时与重试:设置合理超时(如渠道调用 2s),采用指数退避重试。
-
故障隔离:线程池隔离、舱壁模式,避免单点故障扩散。
6. 部署架构设计(物理视图)
-
容器编排:K8s 集群部署,配置 HPA(水平自动伸缩)、Pod 反亲和性、滚动更新策略。
-
数据存储部署:
-
读写分离:主库承担写与实时强一致性读,从库承担报表/对账等读请求。
-
分库分表:使用中间件(如 ShardingSphere-JDBC)或分布式数据库(如 TiDB)。
-
-
网络与安全:划分 VPC、设置防火墙策略、启用 TLS 双向认证。
-
监控与可观测性:集成 Prometheus + Grafana(指标)、SkyWalking(链路)、ELK(日志)。
基于前面确定的支付平台架构设计(微服务、模块划分、同步RPC+异步消息、TCC分布式事务、多副本高可用、消息削峰、渠道降级、K8s部署、读写分离+分库分表),以下是具体的技术选型及架构设计与技术选型关系的说明。
一、技术选型清单(Java技术栈)
| 架构设计要素 | 技术选型 | 选型理由 |
|---|---|---|
| 微服务架构 | Spring Cloud Alibaba (2023.x) + Dubbo 3 | 成熟、与Seata/RocketMQ生态整合好,Dubbo提供高性能RPC;同时支持服务发现(Nacos)、配置中心。 |
| 同步RPC通信 | Dubbo 3 (Triple协议) | 高性能、支持HTTP/2、流式调用、更好的云原生适配;备选:gRPC-Java。 |
| 异步消息队列 | Apache RocketMQ 5.0 | 支持事务消息(与TCC互补)、顺序消息、高吞吐、低延迟;与Seata集成方便。 |
| 分布式事务(TCC) | Seata 1.7+ (TCC模式) | Java生态最成熟的TCC实现,支持自动补偿日志、幂等、空回滚、悬挂预防;与Dubbo/Spring Cloud集成。 |
| 分库分表 | Apache ShardingSphere-JDBC 5.3 | 轻量级、支持JDBC协议透明分片,与MyBatis-Plus无缝集成,支持读写分离。 |
| 读写分离 | ShardingSphere-JDBC + MySQL主从 | 应用层配置,对业务透明;也可选Proxy模式(ShardingSphere-Proxy)。 |
| 数据库 | MySQL 8.0.33 (InnoDB) | 稳定、社区支持好,配合分库分表可支撑千万级订单。 |
| 缓存 | Redis 7.0 Cluster | 高性能、分布式、支持哨兵/集群;用于路由配置缓存、商户信息、幂等防重。 |
| 服务发现/配置中心 | Nacos 2.2 | 同时服务注册与配置管理,与Spring Cloud Alibaba完美整合。 |
| 容器编排与部署 | Kubernetes 1.28 + Docker | 多副本、HPA、滚动更新、服务发现(CoreDNS);与云原生监控对接。 |
| 链路追踪 | Apache SkyWalking 9.0 | Java探针无侵入,支持RPC/MQ/DB全链路追踪,符合支付平台可观测性需求。 |
| 监控与告警 | Prometheus + Grafana + AlertManager | 业界标准,采集K8s、JVM、中间件指标,定制支付业务大盘。 |
| 日志聚合 | ELK (Elasticsearch 8.x + Logstash + Kibana) | 集中日志检索,支持审计与故障定位。 |
| 网关 | Spring Cloud Gateway | 统一入口、路由、限流(令牌桶)、认证(JWT)、协议转换。 |
| 渠道对接客户端 | Netty + OkHttp | Netty处理高性能网关;OkHttp用于同步调用第三方渠道(连接池、超时控制)。 |
二、架构设计 vs 技术选型的关系(结合支付平台示例)
1. 架构设计为选型提供约束与方向
-
模块划分(如收单网关、交易核心、路由引擎)决定了需要API网关、RPC框架、消息解耦。
-
交互方式(同步/异步)直接要求:同步链路选高性能RPC(Dubbo/gRPC),异步链路选可靠MQ(RocketMQ)。
-
数据一致性方案(TCC) 要求选型支持TCC的协调器(Seata),若选型不支持,则架构需调整为SAGA或本地消息表。
-
高可用设计(多副本、削峰、降级)要求选型的MQ支持削峰、K8s支持副本弹性、降级方案需配置中心实时变更。
-
部署架构(K8s+读写分离+分库分表)要求选型的数据库中间件必须兼容K8s环境且支持分片透明。
2. 技术选型可反推架构微调
-
若选型RocketMQ后,发现其事务消息延迟比预期高(>100ms),则架构设计中原本要求实时一致的某些通知(如扣款成功短信)可改为本地消息表+定时轮询,弱化为最终一致性。
-
若选型Seata TCC时,性能压测显示Confirm阶段平均耗时5ms(可接受),则架构不必调整;若达到50ms,则架构需引入异步Confirm或改用SAGA。
-
若选型ShardingSphere-JDBC发现对某些复杂SQL(如跨分片JOIN)支持不佳,架构上可重新划分聚合根,避免跨分片查询,或将查询下沉到从库/数仓。
3. 二者本质关系:抽象与具体的层次递进
-
架构设计是"What"与"Why"------需要达到什么能力(如高可用、最终一致性),为什么这样划分。
-
技术选型是"How"------用什么具体工具实现这些能力。
-
好的架构设计能够让技术选型范围收敛 ,降低试错成本;而技术选型的结果会验证架构合理性 ,并可能触发架构的迭代优化。
4. 实际工作中的决策流程
text
业务流程分析 → 逻辑架构 → 运行架构 → 数据架构 → 部署架构
↓(并行) ↓(反馈)
技术选型预研(POC)← 约束条件(团队能力、成本、运维成熟度)
↓
最终选型清单
↓
若选型无法满足架构约束 → 回退修改架构设计
5. 核心结论
架构设计定义系统"必须具备的属性",技术选型寻找"具备这些属性的最佳工具"。两者在迭代中相互影响,但架构设计应保持相对稳定,技术选型则允许一定范围内的替换(如将RocketMQ换为Pulsar而不改变架构)。
用一句话总结:架构设计做正确的事,技术选型把事情做正确 。