大型后台管理系统如何把业务操作做可靠(14):功能投放、权限与灰度人群
商家甲购买了批量导出能力,客服乙在甲的账号下只有订单查看权。团队又想把新版导出先开放给几个租户。即使页面显示了新版按钮,仍需要独立判断甲能否使用这项能力、乙能否导出这些数据。
用四个问题确定由谁判断
| 判断 | 示例 | 负责方 |
|---|---|---|
| 套餐能力 | 商家是否购买导出 | 套餐或租户配置 |
| 授权 | 客服可否导出指定门店 | 服务端策略 |
| 发布范围 | 商家使用新入口还是旧入口 | 发布或功能配置 |
| 业务资格 | 当前订单状态是否支持操作 | 对应业务服务 |
定向投放还可能根据地域、时间或客户群开放一项体验。它影响可发现性和路径选择。涉及敏感读取或写入时,实际 API 始终用权威租户上下文检查授权与业务资格。配置不可用时分别决定默认行为,权限判断与关键写入应有明确的拒绝策略。发布开关可以回到仍安全可用的旧路径。Pete Hodgson 的功能开关分类与治理
固定分组规则,记录实际命中
灰度按租户分组时,用功能键和租户 ID 生成稳定的桶。例如取哈希对一万取模,值小于 500 的租户进入约 5% 的范围。排除名单、显式包含和比例规则应有确定的优先级。提高比例时沿用同一规则,避免已进入灰度的租户突然退出。若按用户分组,需考虑同一租户不同员工协作时能否接受不同行为。
if tenant in excluded:
variant = "old"
else if tenant in included or bucket(flagKey, tenant) < rolloutLimit:
variant = "new"
else:
variant = "old"
记录功能键、配置版本、命中分支和必要的诊断上下文。实验关注实际曝光与目标事件,发布关注异常和回退。灰度前后分别统计,避免把所有用户聚合后看不见小范围故障。
从页面曝光追到一次真实请求
假设新版导出功能只开放给甲商户。登录后读取的能力摘要可以帮助页面显示入口,但服务端收到导出请求时仍要判断套餐、订单范围和操作资格。若乙客服从甲切到另一个商户,页面要丢弃甲的功能配置和缓存。否则乙可能看到一个点进去才发现不可用的按钮。对灰度分支会改变接口契约的功能,可以让服务端一同决定变体,并在响应中带回实际使用的版本。
| 条件 | 页面路径 | 请求到达后 |
|---|---|---|
| 无导出套餐 | 显示合适的能力说明 | 拒绝创建导出任务 |
| 有套餐,无导出权限 | 不允许进入导出流程 | 拒绝操作 |
| 有权限,进入旧版 | 打开旧导出 | 按旧契约处理 |
| 有权限,进入新版 | 打开新版导出 | 按支持的契约及当前权限处理 |
在同一次业务流程里,入口和确认页需要知道是否沿用打开时的配置。对会改变提交语义的配置,提交时可携带已确认的方案版本。配置改变后服务端明确继续接受、要求刷新还是需要重走预览,避免半途静默切换。
关闭开关后处理已发生的工作
线上发现新版导出错用了日期字段,可以关闭新版入口、暂停尚未执行的任务,并通知相关人员。已经生成的文件是否还能下载,要按故障性质决定。若可能包含错误范围,应冻结交付并重查授权和查询条件。功能开关只改变接下来的路由,任务与产物还要走各自的处理流程。
评审开关时写清负责团队、默认路径、分组维度、互斥关系和退役条件。故障日志记录实际命中的配置版本。开关长期存在时应有验证样例,否则半年后可能只剩下一个无法确认用途的布尔值。
测交叉组合和退出路径
测试无套餐、有套餐但无权限、有权限且未进入灰度、有权限且进入灰度。然后撤权、关闭新功能和模拟配置读取失败,分别核对页面与直接 API 调用。功能退出后清理临时开关、旧路径和失效的测试组合,保留足够的发布记录以便解释历史异常。
比较分桶结果时保留分母
假设按租户进行 5% 灰度,有十家测试租户被强制纳入,同时三家处于排除名单。比例配置只作用于适用且未被名单覆盖的租户,实际进入新版的租户比例不会必然等于 5%。若其中一家是大客户,任务流量占比可能比租户数量占比高得多。看发布风险时应分别观察租户数、曝光次数和真实任务数。
实验还要区分已经分组和实际看到了功能。员工登录后没进入报表页,即使所属租户命中新版,也不应当成已经接触新版导出的用户。记录实际使用路径上的曝光和结果事件。放量时沿用同一分组键,替换实验方案则明确是否启用新的分组版本,以便解释前后样本的变化。
有一个容易漏掉的复测。让两位员工分别在桌面和手机进入同一租户,验证需要协作的功能是否走同一版本。再让其中一人切换租户并保留旧页,检查旧页刷新后采用当前账号与租户。直接用旧链接请求接口时,服务端仍要判断真实权限和被支持的契约。
总结
套餐定义组织能使用什么,授权定义谁能操作哪些资源,投放决定何时给谁呈现哪条路径。分开这些判断,故障时才能定位是谁拒绝了操作,或者是哪一版配置选错了路径。