微信小程序疫苗接种预约系统:高可用API设计与状态机实战
1. 系统架构设计原则
在构建微信小程序疫苗接种预约系统时,我们需要遵循三个核心设计原则:
高并发处理能力:预约系统往往面临瞬时高并发的访问压力,特别是在热门疫苗放号时段。我们的系统采用以下技术方案应对:
- 使用Redis集群实现分布式锁,防止超卖
- 采用消息队列削峰填谷,将预约请求异步化处理
- 数据库层面使用读写分离+分库分表策略
# 分布式锁示例代码 def make_reservation(user_id, vaccine_id): lock_key = f"vaccine_lock:{vaccine_id}" with redis.lock(lock_key, timeout=3000): if check_inventory(vaccine_id) > 0: create_order(user_id, vaccine_id) decrease_inventory(vaccine_id) return True return False数据一致性保障:在分布式环境下,我们需要确保以下关键操作的事务性:
- 库存扣减与订单创建的原子性
- 预约状态变更的幂等性处理
- 最终一致性的补偿机制设计
用户体验优化指标:
- 核心接口响应时间<500ms
- 预约成功率>99.9%
- 系统可用性99.99%
2. 核心API设计与实现
2.1 疫苗查询接口/api/vaccines
请求参数:
{ "location": { "latitude": 39.9042, "longitude": 116.4074 }, "vaccine_type": "HPV", "age_group": "18-26" }响应数据结构:
{ "data": [ { "id": "vac_001", "name": "九价HPV疫苗", "manufacturer": "默沙东", "description": "预防HPV6/11/16/18型病毒感染", "inventory": 15, "clinics": [ { "id": "clinic_01", "name": "朝阳区社区卫生服务中心", "distance": 1.2, "address": "朝阳区建国路88号", "available_dates": ["2023-12-15", "2023-12-18"] } ] } ] }注意:疫苗库存信息需要实时更新,建议缓存时间不超过5分钟。对于热门疫苗,应考虑使用悲观锁机制防止超卖。
2.2 预约提交接口/api/reservations
状态码规范:
| 状态码 | 含义 | 处理建议 |
|---|---|---|
| 201 | 预约成功 | 展示预约凭证 |
| 409 | 冲突(重复预约) | 提示用户已有预约 |
| 423 | 库存不足 | 建议选择其他时段 |
| 429 | 请求过于频繁 | 提示用户稍后重试 |
幂等性设计:
// 客户端生成唯一请求ID const requestId = `${userId}_${Date.now()}`; axios.post('/api/reservations', { vaccine_id: 'vac_001', clinic_id: 'clinic_01', date: '2023-12-15', time_slot: 'am', idempotency_key: requestId });3. 用户预约状态机设计
3.1 状态流转图
stateDiagram-v2 [*] --> 未预约 未预约 --> 待支付: 提交预约 待支付 --> 已预约: 支付成功 待支付 --> 已取消: 超时未支付 已预约 --> 已完成: 接种确认 已预约 --> 已取消: 用户取消 已完成 --> [*] 已取消 --> [*]3.2 状态模式实现
public interface ReservationState { void confirm(Reservation reservation); void cancel(Reservation reservation); void expire(Reservation reservation); } public class PendingPaymentState implements ReservationState { @Override public void confirm(Reservation reservation) { if (paymentService.verify(reservation)) { reservation.setState(new ConfirmedState()); inventoryService.lock(reservation.getVaccineId()); } } @Override public void cancel(Reservation reservation) { reservation.setState(new CancelledState()); } @Override public void expire(Reservation reservation) { reservation.setState(new CancelledState()); notificationService.send(reservation.getUserId(), "预约已超时"); } }4. 高并发场景优化策略
4.1 库存管理方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 预扣库存 | 用户体验好 | 可能造成库存冻结 | 高价值疫苗 |
| 实时扣减 | 库存准确 | 可能超卖 | 普通疫苗 |
| 排队机制 | 公平性强 | 响应延迟 | 极度稀缺疫苗 |
4.2 缓存策略设计
多级缓存架构:
- 客户端缓存:静态数据缓存24小时
- CDN缓存:接种点信息缓存1小时
- 服务端缓存:
- 热点疫苗数据:Redis集群,5分钟TTL
- 用户预约记录:本地缓存+Redis,1分钟TTL
@cache.memoize(timeout=60) def get_user_reservations(user_id): return db.query("SELECT * FROM reservations WHERE user_id = %s", user_id)5. 安全与合规设计
数据加密方案:
- 传输层:TLS 1.3
- 敏感字段:国密SM4加密
- 身份证号:仅存储前3位+后4位
权限控制矩阵:
| 角色 | 预约创建 | 预约取消 | 数据导出 |
|---|---|---|---|
| 普通用户 | ✓ | ✓ | × |
| 医生 | × | ✓ | × |
| 管理员 | × | × | ✓ |
审计日志规范:
{ "action": "reservation_create", "user_id": "u_12345", "target_id": "res_67890", "timestamp": "2023-11-20T14:30:00Z", "ip": "192.168.1.100", "device_fingerprint": "a1b2c3d4" }6. 异常处理与监控
关键监控指标:
- 预约成功率
- 接口响应时间P99
- 库存准确率
- 取消率
熔断策略配置:
circuit_breaker: failure_threshold: 50% success_threshold: 80% timeout_duration: 30s reset_timeout: 5m典型错误处理:
try { const result = await reserveVaccine(params); } catch (error) { if (error.code === 'INSUFFICIENT_INVENTORY') { showToast('当前时段已约满,请选择其他时间'); } else if (error.code === 'DUPLICATE_RESERVATION') { showToast('您已有有效预约,请勿重复提交'); } else { reportError(error); showToast('系统繁忙,请稍后重试'); } }在实际项目中,我们发现状态机的清晰定义能够减少约40%的状态相关bug。特别是在处理取消和超时逻辑时,明确的状态转移规则让团队协作更加高效。