4. 系统架构设计:分层架构与微服务拆分
高并发评分通道的核心挑战在于:瞬时流量峰值高、评分逻辑复杂、数据一致性要求严格。本章将围绕“分层架构”与“微服务拆分”两大主题,构建一个可水平扩展、高内聚低耦合的系统架构。
4.1 分层架构设计(接入层、逻辑层、数据层)
我们将系统划分为三个清晰的层次,每一层只关注特定的职责,通过标准接口进行通信。这种分层方式能够有效隔离变更、提升可维护性,并允许各层独立进行水平扩展。
| 层次 | 核心职责 | 关键组件 | 扩展策略 |
|---|---|---|---|
| 接入层 | 流量入口、协议转换、安全防护、限流熔断 | Nginx / OpenResty、API Gateway (Kong / Spring Cloud Gateway)、WAF | DNS 轮询 + 横向扩展 Nginx 节点 |
| 逻辑层 | 业务编排、评分计算、状态流转、缓存管理 | 微服务集群 (Spring Boot / Go)、消息队列 (Kafka / RocketMQ)、分布式缓存 (Redis Cluster) | 基于服务发现与负载均衡的横向扩展 |
| 数据层 | 数据持久化、一致性保障、读写分离、分库分表 | MySQL / PostgreSQL (主从)、TiDB / OceanBase、Elasticsearch、对象存储 (MinIO) | 读写分离 + 分片集群 + 冷热数据分离 |
设计原则: 接入层只做“转发与过滤”,不参与任何业务逻辑;逻辑层只做“计算与状态管理”,不直接操作数据库;数据层只做“存储与查询”,不感知上游业务细节。
4.2 微服务拆分原则
在逻辑层内部,我们采用微服务架构。拆分粒度直接决定了系统的复杂度与弹性。以下是针对评分通道场景的拆分原则:
- 业务边界原则: 按“领域”拆分,每个服务拥有完整的业务能力。例如:用户服务、评分服务、订单服务、通知服务。
- 数据主权原则: 每个微服务独享自己的数据库实例或 Schema,禁止跨服务直接访问数据库,只能通过 API 调用。
- 弹性与隔离原则: 高 I/O 密集型服务(如评分计算)与低延迟服务(如用户查询)必须分离,避免相互影响。
- 无状态化原则: 逻辑层服务尽量保持无状态,将会话状态下沉到 Redis 或数据库,便于水平扩展。
- 异步化原则: 非核心链路(如发送通知、记录日志)通过消息队列异步处理,降低核心链路的响应时间。
评分通道微服务清单(示例):
- gateway-service: 统一入口,鉴权、限流、路由。
- user-service: 用户身份、权限、积分查询。
- scoring-service: 核心评分引擎,负责规则匹配与分数计算。
- order-service: 评分订单的创建、状态流转与结果回写。
- notification-service: 短信、邮件、站内信推送。
- audit-service: 评分日志记录与审计追溯。
4.3 整体架构图
下图展示了评分通道系统的完整分层架构与微服务部署关系。流量从用户端发起,经过接入层过滤,到达逻辑层的微服务集群,最终由数据层提供持久化支持。
关键约束: 逻辑层中的 Scoring Service 是核心瓶颈点。必须独立部署,并配置独立的线程池与连接池。禁止与其他服务共享线程资源,防止评分计算阻塞导致整个集群雪崩。
4.4 数据流与调用链路
一次完整的评分请求,其数据流经过以下步骤:
- 用户请求 → 接入层 Nginx 进行 SSL 卸载与限流。
- 接入层 → 转发至 API Gateway,Gateway 完成鉴权与路由。
- Gateway → 调用 User Service 验证用户身份与权限。
- Gateway → 调用 Scoring Service 执行评分计算。
- Scoring Service → 从 Redis 读取评分规则缓存,从 MySQL 读取基础数据。
- Scoring Service → 计算完成后,将结果写入 Order Service 进行持久化。
- Order Service → 发送异步消息到 Kafka,由 Notification Service 与 Audit Service 消费。
性能指标参考(单次评分请求):
- 接入层延迟:< 2ms
- 逻辑层计算延迟:< 50ms(含缓存命中)
- 数据层查询延迟:< 10ms(Redis) / < 30ms(MySQL 主键查询)
- 端到端 P99 延迟:< 200ms
4.5 架构决策记录
| 决策点 | 选项 | 最终选择 | 理由 |
|---|---|---|---|
| 接入层负载均衡 | LVS / Nginx / HAProxy | Nginx + Keepalived | 配置灵活、社区生态丰富、支持 Lua 扩展 |
| 服务间通信 | gRPC / REST / Dubbo | gRPC (内部) + REST (外部) | 内部调用追求低延迟与强类型;外部兼容性优先 |
| 评分规则存储 | MySQL / Redis / 配置文件 | Redis + MySQL 双写 | Redis 提供热加载与毫秒级读取,MySQL 保证持久化 |
| 分布式事务 | Seata / 本地消息表 / TCC | 本地消息表 + 最终一致性 | 避免强事务对核心链路的性能损耗 |