目录
一、分布式设计
1. 微服务拆分
2. 分布式事务
3. 分布式定时任务
4. 分布式长连接(WebSocket)
5. 分布式 ID
6. 分布式链路追踪
二、三高设计(高并发、高可用、高性能)
高并发
高可用
高性能
三、缓存设计 Redis
1. 缓存内容
2. 缓存策略
3. 注意点
四、AI 模块设计(Spring‑AI 集成)
1. RAG 知识库
2. Agent + Function Calling
3. AI 异常分析
4. 约束
五、大数据量设计
1. 数据分层
2. 分库分表 Sharding‑JDBC
3. 上报时序海量测点数据处理
4. Canal 数据同步
5. 报表统计大数据计算
6. 查询兼容
六、核心风险汇总
业务背景:面向充电桩场站、车主用户、运营管理端;核心业务包含设备长连接上报充电数据、订单创建、峰谷分时计价、异常订单处理、订单结算、设备监控、报表统计。 技术栈:SpringCloud Alibaba (Nacos、Sentinel、Gateway、Feign、Seata)、RocketMQ、Redis、Canal、Elasticsearch、Sharding‑JDBC、Spring‑AI、XXL‑Job、WebSocket、SkyWalking、MySQL。 下面从分布式、三高、缓存、AI、大数据量五个维度展开设计,附带业务落地、技术选型、风险点与关键实现思路。
一、分布式设计
1. 微服务拆分
| 服务模块 | 职责 |
|---|---|
| 网关服务 Gateway | 统一入口、鉴权、限流、路由、请求日志 |
| 用户服务 | 车主账号、场站管理员、权限 |
| 设备服务 | 充电桩设备管理、设备状态、WebSocket 长连接管理 |
| 订单服务 | 充电订单创建、状态流转、异常订单修复、结算 |
| 计价服务 | 峰谷电价、服务费计算、跨时段充电价格拆分,BigDecimal 高精度计价 |
| 账单结算服务 | 账单生成、对账、资金流水 |
| 告警监控服务 | 设备故障、充电异常、阈值告警推送 |
| 统计报表服务 | 场站运营、充电量、营收统计 |
注册配置中心:Nacos,服务注册发现 + 动态配置(电价规则、告警阈值动态下发,无需重启服务)。
2. 分布式事务
充电业务:设备上报开始充电 → 创建订单 → 扣预授权;充电结束 → 计算费用 → 生成账单。
- 核心场景:订单、账单、资金流水跨库操作,使用Seata AT 模式;
- 非强一致场景(设备状态更新、日志):RocketMQ 最终一致性,避免大事务锁表。
- 防悬挂、空回滚配置开启;事务超时时间根据充电业务设置,充电可能持续数小时,长流程不使用 Seata 长事务,拆成本地事务 + 消息补偿。
3. 分布式定时任务
使用 XXL‑Job:
- 异常订单扫描修复:处理充电桩离线、上报断连导致订单状态僵死;
- 过期预授权释放;
- 统计报表离线计算;
- 分布式防重:任务内置分片 + DB 锁,避免多实例重复执行。
4. 分布式长连接(WebSocket)
充电桩设备通过 WebSocket 上报实时充电电压电流、电量。
- 问题:多实例部署,设备连接落在某一个网关 / 设备服务实例,其他实例拿不到该设备连接,推送消息错位。
- 方案:
- Redis 记录设备 ID 与服务实例地址映射;
- 需要下发指令时,先查 Redis 路由到对应实例;
- 心跳保活,设备离线主动清理映射;
- 消息可靠性:上报数据落 MQ 做兜底,不依赖长连接可靠性。
5. 分布式 ID
订单号、流水号:雪花算法,保证多实例全局唯一。
6. 分布式链路追踪
SkyWalking,全链路埋点:设备上报 → MQ 消费 → 订单创建 → 计价,便于排查线上充电数据丢失、计价错误问题。
二、三高设计(高并发、高可用、高性能)
高并发
- 流量来源:大量充电桩设备并发上报、小程序车主查询订单、场站后台查询。
- Spring‑Gateway 做网关层限流,Sentinel 服务层限流,区分设备上报流量、用户请求流量;
- 充电桩上报不直接写 DB,先入 RocketMQ 异步消费削峰;
- 核心接口:获取场站列表、订单列表做读写分离。
- 热点流量:场站高峰期多桩同时充电,大量消息涌入 MQ。
- RocketMQ 分区扩容,消费端多线程消费;按设备 ID 做消息分区,保证同一个充电桩消息顺序消费,保证充电时序不乱。
高可用
- 服务全部多实例部署;Nacos 健康检查自动剔除故障节点。
- MQ 集群:RocketMQ 主从,消息刷盘策略,消息重试、死信队列。消费失败(DB 抖动)进入死信,后台告警,人工 + 定时任务补偿。
- MySQL 主从;Redis 集群模式;ES 集群多副本。
- 降级熔断:Sentinel。例如报表统计服务不可用时,返回缓存最近报表,不阻断充电核心链路。充电流程优先保障,非统计功能可降级。
- 故障隔离:设备上报异常不能影响车主下单链路;MQ 消费失败不打垮数据库。
高性能
- 核心充电链路尽量同步逻辑轻量化,重逻辑(统计、日志、推送)全部异步化。
- Feign 调优:连接池、超时时间适配充电业务;
- JVM 调优:线上避免频繁 FullGC;jstat/jstack 做线上排查预案。
- DB 慢 SQL 治理,索引优化;大查询禁止走主库,走从库 / ES。
压测参考指标:场站高峰期,支持千级充电桩并发上报,网关 QPS 几千级别;订单创建响应控制在 100ms 以内。
三、缓存设计 Redis
分层缓存:本地 Caffeine + Redis 集群。
1. 缓存内容
- 基础字典缓存:电价规则、场站基础信息,变化频率低。
电价规则变更频率不高,使用 Canal 监听计价规则表变更,自动刷新缓存,不必每次查 DB;
- 热点数据缓存:场站信息、用户最近订单;
- 分布式锁:创建订单锁设备 ID,防止同一充电桩重复生成订单;
- WebSocket 路由映射:设备 ID‑服务实例地址;
- 计数统计:实时充电量、场站在线桩数,实时指标放 Redis,定时落地 DB;
- 防重幂等:设备上报消息携带 requestId,Redis 做幂等,避免重复消费产生重复订单。
2. 缓存策略
- 缓存更新策略:Canal 监听 MySQL 变更,更新 Redis;
- 缓存穿透:空值缓存;缓存击穿:互斥锁;缓存雪崩:TTL 加随机偏移;
- 冷热区分:实时热点放 Redis;历史订单不常驻缓存。
3. 注意点
充电计价核心数据不能完全依赖缓存,计价计算以 MySQL 库表为准,缓存只做查询加速。
四、AI 模块设计(Spring‑AI 集成)
把 AI 作为辅助能力,不侵入充电核心交易链路,只做辅助能力。
1. RAG 知识库
知识库内容:设备故障手册、业务操作手册、运营 FAQ、充电业务常见问题。
- 场景 1:运营客服问答。场站管理员、客服查询设备报错码、故障排查方案;
- 场景 2:车主端智能问答:充电失败、扣费疑问。
- 实现:Spring‑AI + 向量数据库,文档预处理分块、向量入库;RAG 检索知识库生成回答。
2. Agent + Function Calling
Agent 可以调用后端工具函数:
- 查询指定充电桩状态;
- 查询订单详情;
- 查询场站运营数据;
示例:管理员提问 “A 场站今天有多少异常订单”,Agent 调用后端业务接口拿到数据再整理自然语言返回。
3. AI 异常分析
设备上报大量故障码,大模型做故障语义聚合:把一堆原始故障码,归类故障根因,给出运维建议。
4. 约束
AI 输出结果仅供参考;涉及金额、订单状态必须以业务数据库为准,AI 不能修改订单、计价数据。
五、大数据量设计
业务产生海量数据:充电桩上报时序点数据、海量充电订单、设备日志、告警记录。
1. 数据分层
- MySQL:存放热数据,近期订单、基础业务数据;
- Elasticsearch:存放海量上报时序数据、历史订单、设备日志;用于查询上报轨迹、日志检索;
- 冷数据:历史几年订单归档,迁移归档库,或者归档至对象存储。
2. 分库分表 Sharding‑JDBC
订单表按时间分片(按月分表):充电订单随时间持续暴涨,按月分表,热表为当月、上月订单,更早为冷表。
- 读写分离:Sharding‑JDBC 配置主从;写走主库,查询走从库;
- 冷热分离: 热数据(近 2 个月订单):MySQL; 冷历史订单:迁移归档库,同时同步 ES 用于查询;线上业务库不保留全量历史。
3. 上报时序海量测点数据处理
充电桩每秒 / 每几秒上报电压、电流、电量,直接写 MySQL 会压垮库。 方案:
- 设备上报→RocketMQ;
- 消费聚合,批量写入 Elasticsearch 保存时序轨迹;
- MySQL 只存订单关键快照,不存每一条细粒度测点;需要看充电过程曲线从 ES 查询。
4. Canal 数据同步
- MySQL 订单、设备表变更,Canal 同步到 ES,解决 MySQL 分表后复杂条件查询慢问题;
- 注意:计价规则表更新频次不高,如果缓存刷新需求简单,也可以不用 Canal,采用 Nacos 配置或者程序主动更新缓存。
5. 报表统计大数据计算
- 实时指标:Redis 做实时计数;
- T+1 离线统计:XXL‑Job 定时任务,读取 ES/MySQL,计算场站营收、充电量,统计结果落业务报表表;避免前台直接跑大聚合 SQL。
- 禁止业务页面直接做千万级表聚合计算。
6. 查询兼容
- 用户查近期订单:走 MySQL;
- 用户查询历史很久订单:路由查询归档库 + ES;前端做提示,历史数据查询响应会较慢。
六、核心风险汇总
- 设备长连接不可靠:不依赖 WebSocket 保证数据可靠,MQ 做兜底;同桩消息顺序消费保证充电时序。
- 计价精度:全部使用 BigDecimal,浮点数禁用;跨峰谷时段充电时间切片计算价格。
- 大表膨胀:订单按月分表,冷热分离,避免单表无限膨胀。
- AI 边界:AI 只做辅助,交易链路完全隔离大模型,防止 AI 错误干预业务。
- MQ 消息堆积:监控 RocketMQ 堆积,告警;消费逻辑不要写过重。