Software · Arquitetura de Software

Stateful vs Stateless: Sessões, Escala Horizontal e Onde Guardar o Estado

A transição indispensável para arquiteturas elásticas: por que serviços de aplicação devem ser estritamente stateless, como gerenciar afinidade de sessão e onde persistir o estado distribuído.

Diagrama conceitual ilustrando stateful vs stateless: sessões, escala horizontal e onde guardar o estado
Neste artigo

A regra de ouro da computação em nuvem é simples: aplicações que escalam horizontalmente com facilidade tratam suas instâncias de computação como recursos descartáveis (cattle, not pets). Essa premissa exige que a camada de servidores seja Stateless (sem estado retido em memória local), permitindo que qualquer requisição seja atendida por qualquer nó da frota.

flowchart TD
  subgraph ArquiteturaStateful["Abordagem Antiga: Servidor Stateful com Sessão em Memória"]
    LB1["Load Balancer com Sticky Session (Afinidade)"]
    Srv1["Servidor 1 (Sessão do Usuário A na RAM)"]
    Srv2["Servidor 2 (Sessão do Usuário B na RAM)"]
    LB1 -- "Se Servidor 1 cair, Usuário A é deslogado!" --> Srv1
    LB1 --> Srv2
  end

  subgraph ArquiteturaStateless["Abordagem Moderna: Servidores Stateless + Cache Central"]
    LB2["Load Balancer Round-Robin / Sem Afinidade"]
    NodeA["Instância Pod A (Stateless)"]
    NodeB["Instância Pod B (Stateless)"]
    NodeC["Instância Pod C (Stateless)"]
    RedisStore[("Cluster Redis / Azure Cache<br/>Sessões Centralizadas")]

    LB2 --> NodeA
    LB2 --> NodeB
    LB2 --> NodeC
    NodeA <--> RedisStore
    NodeB <--> RedisStore
    NodeC <--> RedisStore
  end

As Dores do Modelo Stateful

No paradigma antigo, aplicações web armazenavam o carrinho de compras ou dados de autenticação diretamente na memória do processo (HttpSession no Java ou In-Proc Session no ASP.NET). Esse modelo traz três gargalos graves:

  1. Obrigatoriedade de Sticky Sessions: O balanceador de carga precisa inspecionar cookies e amarrar cada usuário ao mesmo servidor físico.
  2. Distribuição Desbalanceada: Se um usuário realiza operações pesadas em um nó, aquele servidor sofre saturação de CPU enquanto os demais ficam ociosos.
  3. Impossibilidade de Autoscale Elástico: Se a frota precisa encolher durante a noite, desligar uma máquina encerra abruptamente as sessões ativas de quem estava conectado nela.

Externalização de Estado em Camadas Dedicadas

Em uma arquitetura moderna sem estado local, o estado é segregado conforme sua volatilidade:

Tipo de Estado Onde Persistir Características de Latência
Credenciais de Identidade Tokens JWT assinados criptograficamente Validação local na CPU sem I/O de rede
Sessão Transitória e Carrinhos Cache Distribuído em Memória (Redis / Valkey) Latência sub-milissegundo (< 2ms)
Arquivos e Uploads de Usuários Armazenamento de Objetos (S3 / Azure Blob) Persistência elástica durável via streaming direto
Transações e Registros Definitivos Banco Relacional / NoSQL (PostgreSQL, Cosmos) Transacionalidade ACID e índices relacionais

Com essa separação rigorosa, subir dez novas réplicas de um container no Kubernetes durante um pico de tráfego leva poucos segundos e não afeta nenhuma sessão de usuário em andamento.

Explorar este tema no Grafo de Conhecimento