---
title: "Паттерны Оптимизации Производительности"
description: "Кеширование базы данных, дедупликация React cache(), паттерны Firebase Admin SDK и оптимизация Server Components для Ring Platform."
locale: "ru"
---
# Паттерны Оптимизации Производительности

Ring Platform использует **React 19 `cache()`** для дедупликации данных в Server Components, **слой абстракции базы данных** (`DatabaseService` + адаптеры) для работы с PostgreSQL или Firestore, и **Firebase Admin SDK** (`firebase-service-manager.ts`) для кешированных чтений Firestore в режиме `firebase-full`.

> **Info**
> Все примеры кода ниже ссылаются на **реальные файлы** кодовой базы — `lib/services/firebase-service-manager.ts`, `lib/database/DatabaseService.ts`, `lib/database/adapters/FirebaseAdapter.ts`. Вымышленные утилиты (session-storage кеши, кастомный RingApiClient, виртуализация) не являются частью Ring Platform.

## React 19 Server Components и получение данных

### Прямое получение данных в Server Components (рекомендуется)

{`// Сервисы используют DatabaseService (PostgreSQL или Firebase адаптер)
import { getEntities } from '@/features/entities/services/entity-service'

export default async function EntitiesPage() {
  const entities = await getEntities()
  return 
}`}

Избегайте вызовов собственных HTTP API из Server Components — App Router Server Components могут импортировать сервисы напрямую без round-trip запроса.

### React 19 `cache()` для дедупликации запросов

React 19 `cache()` дедуплицирует идентичные одновременные вызовы в пределах одного запроса. Ring Platform использует это в двух местах:

**1. `firebase-service-manager.ts`** — кешированные чтения Firestore (Admin SDK, только режим `firebase-full`):

{`import { cache } from 'react'
import { getAdminDb } from '../firebase-admin.server'

export const getCachedDocument = cache(async (
  collection: string,
  docId: string
): Promise => {
  const db = getAdminDb()
  const docRef = db.collection(collection).doc(docId)
  const doc = await docRef.get()
  return doc.exists ? doc : null
})`}

**2. `DatabaseService`** — кеш сущностей для консистентности read-after-write (TTL 30 секунд):

{`class EntityCache {
  private cache = new Map<string, { data: any; timestamp: number }>()
  private readonly TTL = 30000 // 30 секунд

  set(key: string, data: any) {
    this.cache.set(key, { data, timestamp: monotime() })
  }

  get(key: string) {
    const entry = this.cache.get(key)
    if (entry && (monotime() - entry.timestamp) < this.TTL) return entry.data
    this.cache.delete(key)
    return null
  }

  invalidate(key: string) { this.cache.delete(key) }
}`}

### Хуки React 19

{`'use client'
import { useActionState } from 'react'

export function CreateEntityForm() {
  const [state, formAction, isPending] = useActionState(
    createEntityAction,
    { success: false, errors: [] }
  )

  return (
    
      
      {isPending && Создание...}
      {state.errors.length > 0 && (
        {state.errors.map(e => {e})}
      )}
      
        {isPending ? 'Создание...' : 'Создать сущность'}
      
    
  )
}`}

## Слой абстракции базы данных

### Контракт `DatabaseService`

Реальный `DatabaseService` маршрутизирует через `BackendSelector` к `PostgreSQLAdapter` или `FirebaseAdapter`. Его API запросов использует **один объектный параметр**:

{`// Реальный API — один объектный параметр
const result = await db.query({
  collection: 'entities',
  filters: [{ field: 'status', operator: 'eq', value: 'active' }],
  orderBy: [{ field: 'createdAt', direction: 'desc' }],
  pagination: { limit: 20, offset: 0 }
})
// result: { success: boolean; data: DbRow[]; error?: Error }

// Один документ
const doc = await db.findById('users', userId)
// doc: { success: boolean; data: T | null; error?: Error }

// Мутации
await db.create('entities', data)
await db.update('entities', id, partial)
await db.delete('entities', id)

// Транзакции
await db.transaction(async (txn) => {
  await txn.create('orders', orderData)
  await txn.update('inventory', productId, { stock: newStock })
})`}

### FirebaseAdapter (Admin SDK — только серверная часть)

**Реальный** `FirebaseAdapter` использует `firebase-admin/firestore`, а не клиентский Firebase SDK:

