第 1 题
同一张表上,为什么把查询需要的列都放进二级索引后,执行计划可能从「回表」变成「覆盖索引」?这样做的代价是什么?
尚未检查本题。
查看答案与评价要点
参考答案:二级索引叶子只存索引列和主键值,缺少的列必须回到聚簇索引再取一次;把所需列都放进索引后,查询可以只扫描该二级索引即可返回结果,从而免去回表。代价是索引变宽、占用更多空间,并增加每次写入时的索引维护开销。
评价要点:说明二级索引叶子存的是索引列与主键值;解释回表的触发条件和覆盖索引如何避免它;指出空间与写放大方面的代价
浏览器未允许保存进度;当前为只读学习模式。
第 4 周 · 初阶
掌握分布式系统核心中间件
周目标:掌握消息队列、缓存、数据库等中间件
课程成果:CO1 CO2 CO8
已学习 0 / 7 天
Day 22
建议时长:75 分钟
本日 CO:CO1 CO2 CO8
把关系型数据库看成由连接与解析层、优化器和存储引擎组成的分层系统。InnoDB 的主键是聚簇索引,行数据就存放在主键 B+ 树的叶子上;二级索引叶子存的是主键值,因此不能被索引覆盖的查询需要回表。ACID 中的隔离性由四个隔离级别与 MVCC、行锁、间隙锁共同实现,脏读、不可重复读和幻读分别在不同级别被挡住。分库分表能缓解单机容量与写入压力,但会引入跨分片查询、全局主键和数据迁移等新成本,只有在有实测证据时才应该讨论。
7 分钟 · MP3 · 双主持人讲解
InnoDB 以主键组织表:主键 B+ 树的叶子节点直接保存整行数据,这就是聚簇索引;二级索引的叶子只保存索引列和主键值。因此用二级索引查询时,若需要的列不在索引里,就要拿主键再回到聚簇索引取一次数据,这一步叫回表。当查询需要的列全部包含在某个二级索引中时可以避免回表,官方文档称之为覆盖索引。理解这一点,才能解释为什么给同一张表加不同顺序的联合索引,性能差别可以很大。
联合索引按最左前缀匹配:索引 (a, b, c) 能支持 a、a+b、a+b+c 的等值查找,但单独用 b 或 c 过滤时通常无法有效利用。范围条件之后的列一般也不能继续用于精确定位。索引还有写入代价——每次插入、更新、删除都要维护对应的 B+ 树,索引越多写放大越明显。所以「加索引」是一次权衡,不是无条件的优化,必须用具体查询和具体数据量来验证。
MySQL 的 InnoDB 支持 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE 四个隔离级别,默认是 REPEATABLE READ。级别越高,能避免的异常越多,并发代价通常也越大:READ COMMITTED 消除脏读,REPEATABLE READ 让同一事务内的一致性读看到同一份快照,SERIALIZABLE 则把普通读也变成加锁读。学习者应把「哪个异常在哪个级别被挡住」写成一张对照表,而不是死记级别名称。
锁的粒度决定了并发冲突的形状。InnoDB 的行锁作用在索引记录上——这意味着如果一条 UPDATE 没有走索引,可能会锁住远超预期的范围。间隙锁与临键锁用于阻止范围内插入,从而抑制幻读,但也更容易造成阻塞。死锁通常来自两个事务以相反顺序获取同一组资源;处理方式是统一访问顺序、缩短事务、必要时重试,而不是简单地调大超时。
在本人授权的本地 MySQL 实例中构造一张有数据的测试表,用 EXPLAIN 对比命中索引、回表和全表扫描三种执行计划,并记录版本、表结构、行数与原始输出。
同一张表上,为什么把查询需要的列都放进二级索引后,执行计划可能从「回表」变成「覆盖索引」?这样做的代价是什么?
尚未检查本题。
参考答案:二级索引叶子只存索引列和主键值,缺少的列必须回到聚簇索引再取一次;把所需列都放进索引后,查询可以只扫描该二级索引即可返回结果,从而免去回表。代价是索引变宽、占用更多空间,并增加每次写入时的索引维护开销。
评价要点:说明二级索引叶子存的是索引列与主键值;解释回表的触发条件和覆盖索引如何避免它;指出空间与写放大方面的代价
一条 UPDATE 语句在测试环境运行正常,上线后却频繁引起阻塞。从索引与锁的角度,应该优先检查什么?
尚未检查本题。
参考答案:优先检查 WHERE 条件是否走了索引:InnoDB 的行锁加在索引记录上,未命中索引时可能锁定远超预期的范围。还应检查隔离级别下是否产生间隙锁、事务是否过长、是否与其他事务以相反顺序访问同一批行。
评价要点:指出行锁作用在索引记录上;把未命中索引与锁范围扩大联系起来;提出事务长度、间隙锁或访问顺序中的至少一项排查方向
尚未完成自测。
使用教师提供的建表脚本与数据集,完成三份 EXPLAIN 对比并口述每份计划走了哪条路径。
自行设计数据与查询,完成三份 EXPLAIN 对比,并额外给出一个索引失效的反例与原因分析。
在同一张表上设计两条会互相死锁的事务,记录 SHOW ENGINE INNODB STATUS 的死锁信息,并提出一种消除死锁的访问顺序方案。
学习状态:未学习
Day 23
建议时长:75 分钟
本日 CO:CO1 CO2 CO8
Redis 与 MongoDB 解决的是关系型数据库不擅长的问题,但各自有明确边界。Redis 的价值来自数据结构本身:字符串、哈希、列表、集合、有序集合和位图分别对应不同访问模式,排行榜用有序集合、去重用集合、会话用哈希;它的命令在单线程事件循环中执行,因此一条慢命令或一个超大 key 会阻塞整个实例。MongoDB 的核心决策是内嵌还是引用,以及写关注级别要不要等待多数节点确认。缓存部分的难点不是「加缓存」,而是一致性:更新顺序、穿透、击穿、雪崩各有不同成因和不同缓解手段。
6 分钟 · MP3 · 双主持人讲解
Redis 的官方文档把数据类型作为第一层概念:有序集合按分数排序并支持按排名或分数范围取区间,天然适合排行榜;集合支持成员唯一与集合运算,适合去重和标签交并;哈希适合存放对象的多个字段而不必整体序列化;位图与 HyperLogLog 用极小的空间回答「是否出现过」和「大约有多少个不同值」。选错结构会把 O(log n) 的操作退化成一次全量读取再在应用里排序。
Redis 处理命令的主线程是单线程的,这带来了简单的原子语义,也意味着任何一条长时间运行的命令都会让其他请求排队。官方的延迟排查文档明确把慢命令、大 key、持久化 fork、内存交换列为常见来源。因此实践中要避免对大集合执行无界的范围操作,避免用 KEYS 扫描生产实例,并为 key 的大小和元素数量设定可检查的上界。
旁路缓存是最常见的模式:读时先查缓存,未命中则查数据库并回填;写时更新数据库并使缓存失效。更新顺序很重要——先删缓存再写库,或先写库再删缓存,在并发下都有可能出现短暂的旧值窗口,需要用过期时间兜底。真正要写进设计文档的,是「不一致窗口有多长、期间用户会看到什么、如何收敛」,而不是宣称缓存与数据库始终一致。
缓存穿透指查询一个数据库中也不存在的 key,缓存永远无法命中,请求全部打到数据库,可以用空值缓存或布隆过滤器缓解;缓存击穿指某个热点 key 过期瞬间大量并发同时回源,可以用互斥重建或逻辑过期缓解;缓存雪崩指大批 key 在同一时刻集中过期,缓解手段是给过期时间加随机抖动并分散预热。三者成因不同,混为一谈会导致用错手段。
用本人本地的 Redis 实例实现一个带过期时间的排行榜与一段旁路缓存逻辑,构造缓存未命中、缓存穿透和批量同时过期三种情况并记录观察。
为什么在 Redis 中「一个超大 key」会成为整个实例的可用性风险,而不只是这一个 key 变慢?
尚未检查本题。
参考答案:Redis 主线程按顺序执行命令,对超大 key 的操作会长时间占用主线程,期间其他客户端的请求只能排队,表现为整个实例的延迟升高;删除或序列化超大 key 时同样如此。因此需要限制单 key 的大小与元素数量,并避免无界范围操作。
评价要点:指出命令在主线程中顺序执行;说明长命令会让其他请求排队,影响面是实例级;给出限制 key 大小或避免无界操作的应对
缓存穿透与缓存雪崩的成因分别是什么?各应采用什么缓解手段?
尚未检查本题。
参考答案:穿透是查询数据库中本就不存在的数据,缓存永远不命中,请求全部落到数据库,可用空值缓存或布隆过滤器拦截;雪崩是大批 key 在同一时刻集中过期或缓存整体不可用,导致回源流量骤增,可用过期时间随机抖动、分散预热和限流降级缓解。
评价要点:准确区分两者成因;为穿透给出空值缓存或布隆过滤器;为雪崩给出抖动、预热或限流中的至少一项
尚未完成自测。
使用教师提供的脚本完成排行榜与一次缓存命中/未命中的观察,并说出各自用了哪种数据结构。
自行实现排行榜与旁路缓存,完成穿透与集中过期两组对比实验并提交记录。
为热点 key 实现互斥重建或逻辑过期方案,用并发请求验证回源次数下降,并分析该方案引入的新等待。
学习状态:未学习
Day 24
建议时长:75 分钟
本日 CO:CO1 CO2 CO8
消息队列把同步调用变成异步事件,但也把「调用失败」变成了「投递语义」问题。Kafka 以分区为并行单位,每个分区是一个有序、可重放的提交日志,消费者组通过位点提交决定进度;顺序保证只在分区内成立。RabbitMQ 用交换机、绑定和队列描述路由,直连、主题、扇出等交换机类型对应不同分发模式。至少一次、至多一次、恰好一次都有成立条件:只要存在重试,消费端就必须自己做幂等。设计时要同时画出重复投递、消费失败、积压和死信这四条失败路径,而不是只画正常流程。
6 分钟 · MP3 · 双主持人讲解
Kafka 的主题被划分为多个分区,每个分区是一个只追加的有序日志,消息在分区内有严格顺序,跨分区则没有全局顺序。生产者通过分区键决定消息落到哪个分区——把同一订单的所有事件用订单号作为分区键,才能保证这些事件被顺序消费。消费者组中,一个分区在同一时刻只会被组内一个消费者消费,所以消费并行度的上限就是分区数,加消费者并不能突破这个上限。
消费进度由位点表示。位点在处理之前提交,崩溃时消息会丢失,接近至多一次;在处理之后提交,崩溃时消息会被重复消费,接近至少一次。Kafka 官方文档在讨论投递语义时明确指出,端到端的恰好一次需要生产端幂等、事务写入与消费端配合共同成立,而不是打开一个开关就能获得。这也是为什么消费端幂等必须由业务侧承担:用业务唯一键去重,比依赖中间件承诺更可靠。
RabbitMQ 遵循 AMQP 0-9-1 模型:生产者把消息发给交换机,交换机按绑定关系和路由键把消息投递到队列,消费者从队列取用。直连交换机按精确路由键匹配,主题交换机按模式匹配,扇出交换机广播给所有绑定队列。与 Kafka 的「日志可重放」不同,队列中的消息一旦被确认通常就移除了,重放需要额外设计。选型时要问的是:需要历史重放吗?需要多消费者各自独立读取同一份数据吗?
任何异步设计都要显式回答四个问题。重复投递:消费端如何用幂等键去重?消费失败:重试几次、退避多久、超过阈值后进入哪个死信队列?积压:如何观测滞后量、扩容是否受分区数限制、能否临时丢弃低价值消息?死信:谁负责查看、如何重投、重投是否会造成二次影响?把这四条写进设计文档,比画一张漂亮的正常流程图有价值得多。
为一个订单事件设计可重放的消费流程,说明分区键、位点提交时机、幂等键与死信处理,并用本地实例或教师证据包验证重复投递时的结果。
为什么给 Kafka 消费者组增加消费者,超过分区数之后吞吐不再提升?
尚未检查本题。
参考答案:同一个分区在同一时刻只会分配给消费者组内的一个消费者,因此组内的有效并行度上限等于分区数;超出部分的消费者会处于空闲状态。要提升并行度需要增加分区,并同时评估分区键分布和顺序保证的影响。
评价要点:指出一个分区同时只被组内一个消费者消费;说明并行度上限由分区数决定;提出增加分区并考虑分区键或顺序影响
某系统声称使用了「恰好一次」的消息队列,因此消费端不做幂等。这个判断有什么问题?
尚未检查本题。
参考答案:恰好一次是端到端的性质,需要生产端幂等/事务、中间件配置和消费端处理与位点提交在同一原子边界内共同成立;一旦消费端有外部副作用(如调用第三方接口、写另一个库),中间件的承诺无法覆盖。因此消费端仍需用业务唯一键做幂等,否则重试会造成重复副作用。
评价要点:指出恰好一次是端到端条件而非中间件开关;说明外部副作用不在中间件事务边界内;坚持消费端用业务唯一键幂等
尚未完成自测。
使用教师证据包分析一份已有的消费日志,标出重复投递发生的位置与幂等键的作用。
独立完成事件消费设计并在本地实例中验证重复投递被正确去重。
为一个跨两个下游系统的消费流程设计部分失败后的补偿方案,并说明为什么补偿动作也必须幂等。
学习状态:未学习
Day 25
建议时长:75 分钟
本日 CO:CO1 CO2 CO8
CAP 讨论的是网络分区真实发生时,系统在一致性与可用性之间必须做出的取舍,而不是平时可以任选两项。把它与 PACELC 一起看才完整:没有分区时,延迟同样是要付的代价。真正影响设计的是一致性模型的层次——线性一致性、顺序一致性、因果一致性、最终一致性对客户端的可见性承诺各不相同,Jepsen 的一致性模型索引把它们的强弱关系整理成了可查的谱系。落到订单场景,需要回答的是:哪些数据必须强一致,哪些可以接受收敛窗口,收敛期间界面显示什么,以及如何对账。
6 分钟 · MP3 · 双主持人讲解
CAP 的完整表述是:在发生网络分区的情况下,分布式系统只能在一致性与可用性之间选择其一。它不是说平时可以在三者中任选两项,也不是说 CP 系统就一定比 AP 系统「更正确」。当分区没有发生时,一个系统完全可以同时提供强一致与高可用;真正被约束的是分区期间的行为:要么拒绝服务以保持一致,要么继续服务并接受可能返回旧值。
PACELC 补上了另一半:如果发生分区(P),在可用性(A)与一致性(C)之间选择;否则(E),在延迟(L)与一致性(C)之间选择。这解释了为什么很多系统在没有任何故障的日常运行中也会选择较弱的一致性——等待多数节点确认需要额外的往返时间。写设计文档时,把「分区时怎么办」和「无分区时愿意为一致性付多少延迟」分成两个问题回答,比争论系统属于 CP 还是 AP 更有用。
线性一致性要求每个操作看起来在其调用与返回之间的某一瞬间原子生效,且全局存在一个与实时顺序一致的总序,这是最强也最贵的承诺。顺序一致性放弃了与真实时间的对齐,因果一致性只保证有因果关系的操作被所有节点按相同顺序看到,最终一致性则只承诺在停止写入后系统最终收敛。Jepsen 的一致性模型索引把这些模型的包含关系整理成图,可用来核对自己的表述是否准确。
工程上很少有系统需要全局线性一致。订单场景可以逐项拆分:库存扣减通常需要强一致以避免超卖;支付状态需要以支付渠道的回调为准并保证幂等;订单列表的展示可以接受秒级收敛;运营统计接受分钟级甚至小时级延迟。为每一项写清楚要求之后,还要回答收敛期间界面显示什么——是显示「处理中」,还是显示可能过期的旧值,以及最终如何通过对账发现并修复不一致。
为一个订单场景画出一致性边界:逐项标注库存、支付、订单状态、物流和统计各自要求的一致性级别、可接受的收敛窗口与对账机制。
「我们的系统选择了 AP,所以不需要考虑一致性」——这句话错在哪里?
尚未检查本题。
参考答案:CAP 只约束网络分区期间的取舍,AP 意味着分区时继续提供服务并可能返回旧值,而不是放弃一致性目标。系统仍需定义收敛模型(如最终一致或因果一致)、收敛窗口、窗口内的用户可见行为以及分区恢复后的冲突解决与对账机制。
评价要点:指出 CAP 的前提是分区已发生;说明 AP 仍需要明确的收敛模型与窗口;提出冲突解决或对账机制
在没有任何网络故障的日常运行中,一个跨机房数据库为什么仍可能选择较弱的一致性?
尚未检查本题。
参考答案:按 PACELC 的表述,无分区时系统在延迟与一致性之间取舍:跨机房的强一致写入需要等待远端多数节点确认,往返时延会直接体现在响应时间上。为满足延迟目标,系统可能选择本地确认加异步复制,代价是存在可见的收敛窗口。
评价要点:引用 PACELC 中无分区时的 L 与 C 取舍;说明跨机房确认带来的往返延迟;指出代价是收敛窗口或可能读到旧值
尚未完成自测。
使用教师给出的订单数据清单,为每一项从候选一致性模型中选择并说明理由。
独立完成五类数据的一致性边界表,并为两项设计对账机制。
为跨机房部署补充一份分区演练方案:写明注入方式、期望现象、判定标准和恢复后的一致性校验步骤。
学习状态:未学习
Day 26
建议时长:75 分钟
本日 CO:CO1 CO2 CO8
跨服务的一致性没有免费方案,只有代价不同的方案。两阶段提交依赖协调者投票,语义清晰但在协调者故障时参与者可能长时间持锁阻塞,跨服务长事务代价很高。TCC 把「预留—确认—取消」写进业务接口,控制力强但侵入业务。Saga 用一串本地事务加补偿动作换取可用性,代价是中间态对外可见。本地消息表和事务消息把一致性问题转化为可重试的投递问题。无论选哪种,都必须回答:失败点在哪里、补偿边界到哪里、补偿本身是否幂等、什么情况下需要人工介入。
6 分钟 · MP3 · 双主持人讲解
6个视频带你全方位了解腾讯云TDSQL分布式数据库:零基础了解tdsql、核心技术架构原理解析、安装部署、分布式事务实现机制、高可用技术解决方案、实例创建与使用
云贝教育 · 已核验 2026-08-29
两阶段提交把提交拆成投票与提交两步:协调者先询问所有参与者能否提交,全部同意后再通知提交。它的问题在于,参与者在投票之后、收到最终决定之前必须保持资源锁定;如果协调者此时故障,参与者既不能提交也不能回滚,只能等待。三阶段提交通过增加一个预提交阶段缩短阻塞窗口,但在网络分区下会引入新的不一致可能。跨服务、跨组织、耗时较长的业务流程,通常不适合直接使用这类阻塞式协议。
补偿型方案换了一个思路:不追求全局原子,而是让每一步都是可以单独提交的本地事务,一旦后续步骤失败,就按相反顺序执行补偿动作把已完成的步骤撤销。Microsoft 的架构模式文档把这一模式称为 Saga,并把撤销动作单独描述为补偿事务模式。它的代价是中间态会被外部观察到——用户可能先看到「已下单」,随后看到「已取消」,界面文案和通知策略必须为此设计。
补偿不等于回滚。回滚是把数据恢复到事务开始前的状态,而补偿是执行一个业务上抵消原动作的新操作:已发出的短信无法撤回,只能再发一条更正通知;已扣的款项通过退款抵消,账目上会留下两条记录。因此设计补偿时必须逐个动作判断:这一步是否可补偿?补偿是否会产生新的外部影响?有没有一个时间点之后就只能人工处理?把这些写成表格,比笼统地说「失败会回滚」诚实得多。
补偿动作会被重试,所以它必须幂等:同一个补偿被执行两次,结果应与执行一次相同。常见实现是为每次业务操作分配全局唯一的事务号,补偿时以该事务号作为幂等键,先检查是否已补偿再执行。此外还要考虑「空补偿」——补偿请求先于正向请求到达时,系统必须记录这一事实并拒绝随后到达的正向请求,否则会出现悬挂,这是 TCC 类实现中最容易遗漏的边界。
为一个跨订单、库存、支付三个服务的下单流程,分别用 Saga 和本地消息表画出正常路径与补偿路径,并逐个失败点写出处置动作。
为什么说 Saga 的补偿不能简单理解为「回滚」?请举一个补偿会留下痕迹的例子。
尚未检查本题。
参考答案:Saga 的每一步都是已提交的本地事务,无法撤销,只能执行业务上抵消它的新操作。例如已成功扣款只能通过退款抵消,账目上会同时存在扣款与退款两条记录;已发送的通知无法收回,只能补发更正通知。因此补偿会留下可被外部观察到的痕迹。
评价要点:指出每步已提交、无法回滚;说明补偿是新的抵消操作;给出退款、通知等会留痕的具体例子
什么是空补偿与悬挂?为什么它们会导致资源无法释放?
尚未检查本题。
参考答案:空补偿指补偿请求先于正向请求到达(例如正向请求超时后被判定失败并触发补偿,但它随后才真正到达);若系统直接忽略这次补偿,随后到达的正向请求仍会预留资源,且不会再有补偿到来,这个预留就悬挂在那里无法释放。正确做法是记录已补偿的事务号,并让随后到达的正向请求检查该记录后直接拒绝。
评价要点:准确描述补偿早于正向请求的时序;说明悬挂导致资源长期占用;给出记录事务号并拒绝迟到正向请求的处理
尚未完成自测。
在教师给出的流程骨架上补齐每一步的补偿动作,并说明哪一步之后只能人工处理。
独立完成 Saga 与本地消息表两种方案的设计与对比,覆盖四个失败点。
为该流程补充一份可执行的演练脚本设计:如何注入支付结果未知、如何验证补偿幂等、如何判定演练通过。
学习状态:未学习
Day 27
建议时长:75 分钟
本日 CO:CO1 CO2 CO8
网关处理南北向流量:路由、认证、限流、熔断和协议转换集中在系统入口,一个组件即可对外收敛策略。服务网格用边车代理接管东西向流量,把重试、超时、流量切分和 mTLS 从业务代码下沉到基础设施,Istio 用 VirtualService 与 DestinationRule 这类配置对象描述这些规则。两者职责有重叠但不等价,叠加使用会增加一跳延迟与排障复杂度。灰度发布的关键是分流依据——按权重还是按请求头,二者的可复现性与可回滚性完全不同;故障隔离则依赖舱壁、超时预算和可观测指标。
7 分钟 · MP3 · 双主持人讲解
网关位于系统入口,承担 TLS 终止、认证鉴权、路由、限流、熔断和协议转换。把这些策略集中在入口的好处是对外契约唯一、变更点集中;代价是网关本身成为关键路径,其容量、配置发布方式和故障域都需要单独设计。nginx 的负载均衡文档给出了轮询、最少连接、哈希等基础策略,以及健康检查与后端权重的配置方式,这些是理解更复杂网关产品的基础。
服务网格关注服务之间的调用。边车代理与业务容器同 Pod 部署,接管进出流量,从而可以在不改业务代码的前提下实施重试、超时、熔断、流量镜像和细粒度分流。Istio 的流量管理概念文档把路由规则与目标策略分成 VirtualService 与 DestinationRule 两类对象。需要清醒的是:网格增加了一跳代理,带来额外延迟与资源开销,也让排障链路变长——引入之前应先确认现有问题确实需要它。
灰度发布的分流依据决定了它的可解释性。按权重分流实现简单,但同一个用户在多次请求中可能落到不同版本,不适合有状态或多步流程的场景;按请求头或用户标识分流可以保证同一用户始终落到同一版本,便于复现问题和收集反馈,代价是需要在入口稳定地注入这些标识。无论哪种方式,都必须预先写出回滚触发条件——哪个指标、超过什么阈值、观察多长时间、由谁决定。
mTLS 让通信双方互相出示并校验证书,解决的是「这个调用方是谁」和「链路是否被窃听篡改」,Istio 的安全概念文档把身份、证书签发与策略执行放在一起描述。但 mTLS 不解决授权粒度问题:证明了身份之后,谁能访问哪个接口仍需要单独的授权策略。故障隔离同样要成套设计:舱壁限制单个下游能占用的并发与连接,超时预算保证上游超时大于下游超时之和,重试次数必须与超时预算相容,否则重试会在上游超时后仍在消耗下游容量。
为一个已有服务设计灰度发布与故障隔离方案,写出分流规则、超时与重试预算、回滚触发条件和需要观察的指标。
按权重灰度与按请求头灰度分别适合什么场景?为什么多步业务流程通常不宜只用权重分流?
尚未检查本题。
参考答案:按权重适合无状态、单次请求即可完成的场景,实现简单;按请求头或用户标识适合需要同一用户稳定落到同一版本的场景,便于复现与收集反馈。多步流程若只用权重,同一用户的不同步骤可能落到不同版本,导致状态不一致且问题难以复现。
评价要点:说明权重分流的简单性与无状态适用性;说明按标识分流保证用户版本一致;指出多步流程跨版本会造成状态不一致或难复现
一个调用链上游超时 1 秒,下游超时 2 秒且重试 2 次。这个配置会产生什么问题?
尚未检查本题。
参考答案:上游在 1 秒后已经放弃并向用户返回失败,但下游仍在继续执行并重试,最长可能占用 6 秒的容量,这部分工作对用户已无价值,却持续消耗连接与线程,故障时会加速资源耗尽。正确做法是让上游超时大于下游超时与重试的总和,或让上游取消信号能向下游传递。
评价要点:指出上游已放弃而下游仍在执行;算出重试导致的无效占用时间;提出调整超时预算或传递取消信号
尚未完成自测。
在教师提供的路径图上标出 TLS 终止、认证、限流位置,并说出每一处的作用。
独立完成灰度方案与超时重试预算表,并通过相容性验算。
为该服务补充一份故障隔离设计:舱壁参数、降级开关、依赖不可用时的兜底响应,以及验证这些机制生效的方法。
学习状态:未学习
Day 28
建议时长:90 分钟
本日 CO:CO1 CO2 CO8
本周收尾不引入新组件,而是把数据库、缓存、消息队列、分布式事务与流量治理整理成一棵可复核的选型决策树。合理的提问顺序是:数据形态与一致性要求是什么,吞吐与延迟目标是多少,团队的运维与安全边界在哪里,最后才是选哪个产品。每个分支都要写出触发条件、被放弃方案的原因和回退路径;价格、容量这类易变数字应标记为需要在实际选区重新核验的假设,而不是写死在报告里。这份决策树也是第 4 周作业与阶段项目的骨架。
6 分钟 · MP3 · 双主持人讲解
常见的选型错误是从产品名开始比较。更稳妥的顺序是先确定约束:数据是结构化还是半结构化,读写比例如何,是否需要跨行跨表的事务,能接受多长的收敛窗口;然后是量级,峰值 QPS、数据总量、增长速度、延迟目标各是多少;再然后是团队能力与安全边界,谁来运维、是否有能力处理主从切换、数据能否出域。只有这些确定之后,产品比较才有意义,否则就是在比较无关的指标。
决策树的每个分支都应当可被复核。这意味着分支上要写清触发条件(满足什么条件时走这一支)、被放弃方案的具体原因(不是「不好」,而是「在本场景的哪个约束上不满足」)、以及回退路径(如果这条路走不通,退回到哪个节点、代价是什么)。这样写出来的报告,别人可以按同样的条件重走一遍并得到相同结论,这正是本课程反复强调的可复核性。
选型报告里最容易过期的是价格、实例规格、配额上限和性能基准。这类数字随地域、时间和合同条款变化,写死在报告里会让整份文档在几个月后失去可信度。更好的做法是记录计费单位与成本驱动因素(例如按存储量、按请求数、按出网流量计费),给出官方核验入口和本次访问日期,并用低中高三档用量情景做敏感性分析,而不是给一个精确到小数点的总价。
相对稳定的是机制性结论:二级索引需要回表、分区数决定消费并行度上限、补偿必须幂等、上游超时应大于下游超时与重试之和。这些结论来自系统机制而非某个版本的实现细节,可以放心写进决策树。把两类内容分开排版——机制结论作为判断依据,易变数字作为需要核验的输入——报告的生命周期会长得多。
把本周五天的结论整合成一份中间件选型决策树,并用一个电商或内容平台的具体场景走通至少两条完整分支。
为什么选型报告应当从约束开始,而不是从产品对比开始?
尚未检查本题。
参考答案:不同产品的优势只有在具体约束下才可比较:一致性要求、读写比例、数据量级、延迟目标和团队运维能力决定了哪些指标相关。先比较产品会导致用与场景无关的指标(如峰值基准)排名,结论无法复核,也无法解释为什么放弃其他方案。
评价要点:指出约束决定哪些指标相关;说明先比产品会用到无关指标;强调可复核性与放弃理由的可解释性
在选型报告中,应如何处理价格与性能基准这类易变数字?
尚未检查本题。
参考答案:不应写死具体数值,而应记录计费单位与成本驱动因素、官方核验入口和本次访问日期,并用低中高三档用量情景做敏感性分析;性能基准需附测试条件(负载、并发、数据量、版本),并标明是实测还是引用。所有未经本人核验的数字都标记为待验证假设。
评价要点:提出记录计费单位与成本驱动因素;要求附核验入口与访问日期;要求区分实测与引用并标注待验证
尚未完成自测。
在教师给出的决策树骨架上补齐叶子节点,并为其中一条分支写出触发条件。
独立完成三层决策树并走通两条完整分支,附易变数字清单。
为决策树补充一份「反例检查」:给出两个看似合适却应被否决的方案,并说明是哪个约束把它们排除的。
学习状态:未学习