Voltar para o Blog

Serverless e Edge Computing: O Futuro do Desenvolvimento Web em 2025

Olá HaWkers, imagine uma arquitetura onde você não precisa gerenciar servidores, sua aplicação escala automaticamente de 0 a milhões de usuários, e a latência é sempre inferior a 50ms, não importa onde seu usuário esteja no mundo.

Bem-vindo ao futuro que já é presente: Serverless + Edge Computing.

Entendendo o Paradigma

Serverless: O Que Mudou?

// Modelo tradicional
const traditionalArchitecture = {
  infrastructure: {
    servers: 'Você gerencia EC2, containers, etc',
    scaling: 'Manual ou auto-scaling groups',
    cost: 'Pago 24/7, mesmo sem uso',
    maintenance: 'Patches, updates, monitoring'
  },

  challenges: [
    'Over-provisioning (desperdício)',
    'Under-provisioning (crashes)',
    'Complexidade operacional',
    'Cold starts ao escalar'
  ]
};

// Modelo serverless
const serverlessArchitecture = {
  infrastructure: {
    servers: 'Zero gerenciamento',
    scaling: 'Automático e instantâneo',
    cost: 'Pago apenas por execução',
    maintenance: 'Zero (provider cuida)'
  },

  benefits: [
    'Escala de 0 a infinito automaticamente',
    'Custo proporcional ao uso',
    'Deploy em segundos',
    'Foco 100% em código'
  ]
};

Edge Computing: Mais Perto do Usuário

// Traditional: Servidor centralizado
const traditional = {
  user_location: 'São Paulo, Brasil',
  server_location: 'us-east-1 (Virginia, USA)',
  latency: '~200ms', // 😔
  cold_start: '~1000ms'
};

// Edge: Servidor distribuído globalmente
const edge = {
  user_location: 'São Paulo, Brasil',
  server_location: 'Edge node em São Paulo',
  latency: '~15ms', // 🚀
  cold_start: '~0ms (always warm)'
};

Principais Plataformas em 2025

1. Cloudflare Workers

// Cloudflare Worker - Roda em 300+ cidades globalmente
export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);

    // Edge KV Storage - Latência <50ms globalmente
    const value = await env.MY_KV.get(url.pathname);

    if (value) {
      return new Response(value, {
        headers: { 'Content-Type': 'application/json' }
      });
    }

    // Buscar de origem se não cached
    const response = await fetch(`https://api.example.com${url.pathname}`);
    const data = await response.text();

    // Cache no edge para próximos requests
    ctx.waitUntil(env.MY_KV.put(url.pathname, data, {
      expirationTtl: 3600
    }));

    return new Response(data);
  }
};

// Deploy
// wrangler publish
// ✅ Deploy global em < 10 segundos

Casos de uso:

  • API proxies
  • Authentication edges
  • A/B testing
  • Bot protection
  • Geolocation-based routing

2. Vercel Edge Functions

// Vercel Edge Function - Powered by V8 isolates
import { NextRequest, NextResponse } from 'next/server';

export const config = {
  runtime: 'edge',
};

export default async function middleware(req: NextRequest) {
  const country = req.geo?.country || 'US';
  const city = req.geo?.city || 'Unknown';

  // Personalizar resposta por localização
  if (country === 'BR') {
    return NextResponse.rewrite(new URL('/pt-br', req.url));
  }

  // A/B Testing no edge
  const bucket = Math.random() > 0.5 ? 'A' : 'B';
  const response = NextResponse.next();
  response.cookies.set('bucket', bucket);

  return response;
}

// Edge API Route
export async function GET(request: Request) {
  const { searchParams } = new URL(request.url);
  const userId = searchParams.get('userId');

  // Fetch de dados com baixíssima latência
  const response = await fetch(`https://api.example.com/users/${userId}`, {
    // Edge caching
    next: { revalidate: 60 }
  });

  const data = await response.json();

  return Response.json(data);
}

3. AWS Lambda@Edge

// Lambda@Edge - CloudFront edge locations
exports.handler = async (event) => {
  const request = event.Records[0].cf.request;
  const headers = request.headers;

  // Detectar dispositivo
  const userAgent = headers['user-agent'][0].value;
  const isMobile = /Mobile/i.test(userAgent);

  // Redirecionar para versão otimizada
  if (isMobile && !request.uri.includes('/mobile')) {
    return {
      status: '302',
      headers: {
        location: [{
          key: 'Location',
          value: `/mobile${request.uri}`
        }]
      }
    };
  }

  return request;
};

4. Deno Deploy

// Deno Deploy - TypeScript nativo no edge
import { serve } from "https://deno.land/std@0.190.0/http/server.ts";

