入学诊断
12 道题,覆盖本书的六个核心概念。不要查资料,15 分钟内做完;答案在最后,先记下你的选择。
1 题目
Q1 客户端设置 1 s 超时,1 s 后收到 timeout。服务端最可能处于什么状态?
A. 一定没收到请求 B. 一定执行成功 C. 可能没收到、可能执行中、可能已成功 D. 一定执行失败
Q2 一个客户端对每个请求重试 3 次,失败后上游再重试 3 次。最坏情况下游收到多少次请求?
A. 3 B. 4 C. 9 D. 16
Q3 三副本,W=2, R=2,是否一定满足线性一致?
A. 一定 B. 只在没有并发写时 C. 不一定,还要看读修复、写确认与时钟/排序规则 D. 只要 R+W>N 就一定
Q4 下面哪种历史违反线性一致?设写 x=1 在 t1 返回,读在 t2 开始且 t2 > t1。
A. 读返回 1 B. 读返回 0 C. 读超时 D. 读返回 1 但来自从库
Q5 Raft 中,leader 能把 commitIndex 推进到某个日志项的条件是:
A. 本地写入磁盘 B. 多数派复制了该项,且该项属于当前 term(或通过当前 term 的项间接提交) C. 所有 follower 都复制了 D. 客户端收到 ACK
Q6 PostgreSQL 的 READ COMMITTED 能防止下列哪个异常?
A. 脏读 B. 不可重复读 C. 幻读 D. 写偏斜
Q7 Kafka 的「至少一次」语义下,重复最可能来自:
A. 生产者发送前 B. 消费者处理成功但 offset 提交失败/再平衡 C. broker 落盘 D. 分区数太多
Q8 缓存旁路(cache-aside)下,最危险的旧值路径是:
A. 缓存命中 B. 先更新数据库、后删除缓存,但删除失败 C. 缓存 TTL 太长 D. 缓存容量太小
Q9 SET lock:key value NX PX 30000 的锁,在下列哪种情况下可能被两个客户端同时持有?
A. Redis 重启 B. 客户端 GC 停顿超过 30 s,锁过期后被另一个客户端获取 C. 网络延迟 1 ms D. 使用 Lua 解锁
Q10 一个服务的 p50 是 20 ms,p99 是 2 s。最应该先看什么?
A. 平均延迟 B. 慢请求的 trace 与下游分位 C. CPU 使用率 D. 日志条数
Q11 系统利用率从 60% 升到 85%,延迟通常会:
A. 线性上升 1.4 倍 B. 基本不变 C. 非线性上升,排队时间显著变长 D. 下降
Q12 故障演练中,「爆炸半径」指的是:
A. 故障注入脚本的行数 B. 一次演练可能影响的最大用户/数据/服务范围 C. 告警条数 D. 恢复时间
2 答案与解释
答案
A1 C。超时只说明客户端不再等待。请求可能还在网络上、可能正在执行、可能已经提交但响应丢了。第 1 章把「未知」作为一等状态。
A2 D。每一层最多 4 次尝试(首次 + 3 次重试),两层相乘是 16 次。注意这是最坏情况,实际受重试预算与退避限制;第 2 章会讲怎么把 16 压到可控范围。
A3 C。R+W>N 只保证读写集合相交,不保证读到的就是最新已提交值:还需要写确认规则、读修复、避免脏读、以及读操作在返回前等待必要的提交。第 4 章给反例。
A4 B。x=1 已经返回,之后开始的读必须看到 1(或更新的值);返回 0 说明读发生在写生效之前,违反实时序。C 是未知,不构成反例;D 只要值正确就不违反。
A5 B。Raft 的提交规则:leader 只能直接提交当前 term 的日志项;旧 term 的项要通过当前 term 的项间接提交。只写本地磁盘或等所有 follower 都不够。
A6 A。PostgreSQL 的 READ COMMITTED 防止脏读,但允许不可重复读、幻读和写偏斜。第 6 章会用 MVCC 解释为什么。
A7 B。消费者处理完消息但 offset 没提交(崩溃或再平衡),消息会被重新投递。生产者的重试也可能造成重复,但 Kafka 幂等生产者/事务能消掉一部分;消费者侧仍是主因。
A8 B。先写库后删缓存,删除失败会留下旧缓存,直到 TTL 到期。TTL 太长会放大窗口;容量小只会导致更多回源。第 8 章会讲延迟双删、版本号与 binlog 失效。
A9 B。GC/STW 或进程暂停超过租约,锁自动过期,另一个客户端获取;原客户端恢复后仍以为自己持有锁。解法不是加长 TTL,而是 fencing token。
A10 B。p50 正常、p99 很差,说明长尾;先看慢请求 trace 与下游分位,不要被平均值骗。CPU 可能不高,因为瓶颈在排队或下游。
A11 C。排队系统在利用率接近 1 时延迟非线性上升;M/M/1 的 W = 1/(μ-λ) 在 λ→μ 时发散。第 11 章给曲线与容量余量。
A12 B。爆炸半径是一次演练可能影响的最大范围;控制它比「注入更多故障」重要。第 11 章给剧本模板。
3 评分
| 答对 | 建议起点 |
|---|---|
| 10–12 | 直接从第 2 章开始;第 1 章快速扫一遍状态机与失败分类 |
| 6–9 | 按顺序读第 1–5 章,项目选一个做 |
| 3–5 | 先读第 1、2 章,补 Linux 书第 4 篇的 TCP/HTTP 基础,再回来 |
| 0–2 | 先从 Linux 书第 4 篇开始;本书第 1 章会假设你知道「请求要经过网络」 |
诊断的目的是选起点,不是打分。答错不丢人;真正危险的是把「超时=失败」「至少一次=不会重复」「R+W>N=线性一致」当成常识带进生产。