This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
frontendcritical PriorityID: nextjs-15-distributed-cache-stampede-mutex

Next.js 15 Distributed Cache Stampede Mutex Invariant

Enforces distributed atomic locking with soft-lease mechanics across multi-region serverless runtimes during Next.js 15 Incremental Cache revalidation. Prevents catastrophic thundering herd database collapse by ensuring exactly one worker recomputes expired cache keys while concurrent serverless invocations serve soft-stale payloads.

Prohibited Anti-Pattern: Uncoordinated Multi-Region Serverless Revalidation Triggering Database Connection Saturation and Outages

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Next.js 15 Distributed Cache Stampede Mutex Invariant - Enforces distributed atomic locking with soft-lease mechanics across multi-region serverless runtimes during Next.js 15 Incremental Cache revalidation. Prevents catastrophic thundering herd database collapse by ensuring exactly one worker recomputes expired cache keys while concurrent serverless invocations serve soft-stale payloads.
globs: src/app/**/*.{ts,tsx}, app/**/*.{ts,tsx}, src/lib/**/*.{ts,tsx}, lib/**/*.{ts,tsx}
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/nextjs-15-distributed-cache-stampede-mutex"
---

# Next.js 15 Distributed Cache Stampede Mutex Invariant

> **Severity**: CRITICAL | **Category**: frontend
> **Anti-Pattern Warning**: Uncoordinated Multi-Region Serverless Revalidation Triggering Database Connection Saturation and Outages

## System Constraints
You are a Principal Software Architect enforcing distributed synchronization invariants in Next.js 15 serverless environments. Mandate atomic distributed mutexes and soft-expiration stale-while-revalidate leases for all expensive cached operations. Reject in-process memory locks, uncoordinated multi-region execution, and naked database calls during cache misses.

## Strict Guidelines
- Engineers MUST ALWAYS implement distributed atomic locking (e.g., Redis Redlock or SET NX PX) across serverless runtimes for high-cardinality or expensive revalidation targets.
- Engineers MUST NOT rely on in-memory single-flight patterns (e.g., Map, p-memoize) to prevent stampedes across distributed, multi-region serverless instances.
- Code SHOULD implement a two-tier soft-TTL (stale window) and hard-TTL (expiration window) pattern so unacquired lock requests immediately return the soft-stale cached artifact without blocking.
- Services MUST bound distributed lock acquisition timeouts with jitter and fail fast to stale-cached data rather than waiting indefinitely and exhausting serverless execution limits.
- Components NEVER execute raw, unthrottled ORM or database mutations inside public-facing Server Component revalidation paths without distributed lease acquisition.

## Bad vs Good Implementations
### Uncoordinated Revalidation vs Distributed Mutex Soft-TTL Pattern

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Next.js unstable_cache executes the factory callback on cache misses per serverless instance without a cross-region distributed lock. In a spike or after revalidation expiration, hundreds of concurrent Lambdas/Edge workers concurrently run the heavy aggregation query against the primary database.
```typescript
import { unstable_cache } from 'next/cache';
import { db } from '@/lib/db';

// ANTI-PATTERN: Under high traffic in multi-region serverless,
// cache expiry causes hundreds of lambdas to execute this simultaneously,
// saturating the database connection pool (Thundering Herd / Cache Stampede).
export const getGlobalAnalytics = unstable_cache(
  async () => {
    return await db.analytics.aggregate({
      _sum: { pageViews: true, conversions: true },
      where: { createdAt: { gte: new Date(Date.now() - 86400000) } },
    });
  },
  ['global-analytics-key'],
  { revalidate: 60 }
);
```

