面向线下实体门店的限量服务预约场景,典型如餐饮门店的周末限定场次、教培机构的体验课名额、康养与美容门店的时段预约。这类场景的共同特征是号源有限、放号时间集中,高峰期上千用户在几秒内同时进入,一旦库存扣减逻辑有漏洞就会出现超卖,到店核销时才发现接待能力不足,引发客诉与退款。系统需同时支撑场次管理、库存实时扣减、唯一预约码生成、到店核销与会员积分,并在放号瞬间完成页面状态切换,让用户停留原地即可下单。
点击空白处退出提示
面向线下实体门店的限量服务预约场景,典型如餐饮门店的周末限定场次、教培机构的体验课名额、康养与美容门店的时段预约。这类场景的共同特征是号源有限、放号时间集中,高峰期上千用户在几秒内同时进入,一旦库存扣减逻辑有漏洞就会出现超卖,到店核销时才发现接待能力不足,引发客诉与退款。系统需同时支撑场次管理、库存实时扣减、唯一预约码生成、到店核销与会员积分,并在放号瞬间完成页面状态切换,让用户停留原地即可下单。
系统分为用户端小程序与管理后台两部分。用户端包含门店展示、场次列表、预约下单、我的预约、预约码、会员中心与优惠券六个模块,支持手机号授权登录与订阅消息提醒。管理后台包含场次管理、号源库存配置、放号时间设定、预约订单列表、核销扫码、核销流水追溯、会员与优惠券管理、数据看板八个模块。库存按场次独立配置,可设置每人限购数量与重复预约拦截。核销支持扫预约码与手动输入核销码两种方式,核销记录不可撤销并留下操作人与操作时间。后台提供实时库存与核销量曲线,便于门店判断放号节奏。
我负责全部后端与后台管理界面开发,小程序端与协作同事完成。核心难点是放号瞬间的并发扣减:不采用先查询再扣减的写法,而是用数据库原子条件更新把判定与扣减合成一条语句,即 UPDATE 库存 SET 剩余数 = 剩余数 - 1 WHERE 场次ID = ? AND 剩余数 > 0,以影响行数判断是否抢到,从语句层面消除超卖;叠加 Redis 预扣字段承担读压力,Kafka 把下单请求排队削峰落库,Nginx 层做限流与降级。页面状态切换不依赖前端轮询,改用 WebSocket 长连接推送放号事件,前端收到后原地切换场次状态,用户无需刷新或重进。压测 1000 并发抢 100 个号源,超卖 0 单,放号到状态切换小于 1 秒。



评论