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
Связанные темы
- _MOC Производительность
- SSR vs CSR -- производительность
- Кеширование -- Cache-Control
- Метрики -- FCP, TTFB, TTI, TBT