在后台开发领域,高并发扣减始终是热门话题。无论是技术博客、行业大会还是面试环节,其高频出现都印证了它的核心地位与技术深度。本文将聚焦一种基础但重要的实现方式——基于纯数据库的扣减方案。
一、 扣减类业务:不只是秒杀
看到标题,很多人可能会疑惑:扣减业务不就是指秒杀吗?为何要用如此抽象的名称?
关键洞察: 秒杀确实是扣减类业务中一个极具代表性、技术复杂度高的场景,但它远非全部。扣减类业务涵盖广泛,常见场景包括:
- 购买商品时扣减的库存
- 商家设置的用户单商品最大购买次数限制扣减
- 支付订单时用户账户余额或优惠券额度的扣减
- …
这些场景有几个核心共性:
- 数量共享: 被扣减的数量(库存、限额、余额)是多个用户共享的资源。
- 批量操作: 一次操作可能涉及扣减一个或多个目标(如购物车多件商品)。
- 精准性要求: 必须确保扣减成功(数量充足)才能继续后续业务。
基于此,我们可以为扣减类业务给出清晰定义:
扣减类业务: 需要通过对一个或多个已有的、用户间或用户内共享的数量资源,进行精准扣减成功才能继续执行后续流程的业务。
明确这个定义至关重要,它将我们讨论的范围锚定,避免因概念模糊产生分歧。理解定义后,再来对比它与读业务、UGC写业务的区别:
- 读业务 (读多写少): 核心是处理海量查询。写操作通常来自后台,SLA要求较低;读操作SLA要求极高。数据相对静态,常通过缓存、CDN等手段前置以应对性能挑战。
- UGC写业务 (用户生成内容): 与扣减类似,写操作来自C端,SLA要求高。但关键区别在于:数据是用户私有的(如发帖内容),且写入不依赖已有数据状态(只需尽力存储新数据)。
- 扣减类业务: 核心挑战在于安全、准确地修改共享的、已有的数量状态。其技术实现重心在于如何在高并发下保证数据的一致性与正确性。
二、 扣减类业务的技术关注点
扣减操作天然伴随着一个后续可能——归还(如用户退货需恢复库存/限额/金额)。虽然归还同样重要,但其并发压力通常远低于扣减本身。因此,本系列将先用三讲深入探讨高并发扣减的实现,再讲解归还机制。
根据扣减业务定义,其核心实现需满足以下要求:
扣减需保证:
- 防超卖: 当前剩余数量 >= 当次需扣减数量。
- 并发一致性: 多个用户同时扣减同一资源时,结果必须正确。
- 性能与可用性: 响应需达秒级,服务高可用。
- 批量原子性: 一次扣减可能涉及多个目标(如多件商品)。所有目标扣减必须整体成功或整体失败(回滚)。
- 幂等性: 因