手写 RPC、缓存与分布式组件

共 19 题
#

1. 手写一个最小 RPC 框架,注册中心、序列化、网络传输、负载均衡如何分层?

A 序列化负责网络传输
B 注册中心负责服务发现,负载均衡负责选择实例 ✓ 正确答案
C 注册中心负责序列化
D 负载均衡负责服务注册
#

2. 手写 RPC 时如何用 JDK 动态代理生成调用桩(stub)并处理返回值与异常

A stub 在 invoke 中完成请求封装、网络调用与返回/异常处理 ✓ 正确答案
B 服务端异常不需要传回客户端
C 动态代理只能用于本地调用
D 返回值必须手动反序列化
#

3. 手写分布式锁(Redis SETNX + Lua 续期)并分析主从切换下的失效窗口?

A Lua 脚本用于非原子释放
B SETNX 加锁后无需设置过期时间
C 主从异步复制导致主节点宕机后锁可能丢失,产生失效窗口 ✓ 正确答案
D 主从切换不会影响锁
#

4. 手写分布式锁如何解决"锁过期但业务未完成"问题(看门狗续期)?

A 看门狗周期性续期,让锁跟随业务执行时间 ✓ 正确答案
B 续期无需判断锁归属
C 看门狗在业务完成前就停止
D 续期让锁永远不会过期
#

5. 手写分布式锁,Redis SETNX+Lua 与 ZooKeeper 临时顺序节点的差异如何?

A Redis 锁强一致,无主从失效窗口
B ZK 用临时顺序节点和强一致保证,锁不丢失且自动释放 ✓ 正确答案
C ZK 锁性能高于 Redis
D ZK 临时节点在客户端结束后仍保留
#

6. 手写一个简单的一致性哈希(虚拟节点)并说明数据迁移量为何最小?

A 虚拟节点用于减少迁移量
B 取模哈希增删节点迁移量最小
C 增删节点只影响环上局部区间的数据,迁移量最小 ✓ 正确答案
D 一致性哈希无节点时也可用
#

7. 手写滑动窗口计数与令牌桶限流,说明在网关中的落地差异?

A 令牌桶比滑动窗口更精确
B 滑动窗口精确限流防突发,令牌桶平滑控速允许突发 ✓ 正确答案
C 滑动窗口内存是 O(1)
D 网关限流无需考虑分布式
#

8. 手写 RPC 的负载均衡(随机/轮询/一致性哈希)如何与失败重试联动?

A 失败重试时排除已失败实例,并需保证操作幂等 ✓ 正确答案
B 一致性哈希让相同 key 落在不同实例
C 重试次数越多越好
D 负载均衡与熔断无关
#

9. 手写本地缓存,TTL+LRU 组合、过期清理线程与并发控制如何实现?

A 清理线程与业务无需同步
B TTL 负责容量淘汰
C LRU 负责时间过期
D 定时清理线程负责删除已过期但未再访问的数据 ✓ 正确答案
#

10. 手写 RPC 时如何实现调用超时(Future.get 超时/回调超时)与熔断联动

A 超时计入失败率,失败率升高触发熔断快速失败 ✓ 正确答案
B 熔断后仍会继续调用
C 超时与熔断无关
D 回调超时不需要定时器
#

11. 手写两级缓存(Caffeine + Redis)的失效广播与一致性更新

A 只更新 DB 就能保证两级缓存一致
B 写后删 Redis 并广播通知其他节点删本地缓存,保证最终一致 ✓ 正确答案
C 本地缓存变化无需通知
D 缓存在读时永不回填
#

12. 手写分布式 ID,雪花算法与号段模式的并发/趋势特性如何?

A 号段模式无需数据库
B 雪花算法本地生成、趋势递增、并发高,但依赖时钟 ✓ 正确答案
C 雪花算法 ID 不递增
D 号段模式并发比雪花更高
#

13. 手写 MQ 消息确认的简化版(发送确认 + 消费 ACK + 死信)

A 消费成功后无需 ACK
B 发送确认用于消费端
C 死信队列用于正常消息
D 消费 ACK 确认已消费,失败重试超限进死信队列 ✓ 正确答案
#

14. 手写 RPC 的连接管理,长连接池、连接复用与断线重连如何实现,连接数与线程模型如何匹配?

A 连接池增加建连开销
B 阻塞 IO 下连接数可超过线程数
C NIO 多路复用下一个线程可管理大量连接,连接数可远超线程数 ✓ 正确答案
D 断线后无需重连
#

15. 手写序列化与协议设计,JDK/JSON/Protobuf 序列化的性能与兼容性差异,RPC 协议中的消息头(magic、版本、长度)如何设计?

A 长度字段用于做协议校验
B JSON 性能比 Protobuf 高
C Protobuf 性能高、体积小,支持跨语言 ✓ 正确答案
D magic 用于按长度分帧
#

16. 手写熔断器(Circuit Breaker),closed/open/half-open 三态切换、失败率滑动窗口与恢复探测如何实现?

A half-open 只放行失败请求
B open 状态仍会调用下游
C 熔断打开后经过超时进入 half-open,放行少量请求探测恢复 ✓ 正确答案
D 失败率达到阈值就立即 open,无需考虑最小请求数
#

17. 手写一个 Outbox 模式的简化实现(本地事务+定时投递+去重)?

A 定时投递无需去重
B outbox 消息与业务事务分离
C 消息写入与业务同事务,保证不丢消息 ✓ 正确答案
D 消息发送失败直接丢弃
#

19. 手写服务发现的故障剔除与消费者端缓存,心跳超时剔除、本地路由表缓存与容灾降级如何设计?

A 心跳剔除后立即永久删除
B 注册中心不可用时消费者用本地缓存路由表兜底,保证可用 ✓ 正确答案
C 本地缓存无需刷新
D 消费者必须依赖注册中心在线