2. 创建机场区域PostGIS实体类(AirportArea) 3. 创建数据库迁移脚本(表结构、索引、分区) 4. 实现车辆位置Repository接口 5. 实现机场区域Repository接口 6. 创建PostGIS车辆服务(PostGISVehicleService) 7. 创建PostGIS区域服务(PostGISAreaService) 8. 创建统一空间查询服务(SpatialQueryService) 9. 实现区域配置导入工具(YAML到数据库) 10. 重构DataCollectorService(移除内存存储) 11. 重构AirportAreaService(基于数据库查询) 12. 移除MovingObjectRepository和相关内存存储代码 13. 移除AirportAreasProperties和YAML配置加载 14. 实现Redis缓存策略 15. 数据库连接池和性能优化配置 16. 创建单元测试和集成测试
9.5 KiB
9.5 KiB
碰撞避免系统架构分析报告
版本: 3.0 | 更新日期: 2024-12-20 | 基于需求: requirements.md (2025-05-01)
📋 更新说明: 本版本基于3个月快速交付目标,简化架构设计,去除MongoDB采用MySQL单一数据库方案,专注核心业务功能的MVP实现。
本文档对当前碰撞避免系统的架构进行全面分析,识别设计问题、缺失模块,并提出改进建议。
🔍 当前架构优势
- 模块化设计良好:项目采用了清晰的分层架构,模块职责相对明确
- 空间计算基础扎实:JTS库和MySQL空间索引为地理查询提供强大支持
- 配置管理完善:支持YAML配置文件和属性绑定机制
- 实时通信支持:WebSocket实现了基本的实时数据推送
🎯 3个月MVP目标
基于业务需求和开发效率考虑,制定3个月快速交付计划:
月度1:基础信息管理 + 数据库重构 月度2:超速监控 + 电子围栏 + 基础告警 月度3:轨迹回放 + API完善 + 系统优化
⚠️ 架构设计问题
1. 技术栈过于复杂
问题:
- 同时使用Redis + MongoDB + 未来计划的PostgreSQL,技术栈过重
- JTS空间计算与数据库空间功能重复
- 过度工程化导致开发周期过长
MVP简化方案:
# 简化的技术栈
数据存储: MySQL 8.0+(单一数据库解决方案)
缓存: Redis(仅用于实时数据缓存)
空间查询: MySQL原生空间函数(ST_Contains, ST_Distance等)
实时通信: WebSocket(保持现有实现)
2. 功能模块设计过于复杂
问题:
- 过多的子模块和分层,增加开发复杂度
- 事件驱动、规则引擎等高级架构增加学习成本
- MVP阶段不需要如此复杂的架构设计
MVP简化方案:
// 简化的模块结构(仅保留核心功能)
├── controller/ // 统一控制器层
├── service/ // 业务服务层(合并相关服务)
├── repository/ // 数据访问层
├── model/ // 数据模型
├── config/ // 配置管理
└── common/ // 通用工具类
🚫 MVP核心功能缺失
1. 基础信息管理模块(第1个月实现)
现状:完全缺失车辆和驾驶员基础信息管理
MVP实现:
// 简化的基础信息管理(避免过度设计)
management/
├── VehicleService.java // 车辆管理服务
├── DriverService.java // 驾驶员管理服务
├── VehicleRepository.java // 车辆数据访问
├── DriverRepository.java // 驾驶员数据访问
└── model/
├── Vehicle.java // 车辆实体
├── Driver.java // 驾驶员实体
└── VehicleDriver.java // 车辆-驾驶员关联
2. 超速监控模块(第2个月实现)
现状:基础功能存在但需要增强为完整的超速监控系统
MVP实现:
// 增强现有功能,简化实现
speeding/
├── SpeedMonitorService.java // 超速监控服务(增强现有)
├── SpeedLimitService.java // 限速管理服务
├── SpeedViolationRepository.java // 违章记录存储
└── model/
├── SpeedViolation.java // 超速违章记录
└── SpeedLimit.java // 限速配置
3. 电子围栏模块(第2个月实现)
现状:areas模块存在但缺乏围栏监控功能
MVP实现:
// 基于现有areas模块扩展(利用MySQL空间查询)
geofence/
├── GeofenceService.java // 围栏监控服务
├── ZoneViolationService.java // 违规检测服务
├── GeofenceRepository.java // 围栏数据访问
└── model/
├── GeofenceEvent.java // 围栏事件
└── ZoneViolation.java // 区域违规记录
4. 轨迹回放模块(第3个月实现)
现状:完全缺失历史轨迹查询和回放功能
MVP实现:
// 简化的轨迹回放(基于MySQL存储和查询)
trajectory/
├── TrajectoryService.java // 轨迹查询服务
├── TrajectoryReplayService.java // 轨迹回放服务
├── TrajectoryRepository.java // 轨迹数据访问(MySQL分区表)
└── model/
├── TrajectoryPoint.java // 轨迹点
└── TrajectoryQuery.java // 查询条件
5. 基础告警系统(第2个月实现)
现状:缺乏统一的告警管理机制
MVP实现:
// 简化的告警系统(基于WebSocket + 数据库)
alert/
├── AlertService.java // 告警服务
├── AlertRepository.java // 告警记录存储
└── model/
├── Alert.java // 告警实体
└── AlertType.java // 告警类型(枚举)
🔧 技术实现简化
1. MySQL统一数据存储策略
简化方案:
# 统一的数据存储架构
MySQL 8.0+:
- 车辆和驾驶员基础信息
- 实时位置数据(近期数据,定期清理)
- 历史轨迹数据(分区表按时间分区)
- 告警记录和配置数据
- 空间数据(POINT, POLYGON类型)
Redis:
- 实时位置数据缓存(提高查询性能)
- WebSocket会话管理
- 临时计算结果缓存
移除: MongoDB(简化技术栈)
2. 空间查询简化实现
技术方案:
-- 利用MySQL原生空间查询替代复杂的JTS计算
-- 点在多边形内查询
SELECT * FROM vehicles v
WHERE ST_Contains(
(SELECT boundary FROM airport_zones WHERE zone_id = ?),
POINT(v.longitude, v.latitude)
);
-- 距离查询
SELECT *, ST_Distance(POINT(longitude, latitude), POINT(?, ?)) as distance
FROM vehicles
WHERE ST_Distance_Sphere(POINT(longitude, latitude), POINT(?, ?)) < ?;
3. 数据验证简化
MVP方案:
// 基础数据验证(避免过度设计)
@Component
public class DataValidator {
public boolean validateLocation(Double lat, Double lng) {
return lat != null && lng != null &&
lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180;
}
public boolean validateSpeed(Double speed) {
return speed != null && speed >= 0 && speed <= 200; // 机场内合理速度范围
}
}
📋 3个月MVP开发计划
第1个月:基础设施建设
Week 1-2: 数据库重构
- 移除MongoDB配置,统一使用MySQL
- 设计核心数据表结构(车辆、驾驶员、位置、告警等)
- 配置MySQL空间索引和分区表
Week 3-4: 基础信息管理
- 实现车辆管理功能(CRUD操作)
- 实现驾驶员管理功能
- 完成基础API和数据验证
第2个月:核心监控功能
Week 5-6: 超速监控系统
- 增强现有SpeedCalculationService
- 实现超速违章检测和记录
- 集成告警系统
Week 7-8: 电子围栏功能
- 基于MySQL空间查询实现围栏监控
- 实现区域进出检测
- 完成违规记录和告警
第3个月:数据分析和优化
Week 9-10: 轨迹回放功能
- 实现历史轨迹查询(基于MySQL分区表)
- 开发轨迹回放API
- 前端轨迹可视化(简化版)
Week 11-12: 系统优化和集成
- API接口完善和文档
- 性能优化(索引、缓存)
- 系统测试和部署准备
🎯 MVP架构路线图
graph TD
A[当前架构] --> B[数据库重构MySQL]
B --> C[基础信息管理]
C --> D[超速监控]
D --> E[电子围栏]
E --> F[告警系统]
F --> G[轨迹回放]
G --> H[API完善]
H --> I[MVP完成]
style B fill:#ff6b6b
style C fill:#ff6b6b
style D fill:#4ecdc4
style E fill:#4ecdc4
style F fill:#4ecdc4
style G fill:#95e1d3
style H fill:#95e1d3
时间线说明:
- 🔴 月度1:数据库重构 + 基础信息管理
- 🟢 月度2:监控功能 + 告警系统
- 🟦 月度3:数据分析 + 系统优化
💡 总结
基于3个月快速交付目标,本架构分析提出了大幅简化的MVP方案:
关键简化决策
-
技术栈简化:去除MongoDB,统一使用MySQL + Redis架构
- MySQL处理所有持久化数据存储和空间查询
- Redis仅作为实时数据缓存和会话管理
- 大幅降低技术复杂度和学习成本
-
功能模块简化:摒弃过度设计,专注核心业务价值
- 基础信息管理(车辆/驾驶员)
- 超速监控和电子围栏
- 基础告警和轨迹回放
- 避免复杂的规则引擎、事件架构等
-
空间查询简化:直接使用MySQL原生空间函数
- ST_Contains, ST_Distance等原生函数替代复杂JTS计算
- 性能满足需求,开发效率更高
MVP成功关键因素
- 技术选型务实:选择团队熟悉、文档完善的技术栈
- 需求聚焦:专注最核心的业务价值,避免功能蔓延
- 渐进式交付:每月都有可演示的功能增量
- 架构适度:既不过度简陋,也不过度复杂
最终数据存储架构
# 简化统一的存储架构
MySQL 8.0+:
- 所有业务数据(车辆、驾驶员、轨迹、告警等)
- 空间数据存储和查询
- 历史数据分区管理
Redis:
- 实时位置数据缓存
- WebSocket会话缓存
- 计算结果临时缓存
移除: MongoDB(降低复杂度)
这种极简化但不简陋的架构设计,确保在3个月内交付实用的系统,同时为未来扩展保留了足够的架构弹性。