Skip to content

ランキング応答のエッジキャッシュ導入#147

Merged
kojira merged 3 commits into
mainfrom
claude/ranking-feature-bug-a8nq2k
Jul 10, 2026
Merged

ランキング応答のエッジキャッシュ導入#147
kojira merged 3 commits into
mainfrom
claude/ranking-feature-bug-a8nq2k

Conversation

@kojira

@kojira kojira commented Jul 10, 2026

Copy link
Copy Markdown
Member

背景

ランキング表示が遅く、ユーザー数の伸びを妨げている。ボトルネックは CDN(静的配信)ではなく、関数コールドスタート + Firestore 読み取りの毎回の往復。ユーザーは日本、関数と Firestore は US(us-central1)にあるため、表示の度にこの往復が発生している。

ランキングの元データ cache_data/ranking_cacherankingUpdateGo(毎時 0 * * * *)が更新するだけで、それ以外では変化しない。にもかかわらず表示の度に関数実行 → Firestore 読み取りが走っていた。そこで応答を CDN のエッジでキャッシュさせ、関数・Firestore への到達自体を減らす。

コスト増は無し(min-instances 不要、Firebase Hosting のキャッシュは無料枠)。

変更内容

  • app/functions-go/ranking.go: Cache-Control を出し分け(setRankingCacheHeaders)。
    • グローバル応答(screen_name 無し・トップ画面/未ログイン閲覧という最多経路)→ public, max-age=60, s-maxage=300, stale-while-revalidate=600。元データは最短でも毎時更新なので5分の陳腐化は無害。
    • 個人化応答(screen_name 付き・my_rank を含む)→ private, no-store。共有キャッシュに載せると他人に別人の順位が返る事故になるため、どの階層にもキャッシュさせない。
  • app/firebase.json: /rankingGo の rewrite を追加し、Firebase Hosting CDN をランキング取得の前段に置けるようにする(既存 ogpRewriteGo と同じ書式)。
  • web/nuxt.config.js / web/components/ranking.vue: ランキング取得先を rankingBaseUrlRANKING_BASE_URL、未設定時は API_URL にフォールバック)から取得。本番/ステージングで Hosting オリジンを設定するとエッジキャッシュが有効になり、未設定の dev/emulator では従来どおり関数を直叩きするため挙動は変わらない。
  • .github/workflows/prod-deploy.yml / dev-deploy.yml: RANKING_BASE_URL を GitHub Actions Variable(PROD_RANKING_BASE_URL / DEV_RANKING_BASE_URL)から web/.env に注入。公開 URL のため Secret 不要で、環境ごとに値を分ける。未設定時は空となり API_URL フォールバックで従来動作のままになるため無害。
  • app/functions-go/ranking_test.go: Cache-Control 出し分けの単体テストを追加。
  • docs/backend.md: 設計判断を記録。

デプロイ時に必要な設定(マージ後)

GitHub Actions の Variables に以下を設定(このPRのマージだけでは有効化しない。各環境のデプロイ実行時に焼き込まれる):

Variable 環境
PROD_RANKING_BASE_URL https://d-shrine.jp(末尾スラッシュ無し) 本番(env/prod
DEV_RANKING_BASE_URL ステージングの Hosting オリジン ステージング(env/dev

検証

  • go build ./... && go vet ./...:pass
  • go testTestRanking_CacheHeaders):pass
  • デプロイ後の確認(推奨はステージング先行):
    curl -sI https://<origin>/rankingGo
    # cache-control が出て content-type: application/json(rewrite が効いている証拠)、
    # 2回目に x-cache: HIT が出ればエッジキャッシュ稼働
    

補足(このPRには含めない別の改善候補)

  • 個人化応答は安全のため意図的に非キャッシュ。ログインユーザーの順位表示は引き続き毎回オリジンに到達する。
  • コールドスタート自体をさらに潰すなら min-instances(有料)や scheduler 温めが選択肢。
  • sanpai の逐次 Firestore 書き込み削減など、書き込み系の改善は別途。

🤖 Generated with Claude Code


Generated by Claude Code

claude added 3 commits July 10, 2026 10:54
ランキングの元データ cache_data/ranking_cache は rankingUpdateGo が毎時
更新するのみで変化しないが、従来は表示の度に関数実行→Firestore読み取りが
走っていた。ユーザーは日本・関数とFirestoreはUS(us-central1)にあるため、
この毎回の往復が表示遅延の一因になっている。

- ranking.go: Cache-Control を出し分け。全員共通のグローバル応答
  (screen_name 無し)は public, s-maxage=300 で共有キャッシュ可能に、
  my_rank を含む個人化応答(screen_name 付き)は private, no-store で
  どの階層にもキャッシュさせない(他人に別人の順位が返る事故を防止)。
- firebase.json: /rankingGo rewrite を追加し、Firebase Hosting CDN を
  ランキング取得の前段に置けるようにする。
- web: ランキング取得先を rankingBaseUrl(RANKING_BASE_URL、未設定時は
  API_URL にフォールバック)から取得。本番で RANKING_BASE_URL に Hosting
  オリジンを設定するとエッジキャッシュが有効になり、dev/emulator では
  従来どおり関数を直叩きするため挙動は変わらない。
- ranking_test.go: Cache-Control 出し分けの単体テストを追加。
- docs/backend.md: 設計判断を記録。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU
ランキングのエッジキャッシュを有効化するための RANKING_BASE_URL を、
PROD_ENV シークレット(write-onlyで全文再入力が必要)ではなく GitHub
Actions の Variable から web/.env に追記する。公開URLのため Secret に
する必要がなく、変数1個の追加だけで有効化できる。未設定時は空となり
フロントの API_URL フォールバックで従来動作のままになるため無害。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU
本番とステージング(d-shrine-dev)でランキング取得のオリジンが異なるため、
GitHub Actions Variable を環境別に分ける。既存の PROD_ENV / DEV_ENV の命名に
合わせ、本番は PROD_RANKING_BASE_URL、ステージングは DEV_RANKING_BASE_URL を
それぞれの .env に追記する。いずれも未設定時は空となり API_URL フォールバックで
従来動作のままになるため無害。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwkB6Hj2JggoKcy7FoxNcU
@cursor

cursor Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@kojira
kojira merged commit 262d82a into main Jul 10, 2026
3 checks passed
kojira pushed a commit that referenced this pull request Jul 10, 2026
kojira pushed a commit that referenced this pull request Jul 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants