PrismaSeniorSystem design

Что такое Prisma Accelerate и какую проблему он решает для serverless/edge-деплоев?

Prisma Accelerate — глобальный connection pool и edge-кэш для Prisma Client, решающий проблему лимитов соединений и высокой латентности в serverless/edge-окружениях. Заменяет прямое соединение с БД на управляемый прокси с TTL-кэшированием результатов.

Что такое Prisma Accelerate

Prisma Accelerate — управляемый сервис от Prisma, предоставляющий два ключевых механизма:

  • Глобальный connection pool — прокси-сервер, принимающий тысячи одновременных соединений от serverless-функций и мультиплексирующий их в небольшой пул реальных соединений с PostgreSQL/MySQL.
  • Edge cache — встроенный кэш на уровне запросов с настраиваемым TTL и Stale-While-Revalidate стратегией.

Проблема serverless/edge

В serverless-окружениях (Vercel Functions, AWS Lambda, Cloudflare Workers) каждый холодный старт создаёт новое TCP-соединение с базой данных. При нагрузке в 500 rps это означает сотни параллельных соединений, что легко превышает лимит PostgreSQL (обычно 100–200 max_connections). Prisma Accelerate перехватывает соединения через HTTPS/WebSocket и поддерживает постоянный пул на своей стороне.

Настройка

Установите расширение и получите Accelerate URL в консоли platform.prisma.io:

npm install @prisma/extension-accelerate
import { PrismaClient } from '@prisma/client';
import { withAccelerate } from '@prisma/extension-accelerate';

const prisma = new PrismaClient().$extends(withAccelerate());

// DATABASE_URL в .env:
// prisma+postgres://accelerate.prisma-data.net/?api_key=YOUR_KEY

// Запрос с кэшированием на 60 секунд
const users = await prisma.user.findMany({
  cacheStrategy: {
    ttl: 60,          // время жизни кэша в секундах
    swr: 30,          // stale-while-revalidate окно
  },
});

// Запрос без кэша (по умолчанию)
const freshUser = await prisma.user.findUnique({
  where: { id: 1 },
});

Как работает cacheStrategy

  • ttl — запросы к БД не выполняются, если кэш свежее TTL секунд.
  • swr (Stale-While-Revalidate) — отдаёт устаревшие данные, пока фоново обновляет кэш.
  • Без cacheStrategy запрос всегда идёт в БД через connection pool Accelerate.

Cloudflare Workers — отдельный случай

Workers не поддерживают TCP-соединения напрямую. Accelerate использует HTTP/2 поверх HTTPS, что совместимо с Workers runtime. Без Accelerate Prisma в Workers не работает совсем.

// wrangler.toml
// [vars]
// DATABASE_URL = "prisma+postgres://accelerate.prisma-data.net/?api_key=..."

export default {
  async fetch(request: Request, env: Env) {
    const prisma = new PrismaClient({
      datasourceUrl: env.DATABASE_URL,
    }).$extends(withAccelerate());

    const count = await prisma.post.count({
      cacheStrategy: { ttl: 120 },
    });
    return new Response(String(count));
  },
};

Подводные камни

  • Accelerate не поддерживает $transaction с интерактивными транзакциями в edge-окружениях — только batch-транзакции.
  • Кэш инвалидируется только по TTL, не по событиям записи — мутации не сбрасывают кэш автоматически.
  • cacheStrategy доступен только для read-операций (findMany, findUnique, count, aggregate).
  • Accelerate URL содержит API-ключ — его утечка равносильна утечке доступа к БД через прокси.
  • Бесплатный план имеет лимит 6 млн запросов/месяц и ограниченный размер кэша.
  • Задержка через Accelerate выше на 5–20 мс по сравнению с прямым соединением в long-running сервисах.
  • При использовании Accelerate нельзя передавать нативные PostgreSQL-параметры соединения (SSL-сертификаты, search_path и т.д.) напрямую.

Common mistakes

  • Путает Prisma Client API с гарантиями базы данных: индексы, блокировки и isolation level не создаются магически.
  • Не объясняет, где в lifecycle находится Prisma Accelerate.
  • Не разделяет validation, authorization, business logic и persistence.
  • Игнорирует ошибки, лимиты входных данных, observability и тестирование.

What the interviewer is testing

  • Может объяснить Prisma Accelerate на примере кода.
  • Называет ключевые API: Prisma Accelerate.
  • Отделяет ORM/query builder поведение от реального поведения СУБД.
  • Видит production-риски: безопасность, отказоустойчивость, логирование и тесты.

Sources

Related topics