wms/.qoder/repowiki/zh/content/性能优化/性能优化.md

369 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 性能优化
<cite>
**本文引用的文件**
- [application.yml](file://nflg-wms-admin/src/main/resources/application.yml)
- [application-dev.yml](file://nflg-wms-admin/src/main/resources/application-dev.yml)
- [application-prod.yml](file://nflg-wms-admin/src/main/resources/application-prod.yml)
- [MysqlDataSourceConfig.java](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java)
- [SAPConfig.java](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java)
- [RedisConfig.java](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java)
- [BeanUtil.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/util/BeanUtil.java)
- [UserUtil.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/util/UserUtil.java)
- [SAPException.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/SAPException.java)
- [NflgException.java](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/NflgException.java)
- [PowerJobWorkerConfiguration.java](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/PowerJobWorkerConfiguration.java)
- [InventoryCheckTaskProcessor.java](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/processor/InventoryCheckTaskProcessor.java)
- [SAPConfig.java (srm-receive)](file://nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/config/SAPConfig.java)
- [SAPConfig.java (scheduled)](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/SAPConfig.java)
- [application-sit.yml (srm-receive)](file://nflg-wms-srm-receive/src/main/resources/application-sit.yml)
- [application-dev.yml (srm-receive)](file://nflg-wms-srm-receive/src/main/resources/application-dev.yml)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向NFLG WMS系统管理员与开发人员聚焦于系统性能优化覆盖数据库查询优化、缓存策略优化、网络延迟优化、并发处理优化、SAP系统集成优化、性能监控与指标分析、内存与GC优化、性能测试与基准测试方法以及运维最佳实践与注意事项。文档基于仓库中实际配置与实现进行分析并提供可操作的优化建议。
## 项目结构
WMS采用多模块分层架构网关、鉴权、管理端、仓储作业、SRM收货、定时调度、通用工具与基础设施等模块协同工作。管理端与仓储模块通过MyBatis-Plus访问MySQL通用模块提供DTO、常量、工具类与异常定义定时任务模块使用PowerJobSAP集成通过JCo连接池配置Redis用于缓存与分布式能力。
```mermaid
graph TB
subgraph "应用层"
ADMIN["管理端(nflg-wms-admin)"]
SHIPMENT["发货(nflg-wms-shipment)"]
SRM["SRM收货(nflg-wms-srm-receive)"]
AUTH["鉴权(nflg-wms-auth)"]
GATEWAY["网关(nflg-wms-gateway)"]
end
subgraph "业务与支撑"
REPO["仓储(nflg-wms-repository)"]
COMMON["通用(nflg-wms-common)"]
STARTER["启动器(nflg-wms-starter)"]
SCHEDULED["定时(nflg-wms-scheduled)"]
end
DB["MySQL"]
REDIS["Redis"]
SAP["SAP系统"]
ADMIN --> REPO
SHIPMENT --> REPO
SRM --> REPO
ADMIN --> STARTER
SHIPMENT --> STARTER
SRM --> STARTER
ADMIN --> AUTH
GATEWAY --> ADMIN
GATEWAY --> SHIPMENT
GATEWAY --> SRM
GATEWAY --> AUTH
REPO --> DB
STARTER --> REDIS
ADMIN --> SAP
SRM --> SAP
SCHEDULED --> SAP
```
图示来源
- [application.yml:1-48](file://nflg-wms-admin/src/main/resources/application.yml#L1-L48)
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
- [SAPConfig.java:24-51](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L24-L51)
章节来源
- [application.yml:1-48](file://nflg-wms-admin/src/main/resources/application.yml#L1-L48)
## 核心组件
- 数据库连接与ORM
- MyBatis-Plus配置启用驼峰映射、空值Setter、UTC时间类型处理器与分页插件。
- HikariCP连接池在各环境配置了最大池大小、最小空闲、空闲超时、最大生命周期与泄漏检测阈值。
- 缓存
- RedisTemplate统一配置键值序列化策略支持Object与String模板。
- SAP集成
- JCo目的地注册与连接池参数设置包含峰值限制与池容量校验。
- 并发与调度
- PowerJob Worker配置支持任务执行与存储策略选择。
- 工具与异常
- BeanUtil提供对象与JSON互转UserUtil封装登录用户信息NflgException与SAPException统一异常模型。
章节来源
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [application-dev.yml:25-34](file://nflg-wms-admin/src/main/resources/application-dev.yml#L25-L34)
- [application-sit.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-sit.yml#L11-L20)
- [application-dev.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-dev.yml#L11-L20)
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
- [SAPConfig.java:67-96](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L67-L96)
- [PowerJobWorkerConfiguration.java:22-33](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/PowerJobWorkerConfiguration.java#L22-L33)
- [BeanUtil.java:17-27](file://nflg-wms-common/src/main/java/com/nflg/wms/common/util/BeanUtil.java#L17-L27)
- [UserUtil.java:11-33](file://nflg-wms-common/src/main/java/com/nflg/wms/common/util/UserUtil.java#L11-L33)
- [NflgException.java:12-16](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/NflgException.java#L12-L16)
- [SAPException.java:12-16](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/SAPException.java#L12-L16)
## 架构总览
下图展示WMS与外部系统的交互路径重点标注数据库、缓存与SAP的关键链路便于定位性能瓶颈。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Gateway as "网关"
participant Admin as "管理端"
participant Repo as "仓储(MyBatis-Plus)"
participant DB as "MySQL"
participant Redis as "Redis"
participant SAP as "SAP系统"
Client->>Gateway : 请求
Gateway->>Admin : 转发
Admin->>Repo : 查询/更新
Repo->>DB : SQL执行
DB-->>Repo : 结果集
Admin->>Redis : 读取/写入缓存
Redis-->>Admin : 缓存命中/未命中
Admin->>SAP : RFC调用/JCo
SAP-->>Admin : 返回数据
Admin-->>Gateway : 响应
Gateway-->>Client : 响应
```
图示来源
- [application.yml:1-48](file://nflg-wms-admin/src/main/resources/application.yml#L1-L48)
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
- [SAPConfig.java:93-101](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L93-L101)
## 详细组件分析
### 数据库查询优化
- ORM与SQL优化
- 启用驼峰命名映射与空值Setter减少字段映射差异导致的隐式开销。
- 使用分页插件与乐观锁拦截器,避免全表扫描与并发写冲突。
- 连接池配置
- 最大池大小、最小空闲、空闲超时、最大生命周期与泄漏检测阈值需结合业务QPS与事务时长调优。
- 开发/测试/生产环境分别配置不同池参数,避免资源争用与连接泄漏。
- 索引与查询
- 建议对高频过滤字段、关联字段与排序字段建立复合索引;定期分析慢查询日志与执行计划,剔除无效索引。
- 避免SELECT *,仅取必要列;对大结果集分页或流式读取。
```mermaid
flowchart TD
Start(["开始"]) --> CheckPool["检查连接池配置<br/>最大池/空闲/超时/生命周期"]
CheckPool --> TunePool{"是否满足QPS与RT?"}
TunePool -- 否 --> Adjust["调整池参数/增加实例/拆分库表"]
TunePool -- 是 --> EnablePlugins["启用分页/乐观锁插件"]
EnablePlugins --> Analyze["分析慢查询与执行计划"]
Analyze --> IndexOps["创建/优化索引/删除无效索引"]
IndexOps --> End(["结束"])
```
图示来源
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [application-dev.yml:25-34](file://nflg-wms-admin/src/main/resources/application-dev.yml#L25-L34)
- [application-sit.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-sit.yml#L11-L20)
- [application-dev.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-dev.yml#L11-L20)
章节来源
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [application-dev.yml:25-34](file://nflg-wms-admin/src/main/resources/application-dev.yml#L25-L34)
- [application-sit.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-sit.yml#L11-L20)
- [application-dev.yml (srm-receive):11-20](file://nflg-wms-srm-receive/src/main/resources/application-dev.yml#L11-L20)
### 缓存策略优化
- Redis配置
- 统一Key/Value序列化策略降低序列化成本与跨语言兼容性问题。
- 提供Object与String模板按场景选择合适模板以减少装箱与转换。
- 失效策略
- 对热点数据设置合理TTL对缓存穿透使用布隆过滤器或短命Key+后加载策略。
- 对缓存击穿采用互斥锁或逻辑过期对缓存雪崩采用随机TTL与分级缓存。
- 命中率与内存
- 监控key分布与内存占用避免大Key与热点Key集中定期清理过期Key。
```mermaid
flowchart TD
Req(["请求"]) --> GetKey["构造缓存Key"]
GetKey --> GetCache["从Redis读取"]
GetCache --> Hit{"命中?"}
Hit -- 是 --> Return["返回缓存"]
Hit -- 否 --> LoadDB["加载DB/下游接口"]
LoadDB --> SetCache["写入缓存(TTL/互斥)"]
SetCache --> Return
```
图示来源
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
章节来源
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
### 并发处理优化
- 线程池与异步
- 对高延迟外部调用如SAP使用独立线程池隔离对CPU密集型任务与IO密集型任务分离。
- 异步回调与事件驱动减少阻塞等待;对批量任务采用分片与限速。
- 锁优化
- 减少锁粒度与持有时间;优先使用无锁容器与原子变量;避免死锁与超时重试。
- 定时任务
- PowerJob Worker存储策略按任务规模选择内存或磁盘端口随机化避免冲突协议HTTP稳定可靠。
```mermaid
sequenceDiagram
participant Task as "任务"
participant Pool as "线程池"
participant SAP as "SAP"
Task->>Pool : 提交异步任务
Pool->>SAP : 发起RFC调用
SAP-->>Pool : 返回结果
Pool-->>Task : 回调通知
```
图示来源
- [PowerJobWorkerConfiguration.java:22-33](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/PowerJobWorkerConfiguration.java#L22-L33)
- [InventoryCheckTaskProcessor.java:22-31](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/processor/InventoryCheckTaskProcessor.java#L22-L31)
章节来源
- [PowerJobWorkerConfiguration.java:22-33](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/PowerJobWorkerConfiguration.java#L22-L33)
- [InventoryCheckTaskProcessor.java:22-31](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/processor/InventoryCheckTaskProcessor.java#L22-L31)
### SAP系统集成性能优化
- 连接复用与池化
- 使用JCo目的地与池化连接设置峰值限制与池容量确保峰值不小于池容量。
- 配置连接超时、语言与系统参数,避免频繁重建连接。
- 批量处理
- 将多次RFC调用合并为批量调用减少网络往返对大批量数据分批处理并设置批次上限。
- 超时与重试
- 明确RFC调用超时与重试策略避免长时间阻塞对SAP异常进行分类与熔断保护。
```mermaid
sequenceDiagram
participant Admin as "管理端"
participant Dest as "JCo目的地"
participant Repo as "JCo仓库"
participant SAP as "SAP系统"
Admin->>Dest : 获取JCoDestination
Dest-->>Admin : 返回Destination
Admin->>Repo : 获取JCoRepository
Repo-->>Admin : 返回Repository
Admin->>SAP : RFC调用(批量/限流)
SAP-->>Admin : 返回结果
```
图示来源
- [SAPConfig.java:93-101](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L93-L101)
- [SAPConfig.java (srm-receive):68-98](file://nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/config/SAPConfig.java#L68-L98)
- [SAPConfig.java (scheduled):68-98](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/SAPConfig.java#L68-L98)
章节来源
- [SAPConfig.java:67-96](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L67-L96)
- [SAPConfig.java (srm-receive):68-98](file://nflg-wms-srm-receive/src/main/java/com/nflg/wms/srm/receive/config/SAPConfig.java#L68-L98)
- [SAPConfig.java (scheduled):68-98](file://nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/config/SAPConfig.java#L68-L98)
### 网络延迟优化
- 本地化与就近部署
- 将应用部署在数据库与SAP同地域减少跨域网络时延。
- 连接与协议
- TCP参数优化、Keep-Alive配置HTTP/2或更高效协议压缩传输体。
- DNS与负载均衡
- 预热DNS、缩短解析时间LB健康检查与快速摘除。
[本节为通用指导,无需引用具体文件]
### 内存管理与垃圾回收优化
- JVM参数
- 合理设置堆大小、新生代比例与元空间;开启逃逸分析与标量替换。
- GC策略
- 选择低停顿GC如G1/工蜂避免Full GC控制晋升年龄与大对象直通老年代。
- 对象与序列化
- 使用对象池与轻量序列化;避免大对象频繁分配;及时释放大集合引用。
- 监控
- 观察GC频率与停顿、堆外内存、DirectBuffer结合APM与GC日志定位问题。
[本节为通用指导,无需引用具体文件]
## 依赖分析
- 模块耦合
- 管理端、发货、SRM收货均依赖仓储模块与通用模块定时模块依赖SAP配置与通用异常。
- 外部依赖
- MySQL、Redis、SAP通过连接池与序列化配置降低外部依赖的性能损耗。
- 循环依赖
- 当前结构未见循环依赖迹象;若新增模块需避免双向依赖。
```mermaid
graph LR
ADMIN["管理端"] --> REPO["仓储"]
SHIPMENT["发货"] --> REPO
SRM["SRM收货"] --> REPO
ADMIN --> COMMON["通用"]
SHIPMENT --> COMMON
SRM --> COMMON
SCHEDULED["定时"] --> COMMON
SCHEDULED --> SAPCFG["SAP配置"]
ADMIN --> SAPCFG
SRM --> SAPCFG
STARTER["启动器"] --> REDIS["Redis"]
REPO --> MYSQL["MySQL"]
```
图示来源
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
- [SAPConfig.java:24-51](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L24-L51)
章节来源
- [MysqlDataSourceConfig.java:30-47](file://nflg-wms-repository/src/main/java/com/nflg/wms/repository/config/MysqlDataSourceConfig.java#L30-L47)
- [RedisConfig.java:14-29](file://nflg-wms-starter/src/main/java/com/nflg/wms/starter/config/RedisConfig.java#L14-L29)
- [SAPConfig.java:24-51](file://nflg-wms-admin/src/main/java/com/nflg/wms/admin/config/SAPConfig.java#L24-L51)
## 性能考虑
- 数据库
- 分库分表与读写分离;热点表分区;归档历史数据;批量写入与幂等设计。
- 缓存
- 多级缓存(本地缓存+Redis预热与冷热分离淘汰策略与TTL动态调整。
- 并发
- 限流与熔断;排队与背压;异步化与事件驱动。
- SAP
- 批量RFC、参数化查询、连接池峰值校验异常降级与重试退避。
- 监控
- 指标QPS、RT、错误率、连接池利用率、GC、Redis命中率告警阈值分级。
- 测试
- 压测工具与脚本基线RT与P99回归对比容量规划。
[本节为通用指导,无需引用具体文件]
## 故障排查指南
- 异常模型
- NflgException与SAPException统一状态码与消息便于前端与监控识别。
- 日志与追踪
- 开启OTLP链路追踪与日志推送结合TraceId定位端到端耗时。
- 连接池问题
- 连接泄漏:检查泄漏检测阈值与连接关闭;连接超时:增大超时或扩容池。
- 缓存问题
- 缓存穿透:布隆过滤器/短命Key+后加载;缓存击穿:互斥锁/逻辑过期缓存雪崩随机TTL。
- SAP问题
- RFC超时/报错检查池容量与峰值、网络连通性、SAP端队列批量失败分片重试。
章节来源
- [NflgException.java:12-16](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/NflgException.java#L12-L16)
- [SAPException.java:12-16](file://nflg-wms-common/src/main/java/com/nflg/wms/common/exception/SAPException.java#L12-L16)
- [application.yml:31-48](file://nflg-wms-admin/src/main/resources/application.yml#L31-L48)
- [application-dev.yml:13-14](file://nflg-wms-admin/src/main/resources/application-dev.yml#L13-L14)
## 结论
通过合理的数据库索引与查询优化、连接池参数调优、Redis多级缓存与失效策略、SAP连接池与批量处理、并发线程池与异步化、以及完善的监控与测试体系WMS可在高并发与复杂业务场景下保持稳定与高性能。建议以模块为单位持续迭代优化并结合生产数据进行容量与性能回归验证。
## 附录
- 关键配置要点
- 数据库驼峰映射、空值Setter、分页与乐观锁插件HikariCP池参数按环境区分。
- 缓存:统一序列化策略;对象/字符串模板按场景选择。
- SAP目的地注册、池容量与峰值校验、RFC超时与重试。
- 监控OTLP链路追踪、健康检查、Redis/DB健康探测。
- 推荐工具
- 数据库Explain/慢查询分析RedisINFO/内存分析SAPST05/交易记录分析JVMGC日志与APM。
- 基准测试建议
- 场景并发读写、批量导入导出、SAP同步、缓存命中率指标QPS、RT、错误率、资源占用对比优化前后、不同参数组合。