Community研究与数据分析github.com

Zoha/agent-skills

用于在 NestJS(Code-First)GraphQL 应用中实现 SWR 缓存——一次性配置缓存模块,决定缓存什么以及挂载在何处(服务、字段、操作或 CDN),并确保无泄漏。

agent-skills 是什么?

这是一个针对 NestJS 的 GraphQL SWR 缓存技能,专注于解决 code-first 模式下的缓存问题。它提供了一套完整的缓存策略,支持 stale-while-revalidate (SWR)、单飞去重、标签失效、按用户/公共作用域、缓存可观测性等功能。该技能的核心是避免缓存泄漏和资源崩溃,通过一个统一的策略模型和事件流来管理缓存。支持在服务层、字段层、操作层或传输层挂载缓存,并提供了详细的规则分类,包括一次性设置、缓存策略、泄漏安全、失效、可观测性和驱动选择。无论是首次配置缓存模块,还是处理 TTL 过期时的资源争用,该技能都能提供清晰的指导。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Zoha/agent-skills/tree/HEAD/skills/nestjs-graphql-swr-caching

Installed? Explore more 研究与数据分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

GraphQL SWR 缓存(NestJS,code-first)

概述

根据意图而非机制进行缓存。一个策略形状,一个可观测事件流,一个每请求跟踪。默认在服务层挂载;仅在测量后扩展到字段/操作/传输层。

三个硬道理决定了每一个决策:

  1. Apollo Server 没有内置的 stale-while-revalidate。 其 responseCachePlugin 仅支持 TTL 且针对操作级别。真正的 SWR 来自你自己的层(async-cache-dedupe,或基于 Mercurius 驱动的 mercurius-cache)或来自 CDN。
  2. 作用域默认为 public。 公共条目被所有调用者完全共享,因此仅当结果对所有调用者完全相同时才正确。一旦值因调用者而异,则必须标记为 perUser——否则会导致泄漏。
  3. Nest 拦截器不包装服务方法,且 @nestjs/cache-manager 的 CacheInterceptor 在 GraphQL 中不起作用。 因此,你需要的服务层装饰器是一个包装去重引擎的方法包装器,而不是框架拦截器。

何时使用

  • NestJS GraphQL(code-first)中,解析器/服务重复访问数据库或上游 API。
  • 你需要消除 TTL 过期时的延迟峰值和资源争用(真正的 SWR)。
  • 你需要考虑多用户缓存安全性/泄漏。
  • 你需要了解命中/过期/未命中的决策。
  • 你需要通过一个标志完全关闭缓存——用于开发、CI 或事件(参见第 1 节 setup-disable-switch)。
  • 你正在首次将缓存能力接入应用(参见第 1 节)。

何时不使用:

  • 如果你的公共 GET/APQ 流量已经通过 CDN 进行响应缓存——那么从那里开始。
  • 写入/变更路径,或者没有重复使用且读放大较低的用户数据(缓存带来的风险大于收益)。

回调契约

key、@CacheTag 和 @InvalidateTags 接受函数。如果参数设置错误,缓存将静默未命中,标签也将静默无法清除。

回调签名args 是什么
key(args, ctx) => unknown[] | Promise<unknown[]>方法的参数列表,按调用顺序——args[0],绝不是 args.id
@CacheTag(result, args) => string[] | null相同的列表;result 是方法的返回值
@InvalidateTags(result, args) => string[]相同的列表;result 是写入的返回值
  • 基于位置,而非命名。 对于 getTitle(id: string),id 是 args[0]。
  • 结果在前出现在两个标签回调中。原始引擎自己的 references 是 (args, key, result)——顺序不同,第一个参数也不同(参见 driver-async-cache-dedupe)。
  • ctx(userId、tenantId、locale,以及 gen)由请求派生并由 buildCacheContext 组装;在请求外部为空,因此作业通过参数传递所需内容。
  • 类型化:默认值为 unknown[] / unknown——注解元组(@Cacheable<[string]>、@CacheTag<[string]>),否则回调体无法编译。
  • 字段级不同:此处 args 是解析器的命名参数对象,ctx 是 GraphQL 上下文(driver-mercurius-cache)。