#### Production Standard (Correct)
> **Standard**: This invariant uses atomic Redis locking (SET NX PX) coupled with a soft/hard TTL envelope. When the soft TTL expires, exactly one serverless execution acquires the revalidation lock. All other concurrent requests instantly receive the soft-stale payload, shielding the database pool from load spikes.
```typescript
import { Redis } from '@upstash/redis';
import { db } from '@/lib/db';

const redis = Redis.fromEnv();
const LOCK_TTL_MS = 10000;
const SOFT_TTL_SEC = 60;
const HARD_TTL_SEC = 86400;

interface CacheEnvelope<T> {
  data: T;
  validUntil: number;
}

export async function getGlobalAnalyticsDistributed(): Promise<{ pageViews: number; conversions: number }> {
  const cacheKey = 'cache:global-analytics';
  const lockKey = 'lock:global-analytics';

  const cached = await redis.get<CacheEnvelope<{ pageViews: number; conversions: number }>>(cacheKey);
  const now = Date.now();

  // Cache hit and still within soft TTL window
  if (cached && now < cached.validUntil) {
    return cached.data;
  }

  // Attempt atomic distributed lock across all multi-region serverless workers
  const acquiredLock = await redis.set(lockKey, 'locked', {
    nx: true,
    px: LOCK_TTL_MS,
  });

  if (!acquiredLock) {
    // Lock held by another serverless node. Return stale data immediately to prevent stampede.
    if (cached) {
      return cached.data;
    }
    // Fallback backoff wait if no stale data exists at all
    await new Promise((resolve) => setTimeout(resolve, 200));
    const retryCached = await redis.get<CacheEnvelope<{ pageViews: number; conversions: number }>>(cacheKey);
    if (retryCached) return retryCached.data;
  }

  try {
    const aggregate = await db.analytics.aggregate({
      _sum: { pageViews: true, conversions: true },
      where: { createdAt: { gte: new Date(Date.now() - 86400000) } },
    });

    const payload = {
      pageViews: aggregate._sum.pageViews ?? 0,
      conversions: aggregate._sum.conversions ?? 0,
    };

    const envelope: CacheEnvelope<typeof payload> = {
      data: payload,
      validUntil: now + SOFT_TTL_SEC * 1000,
    };

    await redis.set(cacheKey, envelope, { ex: HARD_TTL_SEC });
    return payload;
  } finally {
    if (acquiredLock) {
      await redis.del(lockKey);
    }
  }
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Next.js 15 Distributed Cache Stampede Mutex Invariant

Next.js 15 Distributed Cache Stampede Mutex Invariant defines an industrial-grade behavioral standard for frontend engineering. Enforces distributed atomic locking with soft-lease mechanics across multi-region serverless runtimes during Next.js 15 Incremental Cache revalidation. Prevents catastrophic thundering herd database collapse by ensuring exactly one worker recomputes expired cache keys while concurrent serverless invocations serve soft-stale payloads. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Uncoordinated Multi-Region Serverless Revalidation Triggering Database Connection Saturation and Outages Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftUncoordinated Multi-Region Serverless Revalidation Triggering Database Connection Saturation and OutagesCritical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS implement distributed atomic locking (e.g., Redis Redlock or SET NX PX) across serverless runtimes for high-cardinality or expensive revalidation targets.

Engineers MUST ALWAYS implement distributed atomic locking (e.g., Redis Redlock or SET NX PX) across serverless runtimes for high-cardinality or expensive revalidation targets.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST NOT rely on in-memory single-flight patterns (e.g., Map, p-memoize) to prevent stampedes across distributed, multi-region serverless instances.

Engineers MUST NOT rely on in-memory single-flight patterns (e.g., Map, p-memoize) to prevent stampedes across distributed, multi-region serverless instances.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Code SHOULD implement a two-tier soft-TTL (stale window) and hard-TTL (expiration window) pattern so unacquired lock requests immediately return the soft-stale cached artifact without blocking.

Code SHOULD implement a two-tier soft-TTL (stale window) and hard-TTL (expiration window) pattern so unacquired lock requests immediately return the soft-stale cached artifact without blocking.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Services MUST bound distributed lock acquisition timeouts with jitter and fail fast to stale-cached data rather than waiting indefinitely and exhausting serverless execution limits.

Services MUST bound distributed lock acquisition timeouts with jitter and fail fast to stale-cached data rather than waiting indefinitely and exhausting serverless execution limits.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Components NEVER execute raw, unthrottled ORM or database mutations inside public-facing Server Component revalidation paths without distributed lease acquisition.

Components NEVER execute raw, unthrottled ORM or database mutations inside public-facing Server Component revalidation paths without distributed lease acquisition.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is Next.js 15 Distributed Cache Stampede Mutex Invariant critical for AI coding assistants?

Enforces distributed atomic locking with soft-lease mechanics across multi-region serverless runtimes during Next.js 15 Incremental Cache revalidation. Prevents catastrophic thundering herd database collapse by ensuring exactly one worker recomputes expired cache keys while concurrent serverless invocations serve soft-stale payloads. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Uncoordinated Multi-Region Serverless Revalidation Triggering Database Connection Saturation and Outages) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

Related FRONTEND Rules

View all rules →
frontend
119

SolidStart 1.0 Server Functions & Async Boundaries Production Standard

SolidStart 1.0 relies on the Vinxi bundler to split `server$` closures into independent HTTP POST RPC endpoints. Direct lexical closure over client signals within `server$` scopes or failure to demarcate async boundaries with `<Suspense>` causes silent serialization failures, client-bundle secret leaks, and SSR hydration mismatches. Enforcing strict parameter passing, runtime input validation, and Solid async primitives maintains security and fine-grained reactivity across network boundaries.

frontend
119

Astro 5 Actions & Content Layer Production Standard

Enforces strict type safety and architectural correctness for Astro 5 Server Actions and the zero-waterfall Content Layer API. Prevents runtime contract mismatches, hydration mismatches, and unhandled mutation exceptions across dynamic and prerendered boundaries. Failure to follow these patterns leads to silent data fetching waterfalls, build-time cache corruptions, and unhandled server action exceptions.

frontend
51

Nuxt 4 Nitro Server Engine & Shared Directory Production Standard

Nuxt 4 enforces strict boundary segregation between client UI in the app/ directory, backend endpoints in server/, and universal contracts in shared/. Violating cross-boundary isolation or maintaining module-scoped state in Nitro server handlers causes catastrophic cross-request data corruption and hydration mismatches under concurrent production traffic. Architects must enforce request-isolated H3 event contexts, universal serialization schemas, and strict path-alias boundaries.

1 Rule in Stack

Next.js