1. 项目概述这个基于Python Flask框架的飞机票预约购票系统是我去年为一个中型旅行社开发的线上票务平台核心模块。系统上线后日均处理订单量稳定在300-500单峰值时期能达到2000单/天。相比传统票务代理的人工操作模式这套系统将出票效率提升了8倍以上错误率从原来的5%降至0.3%以下。系统最核心的价值在于实现了机票查询、预订、支付、改签的全流程自动化。通过对接多个航空公司的API接口我们构建了一个实时比价引擎用户可以在同一界面比较不同航司的票价和航班时间。特别在旅游旺季系统智能推荐的中转联程方案平均能为用户节省15-20%的出行成本。2. 系统架构设计2.1 技术栈选型选择Flask作为后端框架主要基于三个考量轻量级特性适合快速迭代项目从零到上线仅用了6周扩展性强通过Blueprint可以灵活添加新功能模块与旅行社现有的PHP系统对接时RESTful API开发更便捷数据库采用MySQL 8.0Redis的组合MySQL存储用户信息、订单记录等结构化数据Redis处理高并发查询和临时锁座操作实测在4核8G服务器上这套组合能稳定支撑每秒150的查询请求2.2 核心模块分解系统包含6个关键模块航班数据采集模块通过Requests库定时爬取各航司数据实时比价引擎采用多线程异步处理不同API返回座位锁定机制Redis分布式锁实现有效期15分钟支付对接模块支持支付宝、微信、银联三种方式订单状态机使用Python-state-machine库管理订单生命周期后台管理系统基于Flask-Admin快速搭建3. 关键技术实现3.1 实时数据获取航班数据获取采用混合策略def fetch_flight_data(): # 主渠道航空公司官方API try: resp requests.get(api_url, timeout3) return parse_official_data(resp.json()) except: # 备用渠道第三方数据平台 return fetch_backup_data()关键优化点设置3秒超时防止接口阻塞实现三级缓存内存-Redis-数据库采用差异更新策略每小时全量更新一次3.2 高并发座位锁定当多个用户同时预订同一航班时采用Redis事务保证数据一致性def lock_seat(flight_id, seat_no): with redis.pipeline() as pipe: while True: try: pipe.watch(flock:{flight_id}:{seat_no}) if pipe.exists(flock:{flight_id}:{seat_no}): pipe.unwatch() return False pipe.multi() pipe.setex(flock:{flight_id}:{seat_no}, 900, 1) pipe.execute() return True except WatchError: continue3.3 支付流程设计支付模块的关键状态转换stateDiagram [*] -- 待支付 待支付 -- 支付成功: 成功回调 待支付 -- 支付失败: 超时/拒绝 支付成功 -- 出票中 出票中 -- 已完成: 出票成功 出票中 -- 异常订单: 出票失败4. 性能优化实践4.1 数据库优化针对订单表做了三项优化水平分表按用户ID哈希分到10个物理表索引优化对(flight_no, depart_time)建立联合索引冷热分离3个月前的订单自动归档4.2 缓存策略采用多级缓存架构热点航班数据内存缓存5秒常用航线信息Redis缓存30分钟机场基础数据永久缓存变更时主动更新4.3 异步处理使用Celery处理非实时任务机票出票后的短信通知改签申请的航司确认每日对账文件生成5. 安全防护措施5.1 防刷单机制实现基于用户行为的限流app.before_request def anti_spam(): if request.path /api/book: key freq_count:{request.remote_addr} count redis.incr(key) redis.expire(key, 60) if count 10: abort(429)5.2 数据加密敏感字段采用AES-256加密用户身份证号银行卡信息联系方式5.3 SQL注入防护强制使用ORM查询# 错误示范 Flight.query.filter(fno{flight_no}) # 正确做法 Flight.query.filter_by(noflight_no)6. 部署方案6.1 服务器配置生产环境采用前端Nginx Docker容器化部署后端Gunicorn Gevent数据库MySQL主从复制Redis哨兵模式6.2 监控体系搭建的监控指标包括接口响应时间Prometheus订单成功率Grafana看板资源使用率Zabbix报警6.3 CI/CD流程使用GitLab Runner实现代码提交触发单元测试测试通过自动构建Docker镜像蓝绿部署到预发环境验证7. 踩坑经验7.1 时区问题早期遇到的典型bug# 错误写法忽略时区 depart_time datetime.strptime(2023-07-15 08:00, %Y-%m-%d %H:%M) # 正确做法 import pytz tz pytz.timezone(Asia/Shanghai) depart_time tz.localize(datetime.strptime(...))7.2 事务隔离MySQL默认的REPEATABLE READ级别导致过更新丢失问题最终调整为db.session.execute(SET TRANSACTION ISOLATION LEVEL READ COMMITTED)7.3 第三方接口容错某航司API返回的票价单位可能是元或分必须处理price data[price] / 100 if data.get(is_cent) else data[price]8. 扩展方向系统后续可扩展智能推荐基于用户历史行为推荐航线动态打包组合机票酒店优惠候补购票利用剩余座位库存这套系统经过三个版本的迭代核心代码量约1.2万行目前稳定运行14个月无重大故障。最大的收获是认识到在高并发场景下宁可多做一层校验也不能少做一次加锁。