1. 项目概述:航空票务系统的全栈实现
这个基于SpringBoot和小程序的航空票务管理系统,本质上是一个典型的B2C电商模式在垂直领域的应用。我去年为某地方航空公司实施过类似系统,核心诉求无非三点:用户能快速找到合适航班并完成支付、航司能高效管理库存和订单、系统能扛住节假日流量高峰。
技术栈选择上,SpringBoot作为后端框架几乎是必然选择——它简化了配置,内置Tomcat,配合Spring Security和JPA能快速搭建RESTful API。小程序端则利用微信生态的支付、通知等原生能力,相比原生App开发成本直降60%。数据库方面,MySQL满足事务需求,Redis处理高并发查询和缓存,这种组合在票务系统中久经考验。
2. 核心模块设计解析
2.1 航班动态管理模块
航班数据的特点是读多写少,我们采用主从分离架构。主库处理航司后台的航班CRUD操作,从库服务小程序查询请求。关键字段包括:
@Entity public class Flight { @Id private String flightNo; // 航班号 CA1234 private LocalDateTime departureTime; private LocalDateTime arrivalTime; private String departureCity; // 出发地三字码 PEK private String arrivalCity; @Embedded private SeatInventory inventory; // 嵌套座位库存对象 }注意:城市代码建议使用IATA标准三字码,避免中文歧义
2.2 实时库存控制
票务系统最怕超卖,我们采用乐观锁实现库存扣减:
UPDATE seat_inventory SET economy_seat = economy_seat - 1 WHERE flight_id = ? AND economy_seat >= 1同时用Redis记录正在处理的订单,设置15分钟过期时间防止占座不支付:
// 订单暂存Redis redisTemplate.opsForValue().set( "order:temp:" + orderId, seatInfo, 15, TimeUnit.MINUTES);2.3 分布式事务处理
用户支付完成后需要同步更新订单状态、扣减库存、生成电子票,我们通过RabbitMQ实现最终一致性:
- 支付服务发送消息到exchange
- 订单服务和库存服务分别监听队列
- 引入死信队列处理失败消息
3. 关键技术实现细节
3.1 小程序端性能优化
机票查询页面临大量城市-航班数据加载,我们采用:
- 分页加载(每次20条)
- 本地缓存热门航线(如北京-上海)
- 防抖处理搜索输入(延迟500ms触发)
// 小程序端搜索防抖 let timer = null; function searchInput(e) { clearTimeout(timer); timer = setTimeout(() => { this.loadFlights(); }, 500); }3.2 后台管理系统安全设计
航司后台需要严格权限控制,我们基于RBAC模型实现:
@PreAuthorize("hasRole('ADMIN') || hasPermission('flight', 'write')") @PostMapping("/flights") public ResponseEntity addFlight(@RequestBody Flight flight) { // 航班添加逻辑 }同时记录敏感操作日志:
CREATE TABLE audit_log ( id BIGINT AUTO_INCREMENT, operator VARCHAR(32), operation VARCHAR(64), params TEXT, ip VARCHAR(15), created_time DATETIME );4. 典型问题排查实录
4.1 高并发下的库存超卖
压测时发现当1000并发抢10张票时,会出现超卖3-5张。解决方案:
- 在MySQL乐观锁基础上增加Redis原子计数器
- 使用Redisson分布式锁保护关键代码段
RLock lock = redissonClient.getLock("flight:" + flightId); try { lock.lock(); // 库存操作 } finally { lock.unlock(); }4.2 微信支付回调丢失
生产环境出现过支付成功但订单状态未更新的情况,改进方案:
- 支付时记录支付单号与订单关联
- 定时任务每小时检查已支付未确认的订单
- 提供手动补单接口
4.3 小程序审核被拒常见原因
- 未提供测试账号 → 在提审页面明确标注测试账号
- 支付流程不完整 → 确保能完成真实支付闭环
- 权限说明不清晰 → 在app.json中补充权限声明
5. 部署与监控方案
5.1 生产环境部署
采用Docker Compose编排服务:
version: '3' services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} redis: image: redis:alpine app: build: . ports: - "8080:8080" depends_on: - mysql - redis5.2 监控指标配置
通过Prometheus监控关键指标:
- 订单创建成功率
- 平均响应时间(<500ms)
- 错误率(<0.1%)
@RestController @RequestMapping("/metrics") public class MetricsController { private final Counter orderCounter; public MetricsController(MeterRegistry registry) { orderCounter = registry.counter("orders.created"); } @PostMapping("/order") public void createOrder() { orderCounter.increment(); } }6. 项目扩展方向
这套系统在实际运营中还可以深化:
- 智能推荐:基于用户历史订单推荐相似航线
- 动态定价:根据上座率调整机票价格
- 会员体系:积分兑换和等级特权
我在实施过程中最大的体会是:票务系统对数据一致性的要求近乎苛刻,任何一个环节出现脏数据都可能导致重大损失。建议在开发阶段就建立完善的对账机制,每天核对订单、支付、库存三方的数据一致性。