题目重点:给多服务提供配置,明确发布原子性、环境隔离、动态更新与客户端缓存。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练配置按service/environment/namespace/version组织,支持读取、受控发布和回滚;feature flag按用户分流可作为独立层。配置敏感secret需独立权限和加密存储。
- 业务要求决定强一致还是有界延迟;本设计发布版本原子、客户端异步更新并保留last-known-good,不能宣称所有客户端同一瞬间切换。
解题路线
- 管理面校验schema、类型、依赖和访问权限,创建不可变版本后CAS更新current指针。多key必须以完整bundle版本发布,避免读到新timeout和旧endpoint不兼容组合。
- 客户端SDK启动bootstrap取当前version和bundle,校验后原子换引用;watch事件只告知version变化,断线用定期poll校验补缺。事件丢失不能永久停旧版本。
- last-known-good保存在本地,远端失败按策略续用并报警;配置若安全敏感需要过期停止服务,不能统一无限fail-open。无首次配置时明确default/fail启动策略。
- 发布按canary环境/服务实例比例逐步推进,监测错误与关键指标,rollback切到已验证旧版本。cache key包含namespace/environment/version,权限隔离防测试配置泄漏到生产。
- LRU只决定缓存淘汰,不保证freshness。需要version校验/TTL/watch与容量策略共同工作;题中转入手写LRU时,hash map+双链表保证get/put均摊O(1),淘汰不会等同发布回滚。
- 审计记录谁发布、变更、审批和影响版本,secret不写日志。读取热点可用分层cache/CDN,写管理面量小但错误影响大,应保证可追踪与回滚。
手动走一遍
v7=(endpoint A,timeout2s),v8=(endpoint B,timeout5s)。客户端不能逐字段更新成B/2s;完整校验v8后一次替换。watch断线仍用v7并标stale,重连读current=v9不要求必须收到每个中间事件。
规模与取舍
配置读请求约实例数×刷新频率,watch连接数按实例数;bundle大小与namespace数决定客户端缓存。发布O(bundleBytes)校验,LRU操作O(1)不包含网络获取、解析和schema检查。
易错点与追问
容易失分的边界
- 说用了LRU就解决配置一致性,遗漏版本新鲜度。
- 只缓存一个最新值可变对象,会让并发读看到半更新字段。
继续深挖
- 紧急kill switch要比普通配置更短更新延迟,怎样设计独立通道和过期策略?
- 回滚配置引用已删除schema/服务端依赖时,如何保证旧版仍兼容?
