概述持久化查询将GraphQL查询预注册为哈希, 客户端仅发送哈希与变量, 使用GET请求可命中CDN缓存。结合缓存键策略与失效机制, 降低延迟与带宽。关键实践与参数哈希算法: `SHA256` 生成查询ID请求方式: `GET /graphql?queryId=...&vars=...`缓存键: 按 `queryId+vars` 构造失效与更新: 版本与TTL策略示例/配置/实现import crypto from 'crypto' function idOf(query) { return crypto.createHash('sha256').update(query).digest('hex') } const q = `query($id: ID!){ product(id:$id){ id name } }` const id = idOf(q) import express from 'express' const app = express() const store = new Map() app.get('/graphql', (req, res) => { const id = req.query.queryId const vars = JSON.parse(req.query.vars || '{}') const query = store.get(id) if (!query) return res.status(404).end() res.set('Cache-Control', 'public, max-age=60') res.json({ data: { product: { id: vars.id, name: 'Demo' } } }) }) location /graphql { proxy_cache mycache; proxy_cache_key "$arg_queryId:$arg_vars"; proxy_cache_valid 200 60s; proxy_pass http://api; } 验证哈希与映射: 注册查询后哈希稳定且服务端可解析CDN命中: GET请求在相同变量下命中缓存失效策略: 更新查询或变量后缓存失效并回源带宽与延迟: 相比POST原文请求下降注意事项变量影响缓存键, 需合理设计查询更新需版本管理与灰度发布安全校验避免未注册查询绕过与权限与审计协同

发表评论 取消回复