概述
深嵌套查询一旦叠加列表乘数,成本会呈指数级增长,仅靠深度限制无法发现宽扇出。以静态成本模型在解析阶段拦截,可把昂贵的查询挡在解析器之外。
关键步骤
- 为标量字段赋成本,为列表字段赋乘数。
- 执行前计算总复杂度,超预算即拒绝。
- 返回包含限制与计算值的结构化错误。
- 处处分页,使列表乘数有界。
验证
- 超预算查询在进入解析器前被拒绝。
- 错误信息给出计算成本与限制。
- 合法查询正常运行。
- 列表查询成本有界。
注意事项
- 静态复杂度是近似值,可能高估或低估真实成本。
- 必须依据生产流量调参,否则会误伤合法查询或漏放滥用。
适用范围
本条目围绕「限制 GraphQL 查询复杂度」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
建议在正式环境落地前先在预发或隔离环境演练一遍,把关键观测指标与负责人一并记录,确保出现异常时能快速定位并恢复。
const cost = calculateComplexity(query, fieldWeights);
if (cost > BUDGET) {
throw new GraphQLError(`Query too complex: ${cost} > ${BUDGET}`);
}