# 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 消息发送失败直接丢弃
# 18. 手写注册中心的最小实现,服务注册、心跳探测与消费者缓存如何? A 心跳只需注册一次 B 消费者每次都查注册中心,不缓存 C 提供者注册后用心跳保活,心跳超时剔除 ✓ 正确答案 D 注册中心不剔除下线服务 相关文章: 手写注册中心的服务注册、心跳剔除与消费者本地缓存容灾
# 19. 手写服务发现的故障剔除与消费者端缓存,心跳超时剔除、本地路由表缓存与容灾降级如何设计? A 心跳剔除后立即永久删除 B 注册中心不可用时消费者用本地缓存路由表兜底,保证可用 ✓ 正确答案 C 本地缓存无需刷新 D 消费者必须依赖注册中心在线 相关文章: 手写注册中心的服务注册、心跳剔除与消费者本地缓存容灾