Voltar para o Blog

Edge Computing e Serverless: O Futuro das Aplicações JavaScript em 2025

Olá HaWkers, imagine rodar código JavaScript a poucos milissegundos dos seus usuários, em 300+ localizações ao redor do mundo, pagando apenas pelo que você realmente usa. Isso não é futuro - é realidade do Edge Computing e Serverless em 2025.

Você já se perguntou por que algumas aplicações respondem instantaneamente enquanto outras levam segundos para processar requests simples?

O Que É Edge Computing e Por Que Ele Mudou Tudo

Edge Computing é a prática de executar código o mais próximo possível do usuário final, em vez de em servidores centralizados distantes. Em 2025, plataformas como Cloudflare Workers, Vercel Edge Functions e Deno Deploy distribuem seu código JavaScript em centenas de data centers globalmente.

Diferença fundamental:

Modelo tradicional (servidor centralizado):

  • Usuário no Brasil → request vai para servidor nos EUA (200ms latência)
  • Servidor processa → resposta volta para Brasil (200ms latência)
  • Total: 400ms+ de latência apenas de rede

Modelo Edge:

  • Usuário no Brasil → request vai para edge node em São Paulo (5ms latência)
  • Edge processa → resposta volta imediatamente (5ms latência)
  • Total: 10ms de latência

Resultado: 97% de redução na latência para usuários globais.

Benefícios Reais do Edge em 2025:

  • Latência ultra-baixa: 5-20ms vs 200-500ms (servidor tradicional)
  • Escalabilidade automática: De 0 a 10 milhões de requests sem configuração
  • Custo reduzido: 60-70% menor que VMs tradicionais
  • Geo-localização nativa: Código roda perto de cada usuário automaticamente

Cloudflare Workers: JavaScript no Edge em Prática

Cloudflare Workers permite rodar JavaScript/TypeScript em 300+ cidades globalmente. Vamos ver exemplos práticos:

Exemplo 1: API REST no Edge

// worker.js - API rodando no edge global
export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);

    // Roteamento simples
    if (url.pathname === '/api/user') {
      return handleGetUser(request, env);
    }

    if (url.pathname === '/api/products') {
      return handleGetProducts(request, env);
    }

    return new Response('Not Found', { status: 404 });
  },
};

async function handleGetUser(request, env) {
  const userId = new URL(request.url).searchParams.get('id');

  // Acessar D1 (SQLite no edge da Cloudflare)
  const result = await env.DB.prepare(
    'SELECT * FROM users WHERE id = ?'
  ).bind(userId).first();

  if (!result) {
    return new Response('User not found', { status: 404 });
  }

  return new Response(JSON.stringify(result), {
    headers: { 'Content-Type': 'application/json' },
  });
}

async function handleGetProducts(request, env) {
  // Cache no edge (KV storage)
  const cached = await env.PRODUCTS_CACHE.get('all-products');

  if (cached) {
    return new Response(cached, {
      headers: {
        'Content-Type': 'application/json',
        'X-Cache': 'HIT',
      },
    });
  }

  // Buscar de fonte de dados
  const products = await fetchProductsFromOrigin(env);
  const json = JSON.stringify(products);

  // Cachear por 1 hora
  await env.PRODUCTS_CACHE.put('all-products', json, {
    expirationTtl: 3600,
  });

  return new Response(json, {
    headers: {
      'Content-Type': 'application/json',
      'X-Cache': 'MISS',
    },
  });
}

Vantagens deste código:

  • ✅ Roda em 300+ localizações automaticamente
  • ✅ Latência de 5-20ms globalmente
  • ✅ Escalabilidade infinita (0 a milhões de requests)
  • ✅ Custo: $5/mês para 10 milhões de requests (vs $200+ em VMs)

Exemplo 2: Autenticação e Middleware no Edge

