Snowflake IDs: por que grandes APIs evitam UUIDs como identificadores públicos

Avatar de Bernardo Lobato

Plataformas como X, Discord e Instagram expõem identificadores numéricos longos, aparentemente aleatórios — mas que, na prática, seguem uma lógica muito bem definida.

Neste artigo, vamos entender:

  • Por que unicidade não é o único requisito de um ID
  • As limitações de IDs sequenciais e UUIDs em sistemas distribuídos
  • O que são Snowflake IDs e como eles funcionam
  • Por que grandes APIs adotam esse modelo
  • Quando essa estratégia faz sentido (e quando não faz)

Unicidade é só o requisito mínimo

Quando falamos em identificadores, quase todo mundo concorda em um ponto:

Um ID precisa ser único.

Mas em sistemas reais, distribuídos e em produção, isso está longe de ser suficiente.

Em APIs modernas, bons identificadores também precisam:

  • Ser gerados sem coordenação central
  • Funcionar bem com múltiplas instâncias
  • Não virar gargalo de performance
  • Permitir paralelismo
  • Não vazar informações sensíveis do negócio
  • Ajudar (e não atrapalhar) observabilidade e operação

Ou seja: unicidade é o requisito mínimo, não o objetivo final.


O problema dos sistemas distribuídos

Em arquiteturas distribuídas lidamos com:

  • Auto scaling
  • Múltiplos serviços
  • Concorrência real
  • Execução paralela
  • Múltiplas regiões
  • Infraestrutura dinâmica

Nesse cenário, deixar a geração de IDs:

  • centralizada no banco
  • dependente de sequência
  • ou altamente acoplada a um único ponto

é pedir para criar gargalos.

IDs sequenciais funcionam muito bem… até deixarem de funcionar.


UUIDs resolvem tudo? Mais ou menos

UUIDs (ou GUIDs) são extremamente populares — e com bons motivos.

Eles oferecem:

  • Unicidade global
  • Geração totalmente descentralizada
  • Suporte nativo em praticamente todas as linguagens
  • Facilidade para geração no frontend, backend ou offline

Isso os torna uma excelente escolha para:

  • Integrações externas
  • Sistemas sem controle rígido de infraestrutura
  • Sincronizações offline
  • Casos onde flexibilidade é mais importante que controle

Mas essa flexibilidade vem com um custo.

UUIDs:

  • Não carregam significado operacional
  • São ruins para ordenação temporal (especialmente V4)
  • Geram índices grandes (128 bits)
  • Podem degradar performance em tabelas massivas
  • Não ajudam na observabilidade

Em muitos casos, unicidade global não é tudo o que o negócio precisa.


Quando você quer mais controle que o UUID oferece

Agora imagine que você queira:

  • Saber quando um registro foi criado apenas olhando o ID
  • Garantir ordenação temporal forte
  • Evitar gargalo no banco
  • Melhorar eficiência de índices
  • Facilitar particionamento
  • Ter previsibilidade operacional

É nesse ponto que entra o Snowflake ID.


O que é um Snowflake ID?

Snowflake IDs são identificadores numéricos de 64 bits, criados originalmente pelo Twitter por volta de 2010 para identificar tweets em um sistema altamente distribuído.

A ideia central não é apenas gerar um ID único, mas controlar como ele é gerado.

A estrutura clássica do Snowflake é:

  • 1 bit: sempre zero (sinal)
  • 41 bits: timestamp (baseado em uma época customizada)
  • 10 bits: identificador do nó / instância
  • 12 bits: sequência local naquele nó

Isso permite:

  • Até 4.096 IDs por milissegundo por nó
  • Milhões de IDs por segundo em escala horizontal
  • Geração totalmente local, sem coordenação central

IDs que já nascem distribuídos

Uma característica fundamental do Snowflake é que:

👉 cada nó é responsável por gerar seus próprios IDs.

Isso elimina:

  • Locks globais
  • Dependência do banco
  • Gargalos de sequência
  • Contenção em ambientes paralelos

O banco deixa de ser o “gerador de IDs” e passa a ser apenas um consumidor deles.


IDs que contam uma história

Um efeito colateral (positivo) dessa estrutura é que os Snowflake IDs são temporalmente ordenáveis.

Isso significa que:

  • Você pode ordenar registros pelo ID
  • Extrair data e hora de criação
  • Identificar picos de tráfego
  • Analisar padrões operacionais

Tudo isso sem metadados adicionais.

O próprio ID já carrega essas informações.


Por que grandes APIs usam Snowflakes?

Agora fica mais fácil entender por que grandes plataformas adotam esse modelo.

Entre os principais benefícios:

  • Menor acoplamento ao banco de dados
  • Melhor eficiência de índices (64 bits)
  • Ordenação temporal natural
  • Excelente suporte a particionamento
  • Melhor observabilidade
  • Geração previsível e controlada

No Instagram, por exemplo, os bits que representariam o nó físico são usados para identificar shards lógicos.
No Discord, esses bits são divididos entre worker e processo.

Ou seja: o conceito é o mesmo, mas a implementação se adapta à infraestrutura.


Os custos e riscos dessa estratégia

Snowflake IDs não são uma bala de prata.

Eles exigem:

  • Configuração correta de infraestrutura
  • Garantia absoluta de unicidade do ID do nó
  • Disciplina arquitetural
  • Sincronização de relógio (clock drift)
  • Estratégia clara de deploy e autoscaling

Além disso:

  • Snowflake não é um padrão formal
  • Não existe uma RFC
  • Cada implementação é uma variação

Isso traz flexibilidade, mas também responsabilidade.

Outro ponto importante:
👉 Snowflakes vazam informação temporal.
Se isso for um problema para o seu negócio, essa estratégia pode não ser adequada.


Snowflake vs UUID: um resumo honesto

UUIDs

  • Simples
  • Amplamente suportados
  • Flexíveis
  • Ótimos para começar
  • Pouco controle
  • Pior performance em escala extrema

Snowflake IDs

  • Controle explícito
  • Excelente para sistemas distribuídos
  • Melhores índices
  • Ordenação temporal
  • Mais complexidade
  • Forte dependência da infraestrutura

Não existe “melhor ID universal”.
Existe o ID certo para o seu contexto.


Identificadores são decisão arquitetural

Talvez o ponto mais importante de todo esse artigo seja este:

A escolha do identificador não é detalhe de implementação.

Ela impacta:

  • Escalabilidade
  • Observabilidade
  • Performance
  • Segurança
  • Evolução do sistema

Escolher entre ID sequencial, UUID ou Snowflake é escolher como seu sistema cresce, opera e se mantém.

E isso é, por definição, uma decisão arquitetural.


Conclusão

Grandes APIs não escolhem Snowflake IDs por moda ou acaso.

Elas escolhem porque:

  • Precisam de controle
  • Precisam de escala
  • Precisam de previsibilidade
  • Precisam operar sistemas distribuídos reais

UUIDs continuam sendo excelentes ferramentas.
Snowflakes são ferramentas mais especializadas.

Saber quando usar cada uma é o que separa uma decisão técnica de uma decisão arquitetural.


Se quiser, no próximo artigo a gente pode explorar:

  • UUID V7 vs Snowflake
  • NanoID, KSUID, ULID
  • IDs naturais
  • Estratégias híbridas
  • Impacto direto em bancos relacionais

Se esse tema te fez repensar a forma como você cria IDs nas suas APIs, comenta lá no blog ou compartilha com o time.
Essa discussão vale muito a pena continuar.