真实面经题目 · 原创解析
新增“十连抽”功能时会考虑什么设计模式?
考察设计模式能否落到抽奖业务扩展上,重点是稳定流程、可替换规则、校验链路、幂等事务和发奖补偿。
真实面经题目 · 原创解析
考察设计模式能否落到抽奖业务扩展上,重点是稳定流程、可替换规则、校验链路、幂等事务和发奖补偿。
十连抽不是把单抽 for 循环十次。回答时我会先抽象主流程:参数校验、资格校验、资源扣减、奖池选择、概率计算、库存占用、发奖、记录和通知。模板方法可以固定流程骨架;策略模式封装不同奖池、概率、保底和活动规则;责任链处理资格、余额、风控、限频、库存等校验;状态模式或状态机管理抽奖单从创建到发奖完成的流转。工程上还要保证请求幂等、扣减和发奖的一致性、失败补偿和活动配置可灰度。
十连抽有批量语义:一次请求、一次幂等号、一次资源扣减、十个结果和一组发奖记录。它通常还涉及保底、限定奖池、库存、风控和活动周期,不能简单复用单抽十次的外部行为。
抽奖主流程可以由模板方法规定执行顺序,例如校验、扣资源、计算结果、占库存、发奖、落记录、发送事件。不同活动只替换某些步骤,主流程边界保持一致,避免每个活动复制一套控制逻辑。
奖池选择、概率算法、保底规则、权重调整、用户分层和活动玩法都适合策略化。调用方只依赖抽奖策略接口,具体策略由活动配置或实验开关选择,新增玩法时不必改主流程。
资格、时间窗口、余额、次数限制、风控、库存预检等校验可以组成责任链,每个节点只处理一个规则,失败时中断并返回明确原因。链路顺序要可配置,但不能让节点偷偷修改核心状态。
扣资源、占库存、发奖和记录必须有清晰事务边界。常见做法是先生成抽奖单和幂等号,扣减资源后推进状态,发奖通过可靠消息或本地事务完成;失败进入补偿任务,保证不会扣了资源却没有结果,也不会重复发奖。
十连抽通常有一次性扣减、保底、批量结果、统一幂等和原子展示语义。循环十次会让中途失败、库存扣减、保底计数和重复请求都变复杂,用户也可能看到半成功状态。
策略模式选择一套抽奖算法或奖池规则,是“选哪个算法”;责任链是一组校验或处理节点依次执行,是“依次过哪些关”。两者可以组合,但职责不能混在一起。
抽奖结果和发奖状态要先落库,发奖通过消息重试或补偿任务推进。对用户可展示“处理中”,后台保证最终发放、退款或人工处理,不能让请求线程无限等待。
客户端或服务端生成抽奖请求号,同一用户同一请求号只能创建一个抽奖单。重复请求直接返回已有结果或当前状态,扣资源和发奖都要以抽奖单号做唯一约束。