🚄 12306 抢票系统架构设计(Java 技术栈)

320 阅读4分钟

🔹 一、用户访问层(前端 + 网关)

✅ 设计目标:

  • 接收用户请求,统一入口
  • 实现负载均衡、限流、鉴权、路由

✅ 技术选型:

  • 前端:React/Flutter/小程序等
  • API 网关:Spring Cloud Gateway / Nginx + Lua
  • 安全拦截:JWT、OAuth2、验证码校验

✅ 功能职责:

  • 用户登录、实名认证
  • 请求统一入口路由到后端微服务
  • 实现访问频率控制、IP 黑名单、滑动验证码

✅ 和下游交互:

  • 将用户的请求根据路径路由到用户服务、车票服务、购票服务、候补服务

🔹 二、应用服务层(Spring Boot 微服务)

✅ 设计目标:

  • 拆分业务逻辑,支持弹性部署和水平扩展
  • 各服务高内聚低耦合

✅ 微服务模块:

1. 用户服务

  • 处理用户注册、登录、实名认证、行为记录
  • 与风控系统协同识别异常用户

2. 车票服务

  • 查询车次、班次、余票、票价(配合 Redis 提升性能)
  • 支持分页、模糊搜索、按站点筛选等功能

3. 购票服务

  • 实现抢票逻辑:下单 → 扣库存 → 支付 → 出票
  • 使用 Redis + 分布式锁控制余票,Kafka 异步入库
  • 下单请求写入 Kafka,避免数据库瞬时写崩

4. 候补服务

  • 支持用户提交候补请求
  • 定时扫描退票信息,从候补队列中匹配出可出票用户

🔹 三、异步消息系统(Kafka)

✅ 设计目标:

  • 解耦服务,提高异步处理能力
  • 高吞吐、高可用、持久化消息处理

✅ 核心作用:

  • 抢票请求进入 Kafka 队列,后台异步处理(防止瞬时流量打挂数据库)
  • 购票成功后异步通知用户 / 更新库存 / 记录日志
  • 候补服务监听退票事件

✅ 和上下游交互:

  • 购票服务、候补服务生产消息
  • Redis、MySQL、风控系统消费消息

🔹 四、缓存系统(Redis)

✅ 设计目标:

  • 提升读写性能,降低数据库压力
  • 实现热点数据缓存、库存控制、限流令牌桶

✅ 使用方式:

  • 缓存热点数据:车次信息、站点列表、余票数量
  • 使用 Redis + Lua 脚本原子扣减余票
  • 使用 Redisson 实现分布式锁控制并发写
-- 原子扣库存脚本
if redis.call("get", KEYS[1]) >= ARGV[1] then
    return redis.call("decrby", KEYS[1], ARGV[1])
else
    return -1
end

🔹 五、数据库层(MySQL)

✅ 设计目标:

  • 存储核心业务数据,保证数据一致性
  • 支持高并发下的写入保障和读写分离

✅ 数据库设计:

  • 用户表、订单表、车票表、交易记录表、候补记录表
  • 分库分表设计(按用户 ID 或车次分片)
  • 配合读写分离中间件(如 MyCat)提速查询

🔹 六、安全防控 & 风控系统

✅ 设计目标:

  • 防止黄牛、刷票、恶意请求
  • 提升系统抗攻击能力

✅ 技术手段:

  • 滑动验证码、人机行为识别、设备指纹
  • 接入行为模型(机器学习)分析用户抢票行为
  • 定时清理黑名单,动态风控策略下发
  • 配合 Kafka 异步接收行为日志进行分析

🔄 模块之间的交互流程

下面是一个抢票请求的典型交互流程:

  1. 用户通过浏览器/App 提交购票请求,经过网关校验并路由到购票服务。

  2. 购票服务检查余票信息(从 Redis 缓存),尝试原子扣减。

  3. 如果成功,则将购票操作封装为消息发送到 Kafka。

  4. 后台异步消费者从 Kafka 消费消息,执行:

    • 写入 MySQL(订单数据)
    • 通知候补系统更新排队状态
    • 通知 Redis 更新库存副本
  5. 安全系统监听用户行为,如发现异常则记录至黑名单,后续拦截。


✅ 总结

该系统采用微服务 + 缓存 + 消息队列 + 安全风控的组合拳,有效应对高并发、强一致性、安全性等挑战。

模块技术亮点
网关限流、鉴权、请求路由
微服务高内聚、可独立扩展
Kafka异步削峰,保障稳定性
Redis高性能缓存、原子扣票
MySQL分库分表、读写分离
风控系统黄牛识别、人机识别、黑名单

整个架构体现了弹性扩展 + 高性能处理 + 安全可靠性的设计目标,是 Java 后端分布式系统设计的典范之一。