// auth-middleware.js - Proteção de rotas no edge
export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);

    // Rotas públicas não precisam auth
    const publicPaths = ['/', '/login', '/register', '/api/public'];
    if (publicPaths.some(path => url.pathname.startsWith(path))) {
      return fetch(request); // Passa adiante
    }

    // Verificar JWT
    const authHeader = request.headers.get('Authorization');
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return new Response('Unauthorized', { status: 401 });
    }

    const token = authHeader.substring(7);

    try {
      // Validar JWT (biblioteca jose para edge)
      const { jwtVerify } = await import('jose');
      const secret = new TextEncoder().encode(env.JWT_SECRET);

      const { payload } = await jwtVerify(token, secret);

      // Adicionar user info nos headers para origin
      const newRequest = new Request(request);
      newRequest.headers.set('X-User-Id', payload.sub);
      newRequest.headers.set('X-User-Role', payload.role);

      return fetch(newRequest);
    } catch (error) {
      return new Response('Invalid token', { status: 401 });
    }
  },
};

Resultado: Autenticação processada em <10ms no edge, sem tocar servidor de origem.

edge computing diagram

Vercel Edge Functions: Edge + Next.js

Vercel Edge Functions integra perfeitamente com Next.js, permitindo SSR no edge:

// middleware.js - Next.js middleware no edge
import { NextResponse } from 'next/server';

export function middleware(request) {
  const url = request.nextUrl;

  // A/B Testing no edge
  const bucket = Math.random() < 0.5 ? 'a' : 'b';
  url.searchParams.set('variant', bucket);

  const response = NextResponse.rewrite(url);

  // Set cookie para manter variante
  response.cookies.set('ab-test-variant', bucket, {
    maxAge: 60 * 60 * 24 * 30, // 30 dias
  });

  return response;
}

export const config = {
  matcher: '/product/:path*',
};
// app/api/personalize/route.js - Edge API Route
export const runtime = 'edge'; // Marca para rodar no edge!

export async function GET(request) {
  const geo = request.geo; // Geolocation automática

  // Personalizar conteúdo por localização
  const content = {
    country: geo.country,
    city: geo.city,
    currency: getCurrencyForCountry(geo.country),
    language: getLanguageForCountry(geo.country),
    shippingEstimate: getShippingEstimate(geo.country),
  };

  return Response.json(content);
}

function getCurrencyForCountry(country) {
  const currencies = {
    BR: 'BRL',
    US: 'USD',
    GB: 'GBP',
    EU: 'EUR',
  };
  return currencies[country] || 'USD';
}

function getShippingEstimate(country) {
  const estimates = {
    BR: '3-5 dias úteis',
    US: '2-3 business days',
    GB: '1-2 business days',
  };
  return estimates[country] || '5-7 business days';
}

Benefícios:

  • ✅ Personalização instantânea por geo-localização
  • ✅ A/B testing sem afetar performance
  • ✅ Integração zero-config com Next.js

Serverless vs Serverful: Quando Usar Cada Um

Serverless não significa "sem servidores" - significa que você não gerencia servidores. Em 2025, a escolha entre serverless e traditional servers depende do caso de uso:

Use Serverless/Edge quando:

Tráfego variável e imprevisível

  • E-commerce com picos sazonais (Black Friday)
  • Apps virais que podem escalar 1000x overnight
  • APIs com uso esporádico

Latência é crítica

  • Aplicações de tempo real
  • Jogos online, chat apps
  • APIs que servem usuários globais

Custo otimizado para workloads intermitentes

  • Cron jobs que rodam poucas vezes por dia
  • Webhooks e event-driven architectures
  • Processamento de eventos assíncronos

Use Servidores Tradicionais quando:

Workloads constantes e previsíveis

  • Aplicação corporativa com tráfego estável
  • Processamento batch contínuo

Long-running processes

  • Machine learning training
  • Video encoding que leva horas
  • WebSocket connections de longa duração

Controle total do ambiente

  • Configurações específicas de kernel
  • Bibliotecas nativas complexas

