Skip to main content

Snowflake ID | Arquitetura

  • Snowflake ID | Arquitetura

O Snowflake ID é um sistema de geração de identificadores únicos distribuídos, criado pelo Twitter e amplamente utilizado em sistemas distribuídos e bancos de dados para evitar colisões e garantir a ordenação temporal.

Como funciona o Snowflake ID?

Um Snowflake ID é um número inteiro de 64 bits estruturado da seguinte forma:

BitsCampoDescrição
1Bit de sinalSempre 0 (positivo)
41TimestampTempo em milissegundos desde uma época inicial definida
10Machine IDIdentificador do nó ou datacenter
12Sequence NumberContador de IDs gerados no mesmo milissegundo

Explicação dos Componentes:

  1. Bit de sinal (1 bit) → Sempre 0, garantindo que o número seja positivo.
  2. Timestamp (41 bits) → Representa o tempo desde uma data de referência (exemplo: 1º de janeiro de 2020). Isso permite cerca de 69 anos de IDs únicos.
  3. Machine ID (10 bits) → Permite identificar até 1024 nós diferentes dentro de um sistema distribuído.
  4. Sequence Number (12 bits) → Conta até 4096 IDs gerados no mesmo milissegundo dentro de uma única máquina.

Por que usar o Snowflake ID?

Escalabilidade: Pode ser gerado de forma distribuída sem risco de colisões.
Ordenação temporal: IDs são gerados em ordem crescente.
Alto desempenho: Não precisa de um banco de dados centralizado para rastrear IDs.
Evita UUIDs longos: Menos espaço de armazenamento comparado a um UUID.

Exemplo de um Snowflake ID:

1462572163232153600

Convertendo para binário, ele conteria os componentes conforme o formato descrito.

Ordenação

Sim! O Snowflake ID facilita a ordenação porque ele é baseado em um timestamp. Como os bits mais significativos representam o tempo em milissegundos, os IDs são gerados em ordem crescente, tornando a ordenação muito mais eficiente.

Como isso melhora a ordenação?

  1. Ordenação natural

    • Como os IDs são gerados sequencialmente com base no tempo, você pode simplesmente ordenar por ID sem precisar de um índice extra no banco de dados.
  2. Menos sobrecarga para consultas

    • Em bancos como MySQL, PostgreSQL ou MongoDB, usar UUIDs tradicionais pode dificultar a ordenação, pois eles não seguem um padrão crescente.
    • Com Snowflake ID, os dados são sempre adicionados de forma sequencial, o que melhora a performance de indexação e busca.
  3. Eficiência em bancos de dados NoSQL

    • Em sistemas como Elasticsearch, Cassandra e DynamoDB, onde a ordenação pode ser custosa, o Snowflake ID mantém os registros bem organizados, reduzindo a fragmentação.
  4. Melhor uso de índices B-Tree

    • Bancos relacionais geralmente usam B-Tree para indexação. Um UUID aleatório pode fragmentar o índice, enquanto um Snowflake ID mantém os dados organizados.

Exemplo prático:

Imagina que você tem IDs tradicionais versus Snowflake IDs:

UUID (aleatório)Snowflake ID (ordenado)
550e8400-e29b-41d4-a716-446655441462572163232153600
3e23a4b5-5e93-4c76-9fd1-3b5dc4f41462572163232153601
4e54a9c7-7b8d-11ec-90d6-0242ac121462572163232153602

Com UUIDs aleatórios, a ordenação é lenta e o banco de dados precisa processar mais para organizar os registros.
Com Snowflake IDs, a ordenação já está embutida no ID, tornando as consultas e indexação muito mais rápidas.

Conclusão

Se você precisa de alta escalabilidade e performance, Snowflake ID é uma excelente alternativa a UUIDs ou autoincrement no banco de dados. 🚀

Dicas

  • No javascript o limite do integer é encontrado por essa variável Number.MAX_SAFE_INTEGER e o snowflake pode ultrapassar isso. O correto nesse caso é deixar o id como string