Community研究&データ分析github.com

Zoha/agent-skills

NestJS(コードファースト)アプリでのGraphQL読み取りキャッシュ、stale-while-revalidate(SWR)キャッシュモジュールの導入、キャッシュ対象と配置場所の決定(サービス、フィールド、操作、CDN)、リーク防止を支援します。SWR、単一フライト重複排除、タグ無効化、ユーザー別/公開スコープ、キャッシュ可観測性、TTL期限切れ時のスタンピード/ブロッキングミス、共有キーデータリーク、キャッシュを完全に無効にするdev/opsスイッチ、またはワンタイムセットアップの参照(モジュール、ファイル配置、ストレージ、referencesTTL/GC、呼び出し元識別、デコレータランタイム、フェイルオープン)が必要な場合にトリガーされます。

agent-skills とは?

このスキルは、NestJS(コードファースト)GraphQLアプリケーションにおいて、stale-while-revalidate(SWR)パターンに基づくキャッシュ機能を実装するための包括的なガイドです。Apollo ServerにはSWR機能が組み込まれていないため、独自のキャッシュレイヤー(async-cache-dedupeやmercurius-cache)またはCDNを使用する必要があります。スキルは、サービスレベルでのキャッシュ配置をデフォルトとし、必要に応じてフィールド、操作、トランスポートレベルへのエスカレーションを推奨します。重要な考慮事項として、キャッシュスコープはデフォルトで`public`であり、ユーザーごとに結果が異なる場合は`perUser`とマークしないとデータリークが発生する危険性があります。また、NestJSのインターセプターや`@nestjs/cache-manager`の`CacheInterceptor`はGraphQLでは機能しないため、サービスレベルのデコレータはフレームワークのインターセプターではなく、重複排除エンジン上に構築されたメソッドラッパーである必要があります。このガイドは、セットアップ、キャッシュポリシー、リーク安全性、無効化、可観測性、ドライバの6つのカテゴリに分かれたルールを提供し、各ルールには具体的な実装例と注意点が含まれています。

対応~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に質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

GraphQL SWR キャッシング (NestJS、コードファースト)

概要

意図によってキャッシュし、メカニズムによってキャッシュしないでください。単一のポリシー形状、単一の監視可能なイベントストリーム、単一のリクエストごとのトレース。デフォルトでサービスレベルにマウントし、測定された場合にのみフィールド/操作/トランスポートにエスカレーションします。

すべての決定を形作る3つの厳然たる事実:

  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(コードファースト)で、リゾルバー/サービスがデータベースまたは上流APIに繰り返しヒットする場合。
  • TTL 期限切れ時のレイテンシスパイクとスタンピードを除去する必要がある場合(真のSWR)。
  • マルチユーザーキャッシュの安全性/リークについて推論する必要がある場合。
  • ヒット/スティッシュ/ミスの決定に対する可視性が必要な場合。
  • キャッシュを完全にオフにする必要がある場合(開発、CI、またはインシデント)。1つのフラグで(セクション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] です。
  • 両方のタグコールバックで result が最初に来ます。 生エンジン自身の 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ワンタイムセットアップCRITICALsetup-
2キャッシュポリシーCRITICALpolicy-
3リーク安全性CRITICALsafety-
4無効化HIGHinvalidation-
5可観測性MEDIUMobservability-
6ドライバーMEDIUMdriver-

クイックリファレンス

1. ワンタイムセットアップ (CRITICAL)

  • setup-decorator-runtime - 安定した名前を持つメソッドラッパーとしてデコレータを実装する
  • setup-disable-switch - サービスレベルキャッシュをバイパスする1つの設定スイッチを提供する
  • setup-engine-choice - 重複排除エンジンを使用し、TTLを秒単位でカウントする
  • setup-fail-open - フェイルオープンし、エラーを決してキャッシュしない
  • setup-file-placement - 誰がインポートするかによって機能を配置する
  • setup-identity-context - Scope.REQUESTではなくAsyncLocalStorageから呼び出し元を読み取る
  • setup-module-wiring - キャッシュモジュールを forRootAsync で一度だけ配線する
  • setup-storage-and-invalidation - 無効化を有効にし、referencesTTLとGCを設定する

2. キャッシュポリシー (CRITICAL)

  • policy-five-knobs - 5つのノブを知る
  • policy-key-derivation - キーを自動的に導出し、JSON.stringifyを決して使用しない
  • policy-mount-at-service - デフォルトでサービスレベルにマウントする
  • policy-one-writing-pattern - デコレータが唯一の記述パターンである
  • policy-service-escape-hatch - サービスAPIはエスケープハッチであり、第二のパターンではない

3. リーク安全性 (CRITICAL)

  • safety-default-public - スコープのデフォルトは public — 呼び出し元によって変化する読み取りを perUser とマークする
  • safety-key-dimensions - スコープはユーザーのみをカバー — 他のすべての次元はキーに入れる
  • safety-no-leak-checklist - キャッシュされた読み取りごとにノーリークチェックリストを実行する

4. 無効化 (HIGH)

  • invalidation-after-success - 成功した書き込みの後にのみ無効化する
  • invalidation-atomic-purge - アトミックにパージし、タグのカーディナリティを制限する
  • invalidation-generation-prefix - 巨大または大まかなドメインにはジェネレーションプレフィックスを使用する
  • invalidation-tags-purge-only - タグはパージ専用であり、検索には使用しない

5. 可観測性 (MEDIUM)

  • observability-limits-of-events - エンジンが報告できないことを知る
  • observability-metrics-and-tests - 修正を証明するメトリクスを追跡し、結果でテストする
  • observability-per-request-trace - リクエストごとのトレースを公開し、GraphQLでは開発時のみにする
  • observability-structured-events - ログ文字列ではなく構造化キャッシュイベントを出力する

6. ドライバー (MEDIUM)

  • 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

各ルールファイルには以下が含まれます:

  • ルールの内容とそれが防ぐ障害
  • 説明付きの誤った例
  • 説明付きの正しい例
  • 参考文献

完全なコンパイル済みドキュメント

すべてのルールが1つのドキュメントに展開された完全なガイドについては、AGENTS.md を参照してください。

Individual skills in this repo

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

関連スキル