字节后端开发秋招二面(2026 年 8 月)
面经与参考答法
字节后端开发秋招二面(2026 年 8 月)
这是一份 A 级第一手二面记录,问题集中在 Redis 集群、分布式锁和 Agent 项目高可用。原帖没有公开算法题题面,本文不会补写不存在的题目。
(1)怎样介绍大规模业务中的 Redis 架构?
先区分两个问题:高可用与水平扩展。
- Sentinel 体系主要解决主从故障发现和主节点切换,不负责把数据分片到多个主节点;
- Redis Cluster 用 16384 个 hash slot 把 key 分布到多个主分片,每个主分片可配从节点,客户端根据 slot 路由;
- 业务层还要说明 key 分布、热点 key、大 key、跨 slot 多 key 操作、扩缩容迁移和故障切换期间的一致性边界。
面试官问“多大量级”时,不要用“并发很高”代替事实。应给出自己可验证的指标:峰值 QPS、数据量、命中率、P99 延迟、实例数和热点占比;不知道运维全局数据就明确边界,只讲自己观测和负责的部分。
(2)Redis 用过哪些能力,怎样从项目场景回答?
按“业务问题 → 数据结构/命令 → 生命周期 → 一致性与降级”回答比罗列命令更有效。例如:
- String 保存缓存、计数器和幂等标记;
- Hash 保存结构化对象的局部字段;
- ZSet 支持排行榜、延迟队列的时间排序;
- Stream 适合可确认、可追踪的消息消费;
- Bitmap/HyperLogLog 分别处理布尔状态集合和近似基数统计。
每个例子都要补 TTL、淘汰、穿透/击穿/雪崩、缓存与数据库一致性,以及 Redis 不可用时业务如何降级。
(3)Redis 分布式锁有哪些实现层次?
只用 SETNX 不够,因为“加锁成功后、设置过期时间前崩溃”会留下永久锁。单实例的基本正确形式是一次原子命令:
SET lock:order:<id> <unique-token> NX PX <ttl-ms>
释放时必须比较唯一 token,只能删除自己持有的锁;比较与删除要用 Lua 脚本原子执行。Java 项目通常使用成熟客户端(如 Redisson)的可重入锁与续期机制,但仍应理解其租约、故障和拓扑边界。
延伸阅读:Redis 分布式锁:租约、续期与故障边界。
(4)锁的过期时间和 Watchdog 要注意什么?
固定 TTL 太短会导致任务尚未完成、锁已过期,第二个执行者进入临界区;太长则持有者崩溃后恢复缓慢。TTL 应覆盖正常执行时间与合理抖动,并对超时、续期失败和任务卡死设置上限。
Watchdog 会在持有者仍存活时周期续约,降低“业务正常但 TTL 到期”的风险,但它不能消除所有问题:进程长时间暂停、网络隔离或 Redis 故障都可能让租约失效。对写入数据库等重要资源,应再使用幂等键、唯一约束或 fencing token,避免过期持有者恢复后写入旧结果。
(5)如何讲 Agent 项目里最难的设计和高可用?
把 Agent 编排与业务副作用分开回答:
- Agent 图负责计划、工具调用、重试、审批和终止条件,状态通过 checkpoint 恢复;
- 业务写入以 MySQL 为真相源,在同一事务写业务数据与 Outbox 事件;
- 独立发布器把 Outbox 投递到 Kafka,消费者按事件 ID 幂等;
- 分布式锁只保护确需互斥的短临界区,不能替代数据库唯一约束和事务;
- 用 trace 关联 run、step、tool call、outbox event,监控死循环、积压、重试和超时。
面试官真正想听的是失败窗口:模型调用成功但状态没保存怎么办,事务提交后 Kafka 没发出去怎么办,锁续期失败怎么办。能够逐一说明恢复依据,比堆叠组件名称更有说服力。
(6)算法题没有公开题面时怎么整理?
原帖只记录“算法题”,没有题目、输入输出或约束。真实题库应保留这个事实,但不能凭空补一道常见题。复习时仍应覆盖数组/字符串、哈希、双指针、二叉树、图搜索和常见动态规划,并在模拟面试中练习先澄清约束再编码。
(7)反问和结果沟通怎样处理?
可以问团队当前最重要的工程问题、岗位前三个月的交付预期、面试官认为自己还欠缺的能力。结果时间由招聘流程决定,不应在公开面经保留私人联系方式或可定位个人的沟通细节。