柯里化不直接用于灰度发布的白名单检测,但可构建灵活复用的权限判断逻辑:将环境上下文与用户标识分阶段传入,固化灰度规则后返回仅接收用户信息的判定函数,支持多环境隔离、动态配置注入及多维度组合校验。

柯里化本身不直接用于灰度发布中的白名单检测,但它能帮你构建更灵活、可复用的权限判断逻辑——关键在于把“环境上下文”和“用户标识”分阶段传入,让同一函数适配不同灰度策略。
用柯里化封装灰度判定逻辑
把灰度规则(比如白名单 ID 列表、AB 分组比例、地域限制)作为第一阶段参数固化,返回一个只接收用户会话信息的函数:
- 例如:const isInWhitelist = curry((whitelist, sessionId) => whitelist.includes(sessionId))(['u1001', 'u1002', 'u1005']);
- 后续只需调用 isInWhitelist('u1002') 就能快速判断,无需每次重复传白名单数组
- 不同灰度环境(如预发、灰度集群)可各自持有独立的 isInWhitelist 实例,互不影响
结合请求上下文动态生成判定器
在网关或中间件中,根据当前请求的 host、header.x-deploy-env 或路由路径,选择对应的白名单配置,再柯里化出判定函数:
- 比如灰度集群读取 Redis 中的 gray:whitelist:prod-v2 列表,预发环境读 gray:whitelist:staging
- 柯里化后得到的函数可注入到业务 handler 中,保持主逻辑无感知
- 避免硬编码或全局变量,提升配置变更时的热更新能力
与 Token 解析链路自然衔接
用户会话通常来自 JWT 或 session ID,柯里化函数可设计为接受解析后的用户对象,而非原始 token:
- const checkByRole = curry((allowedRoles, user) => allowedRoles.includes(user.role));
- 这样既支持按 ID 白名单,也支持按角色、部门、标签等维度做灰度分流
- 多个判定器可组合使用,例如 and(isInWhitelist, checkByRole(['admin']))(user)
注意边界:柯里化是工具,不是解决方案
它解决的是函数复用和配置隔离问题,但白名单数据源、缓存策略、失效机制仍需单独设计:
- 白名单列表建议从配置中心或 DB 加载,并设置本地缓存 + 定时刷新
- 柯里化函数本身无状态,不要在里面做异步加载,否则违背纯函数初衷
- 高并发下优先用布隆过滤器或 Redis SISMEMBER 优化查白名单性能