const kv = await Deno.openKv();

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

  if (url.pathname === "/api/counter") {
    // KV store no edge
    const count = await kv.get(["counter"]);
    const newCount = (count.value as number || 0) + 1;

    await kv.set(["counter"], newCount);

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

  return new Response("Hello from the edge! 🦕");
});

// Deploy: deno deploy --project=myapp main.ts

Arquitetura Serverless Completa

Exemplo de aplicação full-stack serverless:

// 1. Frontend: Next.js na Vercel
// app/page.tsx
export default async function HomePage() {
  const data = await fetch('https://api.myapp.com/posts', {
    next: { revalidate: 60 } // ISR
  });

  const posts = await data.json();

  return (
    <div>
      {posts.map(post => (
        <PostCard key={post.id} {...post} />
      ))}
    </div>
  );
}

// 2. API: Edge Functions
// app/api/posts/route.ts
export const runtime = 'edge';

export async function GET() {
  // Conectar com database (Planetscale, Neon, etc)
  const posts = await db.query('SELECT * FROM posts ORDER BY created_at DESC LIMIT 10');

  return Response.json(posts);
}

// 3. Background Jobs: AWS Lambda
// lambda/process-image.ts
import { S3Event } from 'aws-lambda';
import sharp from 'sharp';

export async function handler(event: S3Event) {
  for (const record of event.Records) {
    const bucket = record.s3.bucket.name;
    const key = decodeURIComponent(record.s3.object.key);

    // Download imagem
    const image = await s3.getObject({ Bucket: bucket, Key: key });

    // Processar com sharp
    const resized = await sharp(image.Body)
      .resize(800, 600, { fit: 'cover' })
      .webp({ quality: 80 })
      .toBuffer();

    // Upload versão processada
    await s3.putObject({
      Bucket: bucket,
      Key: `processed/${key}`,
      Body: resized
    });
  }
}

// 4. Real-time: WebSockets serverless (Cloudflare Durable Objects)
export class ChatRoom {
  constructor(private state: DurableObjectState) {}

