Uma função serverless é uma unidade única de deploy de lógica de backend; um microsserviço é um serviço inteiro operado de forma independente. Essa única frase é a comparação inteira em miniatura — todo o resto (carga de ops, curvas de custo, cold starts, estado) decorre do que é a unidade de deploy: uma função que você entrega a uma plataforma, ou um serviço que você mesmo opera.
Principais pontos
| Pergunta | Resposta |
|---|---|
| A diferença central | Unidade de deploy: uma operação (função) vs. uma capacidade própria (serviço) |
| Quem opera | Funções: a plataforma. Microsserviços: o seu time, por serviço |
| Custo ocioso | Funções escalam a zero; uma frota de serviços fatura o dia inteiro |
| O imposto das funções | Cold starts, limites de tempo de execução, ausência de estado |
| O imposto dos serviços | Pipelines, orquestração, monitoramento, plantão — multiplicados por serviço |
A unidade de deploy, em código
Este é o deployable inteiro de uma operação de checkout — uma função, sem repositório por serviço, sem imagem de contêiner, sem pipeline:
// JavaScript / Node.js — the function is the whole deployable
// cloud/main.js — runs on the platform; there is no service to operate
Parse.Cloud.define('checkout', async (request) => {
const cart = await new Parse.Query('Cart').get(request.params.cartId, {
sessionToken: request.user.getSessionToken(),
});
// …price the cart, reserve stock, write the order…
return { orderId: cart.id, status: 'confirmed' };
});
// Any client calls it by name — no gateway, container, or pipeline
const result = await Parse.Cloud.run('checkout', { cartId }); // Flutter / Dart — Back4app Flutter SDK
// Calling the function: one named endpoint, no service discovery
final checkout = ParseCloudFunction('checkout');
final response = await checkout.execute(
parameters: {'cartId': cartId},
);
if (response.success) {
print(response.result['status']); // confirmed
} else {
print(response.error?.message);
} // iOS / Swift — Back4app Swift SDK
// Calling the function: one named endpoint, no service discovery
struct Checkout: ParseCloudable {
typealias ReturnType = [String: String]
var functionName: String = "checkout"
var cartId: String
}
let result = try await Checkout(cartId: cartId).runFunction()
print(result["status"] ?? "") // confirmed // Android / Kotlin — Back4app Android SDK
// Calling the function: one named endpoint, no service discovery
val params = hashMapOf("cartId" to cartId)
ParseCloud.callFunctionInBackground<Map<String, String>>(
"checkout", params
) { result, e ->
if (e == null) {
Log.i("Checkout", result["status"] ?: "")
} else {
Log.w("Checkout", "failed: ${e.code}")
}
} O equivalente em microsserviço desse snippet é um repositório: um servidor HTTP, um build de contêiner, manifestos de deploy, service discovery, health checks, um dashboard e uma escala de plantão — antes da primeira linha de lógica de checkout.
Funções serverless vs. microsserviços customizados
| Dimensão | Funções serverless | Microsserviços customizados |
|---|---|---|
| Unidade de deploy | Uma função | Um serviço (processo + API + dados) |
| Infraestrutura que você opera | Nenhuma — gerenciada pela plataforma | Contêineres, orquestração e rede por serviço |
| Escala | Automática, por invocação, até zero | Você configura; a capacidade roda mesmo ociosa |
| Estado | Stateless por contrato; o estado vive no banco de dados | Pode manter estado em memória (a um preço) |
| Perfil de latência | Chamadas warm são rápidas; instâncias ociosas pagam cold start | Consistente — o processo está sempre de pé |
| Runtime | Fornecido pela plataforma (tipicamente um runtime JavaScript gerenciado) | Qualquer coisa que você consiga conteinerizar |
| Trabalho de longa duração | Cortado pelos limites de tempo de execução | Ilimitado |
| Formato do time | Só engenheiros de produto | Exige capacidade de plataforma/DevOps |
| Curva de custo | Por execução; imbatível com picos, cruza em carga sustentada | Fixa; eficiente em volume alto e constante |
A literatura de microsserviços é explícita: os benefícios da arquitetura se compram com maturidade operacional séria — deploy automatizado, monitoramento sofisticado, design para falha. Funções terceirizam exatamente essa conta para a plataforma, e é por isso que a análise de serverless de Mike Roberts enquadra FaaS como a troca de controle por radicalmente menos ops. Nenhuma das trocas é gratuita; a pergunta é qual imposto o seu time consegue pagar.
O que realmente acontece com uma request
Repare no que a metade de baixo adiciona e a de cima não consegue expressar: chamadas serviço a serviço, bancos de dados por serviço e um gateway — a superfície de coordenação onde a complexidade dos microsserviços realmente mora. Transações distribuídas, retries e falhas parciais entre os serviços de carrinho e de pedidos são código seu; no modelo de funções, o mesmo workflow costuma ser uma função e um banco, e as peças orientadas a eventos (triggers, jobs agendados) penduram na plataforma, e não em filas que você opera.
Quando funções substituem uma frota de microsserviços — e quando não conseguem
A observação honesta por trás do padrão BaaS: a maioria dos microsserviços de um produto típico é fina. Eles validam entrada, aplicam uma regra, leem ou escrevem num banco e chamam um vizinho — a casca operacional em volta dessa lógica é 90% do peso. Funções de nuvem dentro de um BaaS deletam a casca: o banco de dados, a autenticação, o armazenamento de arquivos e as APIs são serviços da plataforma, então cada “serviço” colapsa num punhado de funções e triggers. Times de uma a dez pessoas entregando produtos CRUD-mais-lógica raramente precisam de mais.
O teto é igualmente honesto. Funções não conseguem hospedar um modelo de recomendação que precisa de hardware especializado, um transcodificador de vídeo que roda por uma hora, um motor de fan-out de WebSocket com tuning customizado, nem um componente cujo throughput sustentado torna o preço por invocação a opção cara. Quando um componente cruza essas linhas, extraia-o como um serviço de verdade e deixe-o interoperar com as funções — extrair um hot spot comprovado é uma migração muito mais barata do que decompor uma frota especulativa construída cedo demais, a mesma lição que o argumento monolith-first ensina um nível acima.
Casos de uso comuns
- Funções: backends de API e mobile. Lógica em formato de request sobre um banco gerenciado — o caso dominante, e o que as plataformas BaaS empacotam de ponta a ponta.
- Funções: triggers e cola. Validar no save, redimensionar no upload, sincronizar com uma API de terceiros, rodar jobs noturnos — reações curtas que fariam um serviço dedicado passar vergonha.
- Funções: tráfego com picos ou desconhecido. Lançamentos, campanhas, MVPs — escalar a zero absorve tanto o pico quanto o silêncio.
- Microsserviços: componentes pesados e constantes. Busca, feeds, motores de precificação — carga estável em que capacidade sempre ativa é mais barata e ajustável.
- Microsserviços: runtimes especiais. Linguagens fora do padrão, dependências nativas, GPUs, processos de longa duração.
- O híbrido. Funções para a superfície de API e os eventos; um ou dois serviços extraídos para os componentes cujos números exigem.
Você deveria construir funções ou microsserviços? Matriz de decisão
| Sua situação | Tendência |
|---|---|
| Time pequeno, lógica do produto é majoritariamente CRUD + regras | Funções em um BaaS — a frota adiciona custo, não capacidade |
| Tráfego com picos, baixo ou imprevisível | Funções — escalar a zero é o argumento inteiro |
| Um componente roda de minutos a horas por job | Microsserviço (ou um sistema de background jobs) — os timeouts descartam funções |
| Throughput alto e sustentado num caminho quente | Microsserviço — a capacidade de preço fixo vence a curva de custo |
| Orçamento rígido de latência de cauda em toda request | Microsserviço — sem variância de cold start |
| Runtime customizado, dependências nativas, hardware especial | Microsserviço — plataformas rodam o que rodam |
| Você não tem capacidade de ops dedicada | Funções — o imposto da frota chega tendo você orçado ou não |
| Um hot spot dentro de um produto em formato de funções | Híbrido — extraia esse único serviço, mantenha o resto como funções |
Limitações e trade-offs
- Funções: limites de execução são paredes duras. Trabalho longo precisa migrar para sistemas de jobs ou serviços — nenhuma esperteza estende um timeout com elegância.
- Funções: cold starts e cadeias. Raros por invocação, mas arquiteturas de função-chama-função os empilham; mantenha os caminhos quentes rasos.
- Funções: acoplamento à plataforma. O runtime e suas APIs são da plataforma — uma fundação open-source que você pode auto-hospedar é a proteção prática contra o lock-in.
- Microsserviços: a conta de ops é por serviço. Pipelines, monitoramento, contratos versionados e plantão se multiplicam com a frota; subestimar isso é o modo clássico de falha.
- Microsserviços: os problemas de sistemas distribuídos chegam no primeiro dia. Partições de rede, falhas parciais e consistência entre serviços são constantes arquiteturais, não casos de borda.
- Ambos: o estado é externalizado de qualquer jeito. Funções obrigam; serviços bem operados escolhem. É o banco de dados, não a computação, que acaba guardando a verdade nos dois designs.
Funções serverless e microsserviços no Back4app
O Back4app é uma plataforma open-source de Backend as a Service (BaaS) que combina banco de dados gerenciado, APIs REST e GraphQL geradas automaticamente, autenticação, armazenamento de arquivos e funções serverless com Cloud Code. É o lado das funções desta comparação entregue por inteiro: o Cloud Code roda funções nomeadas como a checkout acima, além de triggers de banco de dados e jobs agendados, ao lado de tudo o que uma frota de microsserviços existe para prover — então a frota que a maioria dos produtos teria construído vira funções sobre serviços gerenciados. E como a fundação é open source e você pode auto-hospedar, o caminho de extração continua aberto: quando um componente supera o modelo de funções, ele pode se graduar em um serviço dedicado sem abandonar a plataforma ao redor.
Perguntas frequentes
Uma função serverless é um microsserviço?
Não exatamente — a granularidade difere em uma ordem de magnitude. Um microsserviço é dono de uma capacidade de negócio: seu próprio processo, banco de dados, pipeline de deploy e superfície de API. Uma função é dona de uma operação. Um único microsserviço tipicamente se decompõe em várias funções, e é a plataforma, não o seu time, que fornece o processo, a escala e o runtime ao redor de cada uma.
Funções serverless podem substituir microsserviços?
Para muitos produtos, sim — especialmente quando os serviços fariam pouco mais que envolver um banco de dados com validação e um workflow leve. Funções em um BaaS herdam o banco, a autenticação e as APIs, sobrando só a lógica de negócio genuína para escrever. As exceções são reais: trabalho de longa duração, runtimes customizados, throughput pesado e sustentado e pisos rígidos de latência ainda favorecem um serviço operado por você.
O que sai mais barato: funções ou microsserviços?
Em volume baixo ou com picos, funções — você paga por execução e o custo ocioso é zero, enquanto uma frota de microsserviços fatura contêineres o dia inteiro, mais o tempo de engenharia para operá-los. Em volume pesado e sustentado, as curvas se cruzam: capacidade sempre ativa fica mais barata por request. Inclua o salário de ops na comparação; ele costuma dominar a linha de infraestrutura.
Cold starts tornam as funções mais lentas que os microsserviços?
Só na fração de invocações que cai numa instância ociosa — tipicamente de milissegundos a cerca de um segundo, contra a latência consistente de um serviço sempre warm. Tráfego constante mantém as instâncias das funções warm, e funções encadeadas são o caso a vigiar, já que cada salto pode adicionar seu próprio cold start. Para orçamentos rígidos de latência de cauda, um serviço sempre ativo ainda vence.
Quando microsserviços customizados claramente vencem?
Trabalho longo ou stateful que ultrapassa os timeouts das funções, runtimes customizados ou dependências de sistema que a plataforma não oferece, hardware especializado, throughput alto e sustentado em que capacidade sempre ativa sai mais barata e times que precisam de controle total da rede e da topologia de deploy. Se vários desses pontos valem para um componente, esse componente quer ser um serviço.
Funções serverless podem manter estado?
Não entre invocações — cada chamada de função parte do zero, e qualquer coisa que valha a pena guardar precisa viver no banco de dados ou num cache. Microsserviços podem manter estado em memória, ao preço de dificultar a escala e o failover. Na prática, as duas arquiteturas convergem para a mesma disciplina: externalize o estado, trate a computação como descartável.
Dá para combinar funções e microsserviços?
Sim, e sistemas maduros normalmente combinam. A divisão pragmática: funções cuidam da lógica de API request/response, dos triggers de banco de dados, dos jobs agendados e da cola entre eventos; serviços dedicados cuidam dos poucos componentes com carga pesada e constante ou com necessidades especiais de runtime. Começar com funções e extrair um serviço quando os números exigirem é mais barato que a migração inversa.