1. 项目背景与需求分析
长途客运行业作为我国重要的公共交通运输方式,每年承载着数十亿人次的出行需求。传统票务系统普遍存在以下痛点:
- 信息孤岛问题:各客运站售票数据不互通,跨站购票需重复录入信息
- 资源调配滞后:无法实时掌握各线路余票情况,空座率居高不下
- 用户体验不佳:排队购票时间长,改签退票流程繁琐
- 管理效率低下:人工统计报表误差率高,财务对账周期长
我们设计的智慧票务系统需要实现三大核心能力:
- 全渠道售票整合:支持窗口、自助机、小程序、官网等多端实时同步
- 智能调度中枢:基于历史数据的动态班次调整与运力预测
- 全流程数字化:从购票、检票到报销的电子化闭环管理
关键指标:系统需支持5000+并发购票请求,票务数据同步延迟控制在200ms内,日订单处理能力不低于50万笔。
2. 技术架构设计
2.1 整体技术栈选型
采用SpringBoot为核心的微服务架构,具体组件矩阵如下:
| 功能模块 | 技术方案 | 选型理由 |
|---|---|---|
| 核心业务 | SpringBoot 2.7 + MyBatis-Plus | 快速构建CRUD接口,动态SQL支持好 |
| 分布式事务 | Seata 1.5 | 解决跨服务票务状态一致性问题 |
| 实时通信 | WebSocket + STOMP | 支持余票动态推送和在线选座 |
| 安全认证 | Spring Security + JWT | 多端统一认证体系 |
| 数据缓存 | Redis 6.x | 高频访问的班次信息、余票数缓存 |
| 消息队列 | RocketMQ 4.9 | 削峰填谷处理节假日购票高峰 |
| 监控运维 | Prometheus + Grafana | 实时监控各服务节点状态 |
2.2 微服务拆分方案
将系统拆分为六个独立服务:
- 用户服务:处理注册登录、实名认证
- 票务服务:核心购票/退票业务逻辑
- 调度服务:班次管理与运力调配
- 支付服务:对接微信/支付宝/银联
- 报表服务:经营数据分析
- 网关服务:统一路由与限流
// 示例:票务服务购票接口核心逻辑 @Transactional public Ticket purchase(Long userId, Long scheduleId, Integer seatType) { // 1. 校验余票(Redis原子操作) String lockKey = "ticket:" + scheduleId; redisTemplate.opsForValue().setIfAbsent(lockKey, "lock", 30, TimeUnit.SECONDS); // 2. 生成订单(数据库操作) Order order = new Order(); order.setUserId(userId); order.setScheduleId(scheduleId); orderMapper.insert(order); // 3. 扣减库存(保证最终一致性) rocketMQTemplate.send("ticket-stock", MessageBuilder.withPayload(new StockMessage(scheduleId, -1)).build()); return generateTicket(order); }3. 核心业务实现
3.1 高并发票务处理
采用三级缓存策略应对购票高峰:
- 本地缓存(Caffeine):存储静态班次信息
- 分布式缓存(Redis):实时余票计数
- 数据库(MySQL):最终数据持久化
余票扣减的原子性保证方案:
// Redis Lua脚本实现原子扣减 String script = "local current = redis.call('GET', KEYS[1]) " + "if current and tonumber(current) >= tonumber(ARGV[1]) then " + " return redis.call('DECRBY', KEYS[1], ARGV[1]) " + "else " + " return -1 " + "end"; Long result = redisTemplate.execute( new DefaultRedisScript<>(script, Long.class), Collections.singletonList("stock:"+scheduleId), "1");3.2 智能调度算法
基于历史数据的动态调价模型:
# 简化的价格浮动算法(实际项目用Java实现) def dynamic_pricing(base_price, sold_ratio, days_left): if sold_ratio > 0.8: return base_price * 1.2 elif days_left < 3: return base_price * (1 + (1 - sold_ratio) * 0.5) else: return base_price调度决策考虑因素:
- 历史同线路售票速度
- 节假日系数调整
- 实时天气状况
- 竞争线路价格
4. 关键问题解决方案
4.1 分布式事务一致性
票务场景的典型问题:用户支付成功但出票失败。采用Saga模式解决:
正向流程:
- 创建订单(可补偿)
- 冻结库存(可补偿)
- 调用支付(需重试)
- 生成票务(最终操作)
补偿机制:
- 支付成功但出票失败:自动触发退款
- 库存冻结超时:自动释放
- 订单状态异常:人工干预队列
4.2 超卖预防方案
多维度防护措施:
| 防护层级 | 技术手段 | 有效性 | 性能影响 |
|---|---|---|---|
| 前端 | 购票按钮防重+倒计时 | 一般 | 无 |
| 网关 | 用户维度限流(令牌桶) | 较好 | 低 |
| 服务 | Redis分布式锁 | 好 | 中 |
| 数据库 | 乐观锁+唯一索引 | 可靠 | 高 |
实际采用组合方案:90%请求在前三层拦截,剩余10%通过数据库最终保障。
5. 性能优化实践
5.1 数据库优化
索引设计:
- 联合索引:(schedule_id, departure_time)
- 覆盖索引:查询订单时避免回表
分库分表:
- 按省份水平分片(如orders_db_01对应华东地区)
- 按月份历史数据归档
SQL优化:
/* 反例:全表扫描 */ SELECT * FROM orders WHERE status = 1; /* 正例:利用索引 */ SELECT id,user_id FROM orders WHERE status = 1 AND create_time > '2023-01-01' LIMIT 1000;5.2 JVM调优参数
针对票务服务的特点配置:
-server -Xms4g -Xmx4g # 统一堆大小避免扩容停顿 -XX:+UseG1GC # 大内存场景更稳定 -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=35 -XX:+HeapDumpOnOutOfMemoryError -Dio.netty.leakDetection.level=paranoid6. 安全防护体系
6.1 防黄牛机制
行为特征检测:
- 同一IP高频请求
- 设备指纹异常
- 购票时间模式(如整点秒杀)
验证策略:
- 滑块验证(普通时段)
- 短信验证(节假日)
- 人脸核验(热门线路)
处罚措施:
- 可疑订单延迟出票
- 黑名单账号限制购买
- 异常IP临时封禁
6.2 数据安全方案
传输加密:
- TLS 1.3全链路加密
- 敏感字段二次加密(如身份证号)
存储安全:
// 数据库字段加密示例 @ColumnTransformer( read = "AES_DECRYPT(UNHEX(id_card), '${aes.key}')", write = "HEX(AES_ENCRYPT(?, '${aes.key}'))") private String idCard;审计追踪:
- 关键操作留痕
- 数据库Binlog同步到审计中心
- 敏感操作二次认证
7. 部署与监控
7.1 K8S部署方案
采用StatefulSet部署有状态服务(如MySQL),Deployment部署无状态服务:
# 票务服务Deployment示例 apiVersion: apps/v1 kind: Deployment metadata: name: ticket-service spec: replicas: 3 selector: matchLabels: app: ticket template: spec: containers: - name: ticket image: registry.example.com/ticket:v1.2 resources: limits: cpu: "2" memory: 4Gi envFrom: - configMapRef: name: ticket-config7.2 监控指标看板
核心监控项配置:
| 指标类型 | 采集方式 | 报警阈值 |
|---|---|---|
| 接口成功率 | Prometheus + Micrometer | <99.9% (5分钟) |
| 数据库连接池 | Druid监控 | 活跃连接 >80% |
| 消息堆积 | RocketMQ Console | 积压消息 >1000 |
| JVM GC | Actuator | Full GC次数 >1次/小时 |
8. 项目演进方向
智能化升级:
- 基于LSTM的客流预测
- 结合天气数据的退票概率模型
- 个性化推荐线路
生态扩展:
- 对接酒店预订系统
- 开发旅行社API网关
- 建立客运行业数据中台
体验优化:
- 无感检票(NFC+人脸)
- 延误自动改签
- 电子发票即时开具
实际开发中发现,票务状态同步的延迟主要发生在跨机房调用场景。我们最终采用"本地优先"策略:同机房服务直接调用,跨机房操作通过消息队列异步处理,前端根据操作类型显示不同的状态提示语。这种方案在保证基本可用的前提下,将核心业务的响应时间从平均800ms降低到300ms以内。