Comparação de Custos Real:

Cenário: API com 10 milhões de requests/mês, 50ms de execução média

Plataforma Tipo Custo/mês Latência Média
AWS Lambda Serverless $25 80ms
Cloudflare Workers Edge $5 15ms
Vercel Edge Edge $20 20ms
AWS EC2 (t3.medium) VM $35 120ms
DigitalOcean (4GB) VM $24 150ms

Conclusão: Edge serverless vence em custo E performance para a maioria dos casos.

Deno Deploy: Alternativa TypeScript-First ao Node.js

Deno Deploy é uma plataforma edge serverless otimizada para TypeScript e Web Standards:

// main.ts - Deno Deploy edge function
import { serve } from 'https://deno.land/std@0.200.0/http/server.ts';

// Interface TypeScript
interface Product {
  id: number;
  name: string;
  price: number;
  stock: number;
}

// Conectar a PostgreSQL (Supabase, Neon, etc)
async function getProducts(): Promise<Product[]> {
  const response = await fetch(
    `${Deno.env.get('SUPABASE_URL')}/rest/v1/products`,
    {
      headers: {
        apikey: Deno.env.get('SUPABASE_KEY')!,
        Authorization: `Bearer ${Deno.env.get('SUPABASE_KEY')}`,
      },
    }
  );

  return response.json();
}

serve(async (req: Request) => {
  const url = new URL(req.url);

  // CORS automático
  if (req.method === 'OPTIONS') {
    return new Response(null, {
      headers: {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
      },
    });
  }

  // Roteamento
  switch (url.pathname) {
    case '/api/products': {
      const products = await getProducts();

      return new Response(JSON.stringify(products), {
        headers: {
          'Content-Type': 'application/json',
          'Access-Control-Allow-Origin': '*',
        },
      });
    }

    case '/api/search': {
      const query = url.searchParams.get('q');
      if (!query) {
        return new Response('Missing query parameter', { status: 400 });
      }

      // Full-text search no edge
      const products = await getProducts();
      const filtered = products.filter(p =>
        p.name.toLowerCase().includes(query.toLowerCase())
      );

      return new Response(JSON.stringify(filtered), {
        headers: { 'Content-Type': 'application/json' },
      });
    }

    default:
      return new Response('Not found', { status: 404 });
  }
});

Vantagens do Deno Deploy:

  • ✅ TypeScript nativo (sem transpilação)
  • ✅ Web Standards (fetch, Response, Request)
  • ✅ Imports diretos de URLs (sem package.json)
  • ✅ Deploy instantâneo via CLI ou GitHub

Padrões de Arquitetura: Edge + Origin

A arquitetura ideal em 2025 combina edge e origin servers:

Padrão 1: Edge Cache + Origin API

// edge-cache.js - Cloudflare Worker
export default {
  async fetch(request, env, ctx) {
    const cache = caches.default;
    const url = new URL(request.url);

    // Tentar cache primeiro
    let response = await cache.match(request);

    if (response) {
      return response;
    }

    // Cache miss - buscar de origin
    response = await fetch(`https://origin-api.example.com${url.pathname}`);

    // Cachear por 5 minutos
    const cachedResponse = new Response(response.body, response);
    cachedResponse.headers.set('Cache-Control', 'public, max-age=300');

    ctx.waitUntil(cache.put(request, cachedResponse.clone()));

    return response;
  },
};

Padrão 2: Edge Authentication + Origin Logic

// edge-auth.js - Autenticação no edge, lógica no origin
export default {
  async fetch(request, env) {
    // Auth no edge (rápido)
    const user = await authenticateUser(request, env);

    if (!user) {
      return new Response('Unauthorized', { status: 401 });
    }

    // Passar request autenticado para origin
    const originRequest = new Request(request);
    originRequest.headers.set('X-User-Id', user.id);
    originRequest.headers.set('X-User-Tier', user.tier);

    // Origin processa lógica complexa
    return fetch(`https://origin.example.com${new URL(request.url).pathname}`, originRequest);
  },
};

