CVTE 应用软件一面:告警洪峰、消息幂等与缓存故障
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 能否介绍自己,以及项目的核心处理链路?
- 告警量突然增长二十倍,怎样避免接入服务被拖垮?
- 怎样让同一个故障的事件有序处理,同时允许不同故障并行?
- Kafka 提供消息可靠性后,业务层为什么仍需幂等?
- 数据库事务提交成功、Kafka 消息发送失败,怎样保证事件最终送达?
- 告警聚合怎样避免把两个独立故障合并?
- Redis Cluster 主从切换时,为什么可能丢失已确认写入的数据?
- 单个 Redis key 出现极高访问量时,怎样处理?
- 分布式锁自动续期后,怎样防止过期持有者继续写数据?
- MySQL 查询命中了索引,为什么仍可能很慢?
- 可重复读事务中,普通查询和加锁查询为什么可能看到不同结果?
《参考解析》
有序不等于全局串行
先定义故障身份,让同一业务键进入同一分区,并在消费端保留该键的处理顺序。若收到消息后又直接扔进共享线程池,执行顺序仍可能变化。不同键可以并行,但同一键的状态更新要检查事件版本,重试也要使用同一个幂等标识。
Outbox 把业务与待发事件放进同一事务
业务更新时同时保存一条待发送事件,后台再把它投递到消息系统。这样,提交成功后可以从数据库中找到尚未发出的事件。发布器可能发成功后还没来得及标记状态就退出,因此消费者仍需要处理重复事件。它解决的是跨系统操作中可追踪、可补发的问题,不会让所有外部副作用自动只发生一次。
续期不能证明旧进程已经停下
旧持有者在长暂停后恢复,可能继续执行它以为仍然有效的任务。需要让最终资源检查所有权或递增的隔离令牌,拒绝已经失效的一代写入。同一代的多次合法操作如何识别也必须定义清楚,不能简单照搬一个比较符号。只有锁服务续期、资源端完全不校验,无法消除这种迟到写入。
先区分查询语义,再查慢在哪里
普通一致性读与锁定读有不同规则;等待锁、扫描过多记录、回表、排序和传输大字段都可能使查询变慢。可重复读下,一致性读通常复用首次一致性读建立的快照,不能笼统地说所有查询都固定在事务开始瞬间。相关规则见 MySQL 一致性非锁定读说明。