Felipe Moacir

Serverless: Arquitetura Sem Servidores

ServerlessArchitectureBackend
Serverless: Arquitetura Sem Servidores

Serverless não significa "sem servidor". Significa: você não gerencia servidores.

O Que É Serverless?

Você escreve funções. O provider executa sob demanda:

// Vercel Function (API route)
export default function handler(req, res) {
  res.json({ message: 'Hello from serverless!' });
}

Deploy e Vercel escala automaticamente.

Principais Providers

AWS Lambda

O pioneiro. Suporta:

  • Node.js, Python, Java, Go, Ruby, .NET
  • 15 minutos de timeout máximo
  • 10GB de RAM
# lambda_function.py
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': 'Hello Lambda'
    }

Vercel Functions

Integrado com Next.js:

// pages/api/user.ts
export default async function handler(req, res) {
  const user = await db.users.findUnique({ 
    where: { id: req.query.id } 
  });
  
  res.json(user);
}
  • 10 segundos de timeout (Hobby)
  • 60 segundos (Pro)

Cloudflare Workers

Edge computing. Roda em 300+ cidades:

export default {
  async fetch(request) {
    return new Response('Hello from the edge!');
  }
};
  • 0ms de cold start (Isolates V8)
  • Latência < 10ms global

Cold Starts: O Problema

Serverless "dorme" quando não usado. Primeira request é lenta:

  • AWS Lambda (Node): ~200-500ms
  • Vercel Functions: ~100-300ms
  • Cloudflare Workers: ~0ms (não dorme)

Soluções

  1. Keep-alive pings (custo alto)
  2. Provisioned Concurrency (AWS)
  3. Edge Functions (Cloudflare)

Custos Reais

AWS Lambda

  • Free Tier: 1M requests/mês
  • Depois: $0.20 por 1M requests
  • Compute: $0.0000166667 por GB-segundo

Exemplo: 10M requests, 128MB, 100ms cada = $2 + $20 = $22/mês

Vercel Functions

  • Hobby: 100GB-hours grátis
  • Pro: $20/mês + $40 por 100GB-hours extras

Mais caro que Lambda para alto volume.

Cloudflare Workers

  • Free: 100k requests/dia
  • Paid: $5/mês por 10M requests

Mais barato para apps com tráfego alto.

Quando Usar Serverless?

✅ APIs com tráfego irregular
✅ Webhooks, background jobs
✅ Protótipos e MVPs
✅ Custos variáveis (não paga quando não usa)

❌ WebSockets persistentes
❌ Apps com conexões DB longas
❌ Processamento > 15min

Banco de Dados

Serverless + SQL tradicional = problema.

Cada função abre nova conexão. MySQL suporta ~150 conexões. Com 1000 funções simultâneas = crash.

Soluções

  1. Connection Pooling (PgBouncer, RDS Proxy)
  2. Serverless DBs (Planetscale, Neon, Supabase)
  3. HTTP-based DBs (Turso, Xata)
// Turso (HTTP SQLite)
import { createClient } from '@libsql/client';

const db = createClient({
  url: 'libsql://my-db.turso.io',
  authToken: process.env.DB_TOKEN
});

// Sem connection pooling necessário!
const users = await db.execute('SELECT * FROM users');

Frameworks Serverless

  • Serverless Framework - Multi-cloud
  • SST - AWS com DX moderno
  • Architect - Infraestrutura como código
# serverless.yml
service: my-api

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get

Conclusão: Serverless é ideal para APIs de baixo/médio tráfego. Para alto volume, considere containers (Fly.io, Railway).