秋招秒杀题:100 件库存来了 1 万人,先问这 4 个问题

简介: 校招经典题“100库存+1万人秒杀”考察的不是堆工具,而是系统思维:先澄清业务口径(扣减时机、成功定义、幂等策略),建模状态机与核心不变量;再用可验证脚本生成证据,核对四本账;最后叠加故障看容错。本质是模糊需求下的工程判断力。

校招面试里,“100 件库存同时来了 1 万人,你怎么测试”几乎是一道经典题。很多同学会立刻列:功能、性能、安全、兼容、弱网,再补一句 JMeter 模拟 1 万并发。

看起来全面,却容易被追问两句就断掉:这一万人是同时连接还是一秒内到达?下单成功以接口 200、订单落库还是支付成功为准?未支付库存多久释放?

第一步不是列点,而是确认系统承诺
你可以先问四件事:是否一人一单;库存在哪个阶段扣减;订单创建和支付是否异步;超时与重复请求怎样处理。

这几问能把“测秒杀”变成明确状态机:可售 → 锁定 → 已售,失败或超时则从锁定回到可售。随后才能写出真正重要的不变量:库存不能为负;成功订单不能超过 100;同一用户不能重复占用;可售、锁定、已售三者之和守恒。

一段并发脚本,只负责制造条件
下面用 500 个模拟用户演示。每个请求带稳定幂等键,故意让部分用户重复提交。脚本只收集请求证据,最终结论必须回到数据库和库存状态:

import asyncio, uuid, httpx

async def buy(client, user_id, duplicate=False):
key = f"sale-20260905-{user_id}"
payload = {"sku":"PHONE-X", "user_id":user_id}

async def once():
    r = await client.post("http://sut/seckill", json=payload,
                          headers={"Idempotency-Key": key})
    return r.status_code, r.json()

if duplicate:
    return await asyncio.gather(once(), once())
return [await once()]

async def run_burst(users=500):
limits = httpx.Limits(max_connections=600)
async with httpx.AsyncClient(timeout=10, limits=limits) as client:
tasks = [buy(client, f"u-{i}", duplicate=(i % 20 == 0))
for i in range(users)]
return await asyncio.gather(*tasks)
为什么不是直接写 1 万?因为面试里要说明负载模型来自容量目标,而不是数字越大越专业。单机脚本能不能稳定发出 1 万并发、连接池和压测机是否先成瓶颈,都要校准。正式压测更应按“到达率、峰值持续时间、地域和失败重试”建模。

压完之后,要核对四本账
第一本是请求账:谁发了几次、用了什么幂等键。第二本是订单账:成功订单数量和用户唯一性。第三本是库存账:可售、锁定、已售是否守恒。第四本是资金账:支付迟到、关单、退款是否闭环。

def assert_final_state(db, initial_stock=100):
orders = db.query("SELECT user_id, status FROM orders WHERE sale_id='20260905'")
paid = [o for o in orders if o.status == "PAID"]
assert len({o.user_id for o in orders}) == len(orders)
assert len(paid) <= initial_stock

stock = db.one("SELECT available, locked, sold FROM stock WHERE sku='PHONE-X'")
assert min(stock.available, stock.locked, stock.sold) >= 0
assert stock.available + stock.locked + stock.sold == initial_stock

再补三个故障,答案就有工程味了
在库存锁定成功、订单消息发送前杀进程;支付回调重复三次;消费者处理成功但 ACK 丢失。每个故障都要说明预期状态、补偿触发条件和最终收敛时间。

最后再谈性能:关注成功请求的 P95/P99、限流是否明确、失败是否快速、数据库锁等待与消息积压,而不是只报一个峰值 QPS。

校招题不是让你在五分钟里设计完整秒杀平台。面试官真正判断的是:面对模糊需求,你能否先问清口径,抓住最关键的不变量,再用代码和数据形成证据。这种回答方式,换到订单、优惠券、抢票和库存系统同样成立。

