Edge Computing

Edge Computing — выполнение кода на серверах, физически близких к пользователю (Edge PoP — Points of Presence), вместо централизованного датацентра, что сокращает TTFB и latency за счёт уменьшения расстояния до сервера.

Зачем нужно

Latency определяется физикой: скорость света в волоконной оптике ~200 000 км/с. Пользователь в Токио и сервер в Вирджинии имеют RTT ~150-200ms. Edge node в Токио сократит RTT до 5-20ms. Для TTFB это принципиальная разница.

Где используется

  • Персонализация без round-trip до origin (AB-тесты, куки, геолокация)
  • A/B тестирование на уровне edge
  • Аутентификация и авторизация (JWT verification) на edge
  • Статический контент + динамические заголовки (Cache-Control, CSP)
  • Server-Side Rendering ближе к пользователю

Основной контент

Платформы Edge Computing

Cloudflare Workers   → V8 isolates, 300+ PoP, <1ms cold start
Vercel Edge Runtime  → Next.js middleware, ограниченный Node.js API
Fastly Compute@Edge  → WebAssembly, Rust/Go/JS
AWS Lambda@Edge      → Node.js на CloudFront PoP (медленнее, ~1s cold start)
Deno Deploy          → TypeScript, глобальная сеть

Cloudflare Worker: Edge Authentication

// workers/auth.js
export default {
  async fetch(request, env) {
    const url = new URL(request.url);

    // Проверка JWT на edge — без обращения к origin
    if (url.pathname.startsWith('/api/')) {
      const token = request.headers.get('Authorization')?.slice(7);
      if (!token) {
        return new Response('Unauthorized', { status: 401 });
      }

      try {
        // Верификация на edge с публичным ключом
        const payload = await verifyJWT(token, env.JWT_PUBLIC_KEY);
        // Передаём информацию о пользователе в заголовке к origin
        const modifiedRequest = new Request(request, {
          headers: { ...request.headers, 'X-User-Id': payload.sub },
        });
        return fetch(modifiedRequest);
      } catch {
        return new Response('Invalid token', { status: 401 });
      }
    }

    return fetch(request);
  },
};

Vercel Edge Middleware (Next.js)

// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
  const { geo, ip } = request;

  // Геолокация без origin round-trip
  const country = geo?.country ?? 'US';

  // A/B тест на edge
  const variant = Math.random < 0.5 ? 'a' : 'b';
  const response = NextResponse.next();
  response.cookies.set('ab_variant', variant);
  response.headers.set('X-Country', country);

  return response;
}

export const config = {
  matcher: ['/((?!_next/static|favicon.ico).*)'],
};

Edge Caching с персонализацией

// Cloudflare Worker: кешируем статику, персонализируем на edge
export default {
  async fetch(request, env, ctx) {
    const cache = caches.default;
    const cacheKey = new Request(request.url);

    let response = await cache.match(cacheKey);
    if (response) {
      // Добавляем персонализацию к кешированному ответу
      const country = request.cf?.country;
      return new Response(response.body, {
        headers: { ...response.headers, 'X-Country': country },
      });
    }

    response = await fetch(request);
    ctx.waitUntil(cache.put(cacheKey, response.clone()));
    return response;
  },
};

Частые ошибки

  • Использование edge для операций с состоянием без edge-совместимого хранилища (Cloudflare KV, D1)
  • Тяжёлые вычисления на edge — CPU time лимит 50ms (Cloudflare Workers)
  • Отсутствие fallback при недоступности edge — приложение должно работать и без него
  • Попытка использовать полный Node.js API на edge — доступен только Web API subset

Связанные темы

Ресурсы