{`import { Firestore, FieldValue, Timestamp } from 'firebase-admin/firestore'
import { cert, getApps, initializeApp } from 'firebase-admin/app'

export class FirebaseAdapter implements IDatabaseService {
  private firestore: Firestore | null = null

  async findById(collection: string, id: string): Promise<DatabaseResult> {
    if (!this.firestore) await this.connect()
    const doc = await this.firestore.collection(collection).doc(id).get()
    if (!doc.exists) {
      return { success: true, data: undefined as any }
    }
    return { success: true, data: { id: doc.id, ...doc.data() } as T }
  }

  async query(query: DatabaseQuery): Promise<DatabaseResult<T[]>> {
    // query = { collection, filters?, orderBy?, pagination? }
    // Использует Admin SDK Query builder
    let q: FirebaseFirestore.Query = this.firestore.collection(query.collection)
    // ... фильтр, сортировка, пагинация, выполнение
    const snapshot = await q.get()
    return {
      success: true,
      data: snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })) as T[]
    }
  }
}`}

**Ключевое отличие:** Пример в предыдущей версии документации показывал клиентский `getFirestore()` из `firebase/firestore` — это неверно для серверного адаптера платформы. Реальный адаптер использует исключительно `firebase-admin/firestore`.

## Стратегия кеширования

| Уровень | Область | Механизм | Расположение |
|---------|---------|----------|--------------|
| React `cache()` | На запрос | Дедупликация React 19 | `firebase-service-manager.ts` (Firebase) / Server Components |
| EntityCache | TTL 30 с | In-memory Map | `DatabaseService.ts` |
| HTTP/CDN | Уровень страницы | Next.js `stale-while-revalidate` | `next.config.mjs` заголовки |

**Кеширование `sessionStorage`** на сервере не используется. Кеширование на стороне браузера остается стандартным Web API паттернам (не является частью данной кодовой базы).

## Оптимизация Firebase (FirebaseAdmin SDK)

### Пакетные операции

`firebase-service-manager.ts` предоставляет:

{`import { createBatchWriter, executeBatch } from '@/lib/services/firebase-service-manager'

const batch = createBatchWriter()
const ref1 = db.collection('entities').doc('id1')
batch.update(ref1, { status: 'archived' })
const ref2 = db.collection('entities').doc('id2')
batch.update(ref2, { status: 'archived' })
await executeBatch(batch)`}

Для лимита пакетов Firestore в 500 элементов и требований к составным индексам см. [документацию Firestore](https://firebase.google.com/docs/firestore/query-data/indexing).

### Отслеживание метрик (только для отладки)

`firebase-service-manager.ts` включает опциональные метрики для разработки (контролируются `FIREBASE_DEBUG_LOGS=true`):

{`// lib/services/firebase-service-manager.ts — метрики отладки
const metrics = {
  cacheHits: 0,
  cacheMisses: 0,
  totalRequests: 0,
  getHitRate(): number {
    return this.totalRequests > 0 ? (this.cacheHits / this.totalRequests) * 100 : 0
  },
}

export function getCacheMetrics() {
  return {
    hitRate: metrics.getHitRate(),
    totalRequests: metrics.totalRequests,
    cacheHits: metrics.cacheHits,
    cacheMisses: metrics.cacheMisses
  }
}`}

Это инструмент для разработки/отладки — **не система мониторинга продакшна**. Он логирует в `console.log`, а не во внешний сервис. Бюджет производительности в `next.config.mjs` не настроен.

## Оптимизация сборки

### Текущий `next.config.mjs`

{`const nextConfig = {
  reactStrictMode: true,
  cacheComponents: true,
  // Полный файл см. для env, redirects, headers, i18n конфигурации
}`}

**Отсутствуют `swcMinify`, `experimental.optimizeCss` и `performance`** — это функции Next.js 12/13. Next.js 16 управляет SWC минификацией и оптимизацией CSS автоматически.

## Итог

- **Реальное кеширование**: React 19 `cache()` для дедупликации запросов, EntityCache для 30-секундной консистентности read-after-write
- **Реальный Firebase адаптер**: `firebase-admin/firestore` (Admin SDK), никогда не клиентский `firebase/firestore`
- **Реальный контракт `DatabaseService`**: `findById`, `query({collection, filters, orderBy, pagination})`, `transaction`
- **Удалены вымышленные паттерны**: `SessionStorageCache`, `RingApiClient`, маршрутизация `DB_HYBRID_MODE`, `next.config` бюджеты производительности, фейковые KPI ("95% снижение", "17.0s", "55KB"), `trackWebVitals`, виртуализация
- **Бенчмарки производительности** не отслеживаются в этой кодовой базе — результаты профилирования принадлежат CI дашбордам, а не документации