  async fetch(request: Request) {
    if (request.headers.get('Upgrade') === 'websocket') {
      const pair = new WebSocketPair();
      const [client, server] = Object.values(pair);

      this.handleSession(server);

      return new Response(null, {
        status: 101,
        webSocket: client
      });
    }

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

  async handleSession(websocket: WebSocket) {
    websocket.accept();

    websocket.addEventListener('message', async (event) => {
      // Broadcast para todos conectados
      this.state.getWebSockets().forEach(ws => {
        ws.send(event.data);
      });
    });
  }
}

Padrões e Boas Práticas

1. Cold Start Optimization

// ❌ Evite: Importações pesadas
import * as AWS from 'aws-sdk'; // 30MB+
import * as lodash from 'lodash'; // Toda biblioteca

export async function handler() {
  // Cold start: ~3000ms
}

// ✅ Melhor: Importações específicas
import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3';
import debounce from 'lodash/debounce';

export async function handler() {
  // Cold start: ~500ms
}

// ✅ Ideal: Lazy loading
export async function handler(event) {
  if (event.action === 'process-image') {
    // Importar apenas quando necessário
    const sharp = await import('sharp');
    // ...
  }
}

2. Edge Caching Strategy

// Estratégia de cache em múltiplas camadas
export async function GET(request: Request) {
  const { searchParams } = new URL(request.url);
  const id = searchParams.get('id');

  // Camada 1: Edge KV (< 10ms)
  const cached = await env.KV.get(`post:${id}`);
  if (cached) {
    return new Response(cached, {
      headers: {
        'Content-Type': 'application/json',
        'X-Cache': 'HIT-EDGE'
      }
    });
  }

  // Camada 2: Database (< 50ms com Planetscale/Neon)
  const post = await db.query('SELECT * FROM posts WHERE id = ?', [id]);

  if (post) {
    // Cache no edge para próximos requests
    await env.KV.put(`post:${id}`, JSON.stringify(post), {
      expirationTtl: 3600
    });

    return Response.json(post, {
      headers: { 'X-Cache': 'MISS' }
    });
  }

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

3. Distributed Transactions

// Usar event-driven architecture
// Pub/Sub com Cloudflare Queues ou AWS EventBridge

// Producer (Edge Function)
export async function POST(request: Request) {
  const order = await request.json();

  // Publicar evento ao invés de processar sincronamente
  await env.QUEUE.send({
    type: 'ORDER_CREATED',
    data: order
  });

  return Response.json({
    status: 'processing',
    orderId: order.id
  });
}

// Consumer (Lambda/Worker)
export async function processOrder(event) {
  const { data: order } = event;

  // Processar de forma assíncrona
  await Promise.all([
    chargePayment(order),
    updateInventory(order),
    sendConfirmationEmail(order)
  ]);

  // Publicar evento de conclusão
  await publishEvent({
    type: 'ORDER_COMPLETED',
    orderId: order.id
  });
}

Custos: Serverless vs Tradicional

// Comparação de custo mensal
const costComparison = {
  traditional_ec2: {
    instance: 't3.medium 24/7',
    monthly_cost: '$30.40',
    load_balancer: '$16.20',
    total: '$46.60',

    traffic: '1M requests/month',
    notes: 'Pago mesmo sem uso, precisa escalar manualmente'
  },

  serverless_lambda: {
    requests: '1M requests @ $0.20/million',
    compute: '100ms avg @ $0.0000166667/GB-sec',
    monthly_cost: '$5.00',
    total: '$5.00',

    notes: 'Pago apenas por uso, escala automaticamente'
  },

  serverless_edge: {
    cloudflare_workers: {
      requests: '10M requests/month',
      bundled_plan: '$5/month',
      overage: '$0.50/million',
      total: '$5.00'
    },

    vercel_edge: {
      requests: '100k edge/month (free)',
      overage: '$20/million',
      typical_cost: '$0 - $10'
    }
  },

  savings: '~90% vs tradicional'
};

Limitações e Trade-offs

Limitações Atuais

const edgeLimitations = {
  cloudflare_workers: {
    cpu_time: '50ms free, 30s paid',
    memory: '128MB',
    bundle_size: '1MB compressed',
    no_file_system: true,
    no_native_binaries: true
  },

  vercel_edge: {
    cpu_time: '30s max',
    memory: '128MB',
    bundle_size: '1MB - 4MB',
    no_node_api: 'Limited Node.js APIs'
  },

  aws_lambda: {
    timeout: '15 minutes max',
    memory: '128MB - 10GB',
    cold_start: '~500ms - 3s',
    package_size: '250MB'
  }
};

// Quando NÃO usar edge/serverless
const notSuitableFor = [
  'WebSocket connections de longa duração',
  'Processamento de vídeo pesado (> 30s)',
  'Machine Learning training',
  'Operações de file system complexas',
  'Conexões database persistentes tradicionais'
];

O Futuro: 2026 e Além

const futureOfServerless = {
  trends: {
    wasm_on_edge: {
      description: 'WASM rodando no edge para performance máxima',
      players: ['Cloudflare', 'Fastly Compute@Edge', 'Vercel'],
      benefit: 'Cold start ~0ms, qualquer linguagem'
    },

    ai_on_edge: {
      description: 'Modelos de AI rodando no edge',
      use_cases: [
        'Image recognition',
        'Content moderation',
        'Personalization',
        'Chatbots'
      ]
    },

    edge_databases: {
      description: 'Databases distribuídos globalmente',
      examples: ['Planetscale', 'Neon', 'Turso', 'Cloudflare D1'],
      latency: '< 10ms anywhere'
    },

    serverless_gpu: {
      description: 'GPU access em funções serverless',
      use_cases: [
        'AI inference',
        'Video processing',
        'Scientific computing'
      ]
    }
  },

  predictions: {
    '2026': 'Edge computing em 60% das apps web',
    '2027': 'Serverless padrão para novos projetos',
    '2028': 'Edge AI mainstream'
  }
};

Checklist de Migração

## Migrar para Serverless/Edge

### Análise
- [ ] Identificar partes stateless da aplicação
- [ ] Mapear dependências externas
- [ ] Avaliar latency requirements
- [ ] Estimar custos (usar calculadoras dos providers)

### Preparação
- [ ] Refatorar para funções pequenas e focadas
- [ ] Implementar retry logic
- [ ] Configurar monitoring (Datadog, New Relic, Sentry)
- [ ] Preparar rollback plan

### Migração Gradual
- [ ] Começar com endpoints de leitura (GET)
- [ ] Adicionar write operations (POST/PUT)
- [ ] Migrar background jobs
- [ ] Migrar funcionalidades críticas por último

### Pós-Migração
- [ ] Monitorar custos diariamente
- [ ] Otimizar cold starts
- [ ] Ajustar timeouts e memory
- [ ] Documentar arquitectura

Se você está empolgado com as arquiteturas modernas, recomendo dar uma olhada em outro artigo: React Foundation: A Nova Era do Ecossistema React Sob a Linux Foundation onde você vai descobrir como o ecossistema React está evoluindo para suportar estas novas arquiteturas.

Bora pra cima! 🦅

🎯 Junte-se aos Desenvolvedores que Estão Evoluindo

Milhares de desenvolvedores já usam nosso material para acelerar seus estudos e conquistar melhores posições no mercado.

Por que investir em conhecimento estruturado?

Aprender de forma organizada e com exemplos práticos faz toda diferença na sua jornada como desenvolvedor.

Comece agora:

  • R$9,90 (pagamento único)

🚀 Acessar Guia Completo

"Material excelente para quem quer se aprofundar!" - João, Desenvolvedor

Comentários (0)

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

Adicionar comentário