Padrão 3: Edge Transformations

// edge-transform.js - Transformar respostas no edge
export default {
  async fetch(request, env) {
    const response = await fetch(request);

    // Minificar HTML no edge (economizar bandwidth)
    if (response.headers.get('Content-Type')?.includes('text/html')) {
      let html = await response.text();

      // Remover espaços em branco desnecessários
      html = html.replace(/\s+/g, ' ').replace(/>\s+</g, '><');

      return new Response(html, {
        headers: response.headers,
      });
    }

    return response;
  },
};

Limitações e Desafios do Edge Computing

Apesar dos benefícios, edge computing tem limitações importantes:

1. Restrições de Recursos

Cloudflare Workers:

  • CPU Time: 50ms (free), 30s (paid)
  • Memory: 128MB
  • Request size: 100MB

Vercel Edge Functions:

  • Execution time: 30s max
  • Memory: 128MB
  • Response size: 4MB

Implicação: Operações pesadas (machine learning, video processing) não cabem no edge.

2. Cold Starts (menor que serverless tradicional)

// edge-cold-start.js
let globalCounter = 0; // Persiste entre invocações

export default {
  async fetch(request) {
    globalCounter++;

    // globalCounter pode resetar em cold starts
    return new Response(`Request #${globalCounter}`);
  },
};

Edge functions têm cold starts de 0-10ms (vs 100-1000ms no Lambda), mas estado global não é garantido.

3. Compatibilidade de APIs

Edge runtimes não suportam todas APIs Node.js:

// ❌ NÃO funciona no edge
const fs = require('fs'); // Sem filesystem
const child_process = require('child_process'); // Sem child processes

// ✅ Funciona no edge
fetch(); // Web Standard
crypto.subtle; // Web Crypto API
Response, Request, Headers; // Web Standards

Solução: Use bibliotecas compatíveis com Web Standards.

Conclusão: Edge + Serverless É o Novo Padrão

Em 2025, a combinação de edge computing e serverless se tornou o padrão para aplicações JavaScript modernas. As vantagens de latência, custo e escalabilidade são irrefutáveis para a maioria dos casos de uso.

Recomendações práticas:

Para novos projetos:

  1. Comece com edge serverless (Cloudflare Workers ou Vercel Edge)
  2. Use origin servers apenas para lógica pesada
  3. Implemente caching agressivo no edge

Para projetos existentes:

  1. Migre autenticação e rotas estáticas para edge
  2. Use edge como cache layer na frente do origin
  3. Migre gradualmente endpoints de API para edge

Stack recomendada 2025:

  • Edge Runtime: Cloudflare Workers ou Vercel Edge Functions
  • Framework: Next.js (App Router com edge support)
  • Database: Cloudflare D1, Turso, ou Planetscale (edge-compatible)
  • Storage: Cloudflare R2 ou Vercel Blob

Se você se sente inspirado pelo edge computing, recomendo que dê uma olhada em outro artigo: React 19 e Server Components onde você vai descobrir como combinar edge com React Server Components.

Bora pra cima! 🦅

📚 Quer Aprofundar Seus Conhecimentos em JavaScript?

Este artigo cobriu edge computing e serverless, mas há muito mais para explorar no mundo do desenvolvimento moderno.

Desenvolvedores que investem em conhecimento sólido e estruturado tendem a ter mais oportunidades no mercado.

Material de Estudo Completo

Se você quer dominar JavaScript do básico ao avançado, preparei um guia completo:

Opções de investimento:

  • R$9,90 (pagamento único)

👉 Conhecer o Guia JavaScript

💡 Material atualizado com as melhores práticas do mercado

Comentários (0)

Esse artigo ainda não possui comentários 😢. Seja o primeiro! 🚀🦅

Adicionar comentário