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
- Keep-alive pings (custo alto)
- Provisioned Concurrency (AWS)
- 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
- Connection Pooling (PgBouncer, RDS Proxy)
- Serverless DBs (Planetscale, Neon, Supabase)
- 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).