题干与适用场景
这是平台、后端和系统设计岗位的渐进发布题。目标是让应用在不重新部署的情况下控制功能暴露,同时把每次请求的评估延迟保持在本地内存级别。假设有多个环境、租户和服务,旗标更新远少于评估读取。
面试官考察点
- 是否把写多读少的控制面与高频数据面分开。
- 能否解释为什么评估不能在请求热路径上调用远程数据库。
- 是否处理稳定百分比分桶、版本传播、默认值和旧配置过期。
- 能否把紧急关闭、审计、权限和旗标生命周期纳入设计。
回答前需要澄清的问题
先确认评估是在服务端 SDK、边缘还是客户端完成;这决定机密属性能否进入上下文。再确认一致性窗口、紧急关闭的目标传播时间、是否需要多变量实验、每个环境是否隔离,以及旗标服务不可用时应安全关闭还是保持最近状态。最后询问数据规模;下面采用每秒 10 万次评估、每次请求本地计算、数千个活跃旗标的示例假设。
30 秒回答框架
我会把系统拆成控制面和数据面:控制面负责旗标 CRUD、权限、审批、版本和审计;数据面由 SDK 持有签名配置,在进程内按规则评估。更新通过 SSE 或版本轮询传播,断线时使用最近有效配置和明确默认值。百分比发布用 hash(targetingKey + flagKey) 稳定分桶,紧急关闭走高优先级更新通道。指标覆盖评估错误、配置年龄、传播延迟、分桶稳定性和旗标清理。
分步骤深入解答
- 划分边界。 控制面写入关系数据库,保存环境、旗标、变体、规则、版本、拥有者、过期时间和审计事件。数据面只分发已校验的配置,不让业务请求依赖控制面。
- 设计评估路径。 SDK 启动时拉取配置并放入内存;请求只读取本地快照。规则按优先级匹配属性,未命中或类型不符时返回调用方提供的默认值。OpenFeature 也要求异常评估回到默认值,避免旗标服务拖垮业务。
- 保证分桶稳定。 对同一
targetingKey和flagKey做稳定哈希,再映射到固定桶。增加 10% 到 30% 时保持旧用户的顺序,避免用户在刷新页面时来回切换;不同旗标必须把flagKey纳入哈希以相互独立。 - 传播更新。 控制面发布带单调版本的事件,流式服务向 SDK 推送。SDK 只接受签名正确且版本更高的快照;SSE 断开后退回带版本的轮询。过期配置继续服务前要有最大年龄,超过期限进入安全默认或告警状态。
- 处理紧急关闭。 全局 kill switch 是高优先级旗标,评估前先检查本地紧急状态。它可以走独立的快速通道,但仍需记录操作者、原因、版本和恢复条件,避免一次误操作造成全量关闭。
- 估算与隔离。 以每秒 10 万次评估为例,若每次本地评估约 1 次哈希加少量规则扫描,远程读被降为配置更新流量;最坏的规则数量仍需限制。按租户、环境和应用隔离配置,并限制规则大小,防止一个团队把 SDK 内存和传播带宽耗尽。
- 可观测与清理。 记录 provider 状态、配置版本、默认值命中、评估错误和传播年龄;不要在每次热路径评估写日志,可用采样或 hook。旗标必须有 owner、创建时间、过期时间和最后评估时间,发布完成后删除代码分支和配置。
高质量示范回答
我会先把控制面和数据面分开。控制面提供带权限和审批的 CRUD,写入旗标、规则、变体、版本、owner、过期时间和审计事件;数据面把经过签名和版本校验的快照推送给服务端 SDK。业务请求只在 SDK 内存中评估,不能每次访问远程旗标数据库。
control API -> config store -> versioned event -> stream/poll -> SDK snapshot
request -> SDK.evaluate(flagKey, context, default) -> value + evaluation details百分比规则使用 hash(targetingKey + flagKey) 的稳定桶,扩大比例时保持用户顺序。SDK 断线继续使用未过期快照,超过最大年龄则返回安全默认值并告警。kill switch 走高优先级更新,评估结果带版本和原因供遥测使用。最后用配置年龄、传播延迟、默认值命中率、错误率和实验护栏指标决定是否继续扩大暴露,并定期清理已完成旗标。
常见错误
- 每次评估查询数据库 → 延迟和故障会进入业务热路径 → SDK 本地快照评估。
- 用随机数做百分比分流 → 用户刷新后变体漂移 → 使用包含用户键和旗标键的稳定哈希。
- 配置断线时永远保持旧值 → 旧规则可能已违反安全边界 → 设置最大年龄、默认值和告警。
- 把 kill switch 与普通更新放同一队列 → 高峰时关闭延迟 → 设计高优先级通道并记录审计。
- 只设计发布,不设计删除 → 旗标分支和规则会积累 → owner、过期时间和清理检查一起交付。
追问及应对
SDK 配置落后时,如何避免不同实例展示不同结果?
给快照附版本和年龄,暴露 provider 状态;对必须一致的操作在版本不足时返回安全默认或阻断,普通体验则允许短暂最终一致。不要假装所有旗标都需要强一致。
规则包含个人隐私属性时,评估放在哪里?
不能把敏感属性下发到不受信任的客户端。把评估放在服务端或边缘,仅传递最小化上下文;客户端旗标只使用可公开、低风险的属性,并对配置签名和环境隔离。
如何验证 30% 发布确实稳定?
用固定用户键重复评估同一旗标,检查变体不漂移;改变比例时比较桶边界和实际分布。再按变体记录业务指标,区分旗标暴露与实验结论。
旗标服务完全不可用怎么办?
SDK 使用最后一个未过期快照;超过最大年龄按旗标定义的安全默认处理,并让 provider 状态进入错误或过期状态。关键支付或安全路径应选择关闭功能的默认值。