相关文章
|
27天前
|
人工智能 Kubernetes 测试技术
会AI的测试开发,薪资到底能高多少?我扒了100份JD
2026年测试岗巨变:手工测试需求降47%,测开岗涨340%。AI测试开发年薪达35–100万+,远超传统测开;岗位核心已从“验证功能”转向“评测能力”,要求大模型、Agent、RAG等实战经验。
|
1月前
|
人工智能 JavaScript 测试技术
从需求到用例全自动:三条知识库路径+两种工作流,我搭了一套永不掉链子的测试智能体
别再让AI反复读文档!本文揭秘如何用“知识地图”(向量库+知识图谱+Markdown库)构建AI长期记忆,结合工作流编排,实现精准、关联、可复用的测试用例自动生成——从临时喂文档,升级为智能导航式测试生产力。
|
26天前
|
JSON JavaScript 前端开发
Playwright + axe-core + CI:把无障碍回归做成一条能拦住上线的流水线
本文详解如何将Web无障碍(WCAG 2.1 AA)从“上线前人工抽查”升级为CI流水线门禁:通过Playwright+axe-core自动扫描关键页,按impact分级熔断,结合带过期日与责任人的baseline豁免清单,实现全覆盖、可追溯、防退化的工程化保障。
|
24天前
|
Web App开发 JavaScript 前端开发
Playwright 从入门到实战:我把 UI 自动化稳定性从 60% 提到 95%
本文分享团队从Selenium迁移到Playwright的实战经验:直击“测试随机失败”痛点,通过自动等待、语义化定位、登录态复用、API准备数据等6大关键优化,将测试稳定性从62%提升至96%,执行时间缩短三分之二,并显著降低排查成本。
|
24天前
|
人工智能 JavaScript NoSQL
我用AI把回归测试从3天压到3小时,提示词全公开
本文揭秘如何用AI将回归测试从3天压缩至3小时:不靠“一键全自动”,而是把AI当实习生,拆解为影响面分析、用例生成、脚本转换、失败诊断、报告汇总5个环节,每个环节配可直接复用的精准提示词。重在清晰指令+充足上下文+人工审核,治好了回归测试的人肉瓶颈。
|
1月前
|
人工智能 JSON 前端开发
等价类和边界值,在 AI 一键生成用例的时代还值不值得手画
本文揭示AI生成测试用例的盲区:看似全面,实则系统性缺失边界值(如2000.01)、精度异常(如0.001)和类型错误(空、null、非数字)。提出以等价类为“坐标系”约束AI生成,以边界值为“刻度尺”自动验收,实现覆盖可度量、冗余可识别、回归可追溯。
|
1月前
|
人工智能 运维 算法
智能体开发平台架构全解析:拆解生产级 Agent 的四大核心模块
随着大模型能力逐渐同质化,企业 AI 落地的竞争重心,正从「模型谁更强」转向「谁能把模型变成能干活的数字员工」。本文从架构视角,拆解一个能真正接入业务系统的智能体开发平台(Agent Development Platform,ADP)由哪些模块组成,并给出自研与采购的实战决策框架。
153 1
|
17天前
|
JSON 人工智能 测试技术
Agent Skills、MCP、Function Calling 到底啥区别?一文讲透
本文厘清AI Agent三大核心概念:Function Calling(模型调用工具的“嘴”,负责结构化指令)、MCP(标准化连接协议, akin “插座”,解耦模型与工具)、Agent Skills(封装业务逻辑的“经验包”,含流程、异常处理与复用能力)。三者呈层级协作关系,非替代关系,共同构建可落地的自动化测试体系。
|
17天前
|
人工智能 自动驾驶 Java
2026年理想汽车职级薪资:测试开发能拿多少?附社招面试题
本文详解2026年理想汽车测试开发岗:薪资达28K–55K·14薪,已取消P/M序列,启用8–30级双通道职级;面试聚焦AI能力——大模型评测、Agent/RAG测试、AI用例生成与质量评估,并融合车云一体、自动驾驶等智能汽车特色场景。