# 1. 基于游标的分页模式,cursor-based pagination? A 游标分页与 OFFSET 分页通过相同方式定位,性能一致 B 游标分页在翻页期间数据变化会导致数据重复或跳行 C 游标分页无法利用索引,只能全表扫描 D 游标分页基于排序键位置定位,翻页性能稳定且不随页数增加而退化 ✓ 正确答案
# 2. Seek(键集)分页与索引的配合,为什么基于 WHERE 游标的分页能利用索引避免深翻页,其排序键的唯一性要求是什么? A Seek 分页的排序键可以不唯一,只要加 LIMIT 即可 B Seek 分页依赖排序键唯一,否则会在相等键值处出现重复或跳过 ✓ 正确答案 C Seek 分页会随页数增加而线性退化,与 OFFSET 相同 D Seek 分页无法利用索引定位,只能全表扫描
# 3. 去重(Dedup)的实现,唯一索引、Redis SET、消息队列? A Redis SET 是权威的持久化去重手段,故障不会丢失数据 B 数据库唯一索引是最强去重约束,通常作为可靠兜底,Redis 作为性能前置 ✓ 正确答案 C 消息队列天然保证 Exactly-Once,无需去重 D 唯一索引只能用于去重,不能作为业务约束
# 4. 幂等表(Idempotency Table)的设计,请求指纹 + 响应缓存? A 幂等表只记录请求,不缓存响应,因此重复请求会重新执行业务 B 幂等表不需要唯一索引,靠应用层判断即可 C 幂等表用唯一索引保证同一幂等键只处理一次,重复请求返回缓存结果 ✓ 正确答案 D 幂等键可以由请求体任意拼接,无需保证唯一性
# 5. 状态机(State Machine)的数据库建模,status 字段 + transition 函数? A 状态历史表没有必要,直接覆盖 status 即可 B status 字段可以任意变化,无需约束合法性 C status 字段存状态,transition 函数定义合法转移,历史表记录转移流水 ✓ 正确答案 D transition 规则只能放在数据库触发器里,应用层无法实现
# 6. 状态转移的合法性校验,CHECK 约束、触发器、应用层? A CHECK 约束能校验跨行状态转移合法性 B 触发器能读取新旧状态在数据库层拦截非法转移,但增加写入开销 ✓ 正确答案 C 应用层校验最可靠,数据库层无法绕过 D 触发器校验比应用层更灵活但可被绕过
# 7. 状态转移的并发控制,乐观锁(版本号)、悲观锁(SELECT FOR UPDATE)? A 悲观锁更新失败会影响行数,需要重试 B 悲观锁不产生任何锁等待,适合读多写少场景 C 乐观锁适合写冲突频繁的场景 D 乐观锁通过版本号条件更新,冲突时影响行数为 0 需重试 ✓ 正确答案
# 8. Etcd 分布式锁,Lease + Revision? A etcd 锁不依赖租约,key 永不过期 B Lease 提供 TTL 自动释放避免死锁,Revision 用于原子互斥保证单一持有者 ✓ 正确答案 C Lease 只用于续期,与自动释放无关 D etcd 锁没有一致性保证,可能与 Redis 锁等价
# 9. ZooKeeper 分布式锁的实现,临时顺序节点如何保证互斥与公平排队,Watch 机制如何感知锁释放,与 etcd Lease+Revision、Redis 锁在一致性与可用性上的差异? A Redis 锁与 ZK 锁一致性相同 B ZK 锁基于临时节点,但会话断开不会自动释放锁 C ZK 用临时顺序节点保证互斥与公平排队,Watch 感知释放,与 etcd 同为强一致(CP) ✓ 正确答案 D ZK 锁不保证公平性,后到先得
# 10. 分布式锁(Distributed Lock)的应用,定时任务、库存扣减、限流? A 定时任务用分布式锁保证多实例下仅一个实例执行,避免重复作业 ✓ 正确答案 B 分布式锁只能用于 Redis,无法用数据库实现 C 库存扣减不需要锁,靠数据库自动避免超卖 D 分布式锁用于提升单机性能,与互斥无关
# 11. 一致性消息(Transactional Message)的实现,RocketMQ、Kafka 事务消息? A 一致性消息仅用于 RocketMQ,Kafka 不支持 B Kafka 事务消息能直接与业务数据库事务原子提交 C 半消息对消费者完全可见,可提前消费 D RocketMQ 用半消息 + 回查机制保证本地事务与消息发送的一致性 ✓ 正确答案
# 12. 事务性发件箱(Transactional Outbox)模式,业务事件写入 outbox 表? A Outbox 模式只用于 Redis 消息,不适用于任何 MQ B 业务事件与业务操作在同一数据库事务内写入 outbox 表,由独立投递器异步发送 ✓ 正确答案 C Outbox 表不需要关联业务事务,可任意写入 D 投递器发送失败后事件直接被丢弃,无需重试
# 13. 本地消息表(Local Message Table)模式,业务库 + 消息表同事务写入? A 本地消息表发送后消息立即删除,不保存任何状态 B 业务更新与消息写入同事务提交,服务器崩溃后待发消息仍可恢复重新发送 ✓ 正确答案 C 本地消息表与业务库无关,可独立写入 D 该模式保证消息恰好发送一次,不可能重复
# 14. Exactly-Once 投递的语义,消息系统与业务系统的协同? A 消息系统单独即可保证 Exactly-Once,无需业务配合 B Exactly-Once 需消息系统可靠投递与业务系统幂等消费协同实现 ✓ 正确答案 C Exactly-Once 等价于 At-Least-Once D 幂等消费只能用于 Redis,无法用于消息处理
# 15. 幂等性(Idempotency)的定义,相同请求执行多次与一次效果相同? A 幂等性指操作执行次数越多效果越强 B 幂等性指同一操作执行多次与执行一次的效果相同,是安全重试的基础 ✓ 正确答案 C 所有接口天然幂等,无需设计 D 幂等性只与数据库无关,仅影响网络层
# 16. 幂等键(Idempotency Key)的应用,支付、退款、消息处理? A 支付/退款/消息处理用幂等键配合唯一索引防止重复扣款与重复消费 ✓ 正确答案 B 幂等键只在支付场景使用,退款与消息无需 C 幂等键不需要唯一约束,靠内存判断即可 D 幂等键会在并发下失效,无法防止重复扣款
# 17. 消息队列的重复消费,Exactly-Once vs At-Least-Once? A MQ 本身默认保证 Exactly-Once,无需业务处理 B At-Most-Once 能保证消息不丢,是最佳选择 C 默认 At-Least-Once 语义下可能重复消费,需应用层幂等消化重复 ✓ 正确答案 D 重复消费只会发生在内存队列,与 MQ 无关
# 18. 重复事件(Duplicate Event)的检测,幂等键、版本号? A 重复事件检测与消息系统无关,只能靠人工 B 只需幂等键,版本号无意义 C 版本号只能用于数据库,无法用于事件 D 幂等键去重相同事件,版本号防止旧版本覆盖新状态 ✓ 正确答案
# 19. 重试(Retry)的策略,指数退避、抖动、最大重试次数? A 指数退避增长间隔,加入抖动避免惊群,并设置最大重试次数防止无限重试 ✓ 正确答案 B 重试次数越多越好,无需上限 C 抖动会让重试更快,应移除 D 重试不需要幂等,直接重发即可
# 20. 复杂状态机,Hierarchical State Machine(HSM)、Workflow Engine? A 工作流引擎只能处理单一步骤,无法编排 B HSM 与工作流引擎功能完全相同,只是名字不同 C HSM 用层级父状态复用转移,工作流引擎支持编排、并行与人工干预 ✓ 正确答案 D HSM 比简单状态机更简单,无需层级
# 21. Spring Batch 的分块与重启实现? A Spring Batch 必须整批一次提交,失败整批回滚 B Chunk 式处理每块提交一次事务,重启时基于 JobRepository 断点续跑 ✓ 正确答案 C 重启后从头重新执行,无法续跑 D Spring Batch 不持久化执行状态
# 22. 批处理的重启(Restart)策略,断点续传、幂等执行? A 断点续传足够,无需幂等 B 批处理重启后必须从头开始,无法续传 C 幂等执行与重启无关,重启一定重复处理 D 断点续传解决从哪继续处理,幂等执行保证重复处理不产生副作用 ✓ 正确答案
# 23. 批处理(Batch Job)的分块(Chunking)原则,每块多少行? A 块越大越好,一次提交全部数据最高效 B 分块在吞吐、内存与失败回滚代价之间权衡,通常每块 100~1000 行 ✓ 正确答案 C 块越小遍越快,无任何代价 D 分块与事务无关,仅影响内存
# 24. 批处理的进度跟踪,checkpoint、状态表? A 批处理无需跟踪进度,一次执行完即可 B checkpoint 只存内存,不持久化 C 状态表只用于展示,崩溃后无法恢复 D checkpoint 记录处理位置用于断点恢复,状态表记录批次元数据用于监控 ✓ 正确答案
# 25. 回调(Callback)的实现,长轮询、Webhook、消息推送? A 长轮询由客户端请求驱动,Webhook 由服务端主动推送,消息推送通过总线解耦 ✓ 正确答案 B 长轮询与应用推送相同,服务端主动发送 C Webhook 无需接收方地址,服务端自动找到 D 消息推送无法异步,只能同步等待
# 26. 异步任务(Async Task)的数据库实现,任务表 + 状态机? A 任务表只存内存,重启后任务丢失 B 任务表持久化任务,状态机驱动流转,配合锁避免并发重复执行 ✓ 正确答案 C 异步任务无需状态机,直接执行即可 D 任务表无法支持重试
# 27. 最大努力通知(Best-Effort Notification),业务 + 异步通知? A 业务成功后异步尽力通知下游,允许延迟与丢失,靠重试与补偿追求最终一致 ✓ 正确答案 B 最大努力通知保证与业务事务强一致 C 最大努力通知只用于强一致场景 D 该模式不进行任何重试,通知一次即止
# 28. 可靠消息投递的语义,At-Least-Once、At-Most-Once、Exactly-Once? A Exactly-Once 无需业务配合即可实现 B At-Most-Once 保证不丢,是最佳选择 C At-Least-Once 保证不丢但可能重复,配合消费端幂等是工程常用选择 ✓ 正确答案 D 三种语义保证效果完全相同
# 29. 分布式场景中抖动(Jitter)的应用,重试退避中引入随机抖动如何避免惊群与同步风暴,指数退避与全抖动/等抖动策略如何设计? A 抖动会让重试更集中,加剧故障 B 抖动将重试时间随机化,避免所有客户端同时重试造成惊群与同步风暴 ✓ 正确答案 C 全抖动与等抖动都固定重试时间,不做随机化 D 抖动只影响网络层,与重试无关