完整契约、键包 { a, k, u } 以及序列化边界情况:policy-key-derivation。运行时实现:setup-decorator-runtime。

按优先级分类的规则

优先级类别影响前缀
1一次性设置关键setup-
2缓存策略关键policy-
3泄漏安全关键safety-
4失效高invalidation-
5可观测性中observability-
6驱动中driver-

快速参考

1. 一次性设置(关键)

  • setup-decorator-runtime - 将装饰器实现为带有稳定名称的方法包装器
  • setup-disable-switch - 提供一个配置开关以绕过服务级缓存
  • setup-engine-choice - 使用去重引擎,并以秒为单位计算 TTL
  • setup-fail-open - 故障开放,且绝不缓存错误
  • setup-file-placement - 根据谁导入它来放置能力
  • setup-identity-context - 从 AsyncLocalStorage 读取调用者,而非 Scope.REQUEST
  • setup-module-wiring - 使用 forRootAsync 一次性连接缓存模块
  • setup-storage-and-invalidation - 启用失效并设置 referencesTTL 和 GC

2. 缓存策略(关键)

  • policy-five-knobs - 了解五个旋钮
  • policy-key-derivation - 自动派生密钥,永不使用 JSON.stringify
  • policy-mount-at-service - 默认在服务层挂载
  • policy-one-writing-pattern - 装饰器是唯一的写入模式
  • policy-service-escape-hatch - 服务 API 是逃生舱,而非第二种模式

3. 泄漏安全(关键)

  • safety-default-public - 作用域默认为公共——将因调用者而异的读取标记为 perUser
  • safety-key-dimensions - 作用域仅覆盖用户——所有其他维度都放入密钥中
  • safety-no-leak-checklist - 对每个缓存读取运行无泄漏检查清单

4. 失效(高)

  • invalidation-after-success - 仅在成功写入后失效
  • invalidation-atomic-purge - 原子化清除并限制标签基数
  • invalidation-generation-prefix - 对巨大的或粗粒度的域使用生成前缀
  • invalidation-tags-purge-only - 标签仅用于清除,绝不用作查找

5. 可观测性(中)

  • observability-limits-of-events - 了解引擎无法报告的内容
  • observability-metrics-and-tests - 跟踪证明修复的指标,并根据结果进行测试
  • observability-per-request-trace - 提供一个每请求跟踪,在 GraphQL 上仅用于开发
  • observability-structured-events - 发出结构化的缓存事件,而非日志字符串

6. 驱动(中)

  • driver-apollo-response-cache - 选项 C——Apollo responseCachePlugin(操作级别,仅 TTL)
  • driver-apollo-vs-mercurius - 从你的驱动中选择字段级选项
  • driver-async-cache-dedupe - 选项 A——async-cache-dedupe(服务级别,传输无关)
  • driver-cdn-transport - 选项 E——传输/CDN SWR(仅公共读取)
  • driver-envelop-response-cache - 选项 D——Envelop useResponseCache(非 NestJS 原生)
  • driver-federation-router - 仅限联邦——Apollo Router 响应缓存
  • driver-mercurius-cache - 选项 B——mercurius-cache(字段级别,真正 SWR)
  • driver-version-pinning - 锁定版本——此领域漂移

如何使用

从一次性设置部分开始,然后阅读策略、安全和失效规则以做出当前决策。规则文件位于 rules/ 下:

rules/setup-module-wiring.md
rules/_sections.md

每个规则文件包含:

  • 规则是什么以及它防止的故障
  • 带有解释的错误示例
  • 带有解释的正确示例
  • 参考资料

完整编译文档

有关包含所有规则展开的完整指南,请参见 AGENTS.md。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能