ESA Pages 体验之旅(9):缓存、防刷与日志
API 上线后,重复查询会继续调用上游,异常访问可能放大费用,故障也需要日志才能回溯。ESA 提供了缓存和安全配置,可以先减少重复调用,再验证频控与日志能力。
这个项目为公开查询设置了十分钟缓存。WAF 精细规则创建失败,持久化业务日志和发布流程仍待接入,这几项能力目前处于不同阶段。
用 Cache API 复用结果
对重复输入返回相同公开结果、且短期允许复用的 API,函数可以使用 Cache API保存与读取响应。缓存可能在不同节点未命中,也允许淘汰,账号和长期业务记录仍保存在独立存储中。
普通查询使用 10 分钟 TTL,命中时返回缓存结果,未命中时访问上游并缓存成功响应。这个时间由应用选取,官方没有为该上游结果推荐固定有效期;时效要求更高的内容需要缩短或绕过缓存。
缓存键需要覆盖所有影响结果的参数,例如规范化输入、返回数量、内容选项和接口版本。不能只用一部分词作为键,把不同条件请求混到一起。涉及 IP、本地化或用户权限的结果,先选择绕过共享缓存;要缓存时也必须明确隔离维度和数据保留。
缓存键和访问权限
先做访问检查,再查共享结果。命中缓存不能绕过原本需要的授权。密码、Cookie 和 AccessKey 不进入可公开的键或日志。
浏览器发起 POST 时,函数可以为内部缓存构造固定命名空间的 GET Request;这只是缓存索引,不要求把公开 API 改为 GET。返回给浏览器的 Cache-Control 又是另一层策略,仍可以设为 no-store,避免个人设备或中间层长期保存。
失败响应不缓存。缓存读失败时可以继续访问上游,写失败时仍交付已经取得的成功结果;这些回退是否能执行,还受剩余调用预算和运行时间约束。示例曾在正式入口观察到 MISS 后 HIT,命中省掉上游调用,函数本身仍然被执行和计量。
Cache API 文档与 Pages 文档的子请求表述存在产品范围差异,设计上保守地预留「查缓存、调用上游、写缓存」三步。不要再无条件叠加同步日志或重试,入口观察应记录 HIT、MISS、BYPASS、错误和实际往返。
配置 WAF 频控规则
Pages 通过自定义域名绑定使用所在站点的安全能力。WAF 规则配置在站点入口,独立于应用的前端依赖和函数代码。
这次拟定过一个小范围规则:限定应用域名和 POST API 路径,同一 IP 在 10 秒超过 10 次,短暂拦截 10 秒。这是待验证的防刷初值,不是每日额度或严格的全局计费。
创建实际返回:
HTTP 403
Http.Host.NotSupport
回读规则列表仍为空。套餐即使列出规则数量,也不保证所有匹配字段可用;当前账号不能建立需要的 Host 规则。因此没有扩大到整站限频,也没有把这条规则记为已上线。接入前应确认套餐支持所需的 Host、路径、方法和响应动作,再创建、回读,并用不调用付费上游的受控请求检查。WAF 能力表
API 客户端还需要识别拦截结果。fetch 不会自动替用户完成网页滑块,HTML 403 或 429 应转换成可理解的提示,不能当作正常业务 JSON 解析。
IP 限频也可能影响共享出口用户,只适合入口层的异常削弱。业务授权、一次性状态和全站发信额度,还需共享存储与相应的原子操作。
日志和告警
只有缓存状态头和错误码,还不能回溯持续故障。当前应用还没有持久化业务日志。接入日志和发布管理时,需要记录的内容如下:
| 机制 | 需要保存或确认的内容 |
|---|---|
| 请求日志 | request ID、版本、阶段、状态、耗时、缓存状态 |
| 前端报错 | 浏览器环境、版本关联、source map 与采样 |
| 用量告警 | 函数、上游、存储和发信分别统计,阈值对应预算 |
| 灰度发布 | 版本流量、错误指标、停止条件与回退入口 |
| A/B 实验 | 稳定分组、曝光、指标与实验期限 |
| 备份恢复 | 权威数据的备份、恢复点和演练结果 |
免费函数模式不支持日志投递,付费模式支持;站点日志又有自己的套餐条件,应分别核对。函数计费与日志能力
每请求同步上报一次 HTTP 日志,会占用子请求预算。先比较平台投递、批量上报或异步入口,并说明失败会不会影响业务;异步执行也要遵守平台生命周期,不能把未等待的 Promise 当作可靠投递。
日志优先保存阶段、错误类别和耗时。验证码、Cookie、AccessKey、完整收件地址和请求正文不原样写入;更详细的采样需要限定范围和保留期。Cache API 本身也不是长期分析数据库。
灰度发布与数据回退
平台可以管理版本与流量分配,应用仍需建立发布与告警流程。比例灰度用于控制影响范围;A/B 需要稳定分组和业务指标,不能只换一个名称。
回退函数版本,不会回滚数据库。如果新代码开始写入新结构,旧代码必须能继续读取,或另有迁移安排。缓存键同样需要考虑版本,避免旧响应干扰判断。版本与环境
缓存命中、WAF 拦截、错误日志和版本回退都需要实际观察记录。尤其在存储结构变化后,要同时验证旧代码是否兼容新数据,才能决定版本回退是否可用。