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:
| Bits | Campo | Descrição |
|---|---|---|
| 1 | Bit de sinal | Sempre 0 (positivo) |
| 41 | Timestamp | Tempo em milissegundos desde uma época inicial definida |
| 10 | Machine ID | Identificador do nó ou datacenter |
| 12 | Sequence Number | Contador de IDs gerados no mesmo milissegundo |
Explicação dos Componentes:
- Bit de sinal (1 bit) → Sempre
0, garantindo que o número seja positivo. - 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.
- Machine ID (10 bits) → Permite identificar até
1024nós diferentes dentro de um sistema distribuído. - Sequence Number (12 bits) → Conta até
4096IDs 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?
-
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.
-
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.
-
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.
-
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-44665544 | 1462572163232153600 |
3e23a4b5-5e93-4c76-9fd1-3b5dc4f4 | 1462572163232153601 |
4e54a9c7-7b8d-11ec-90d6-0242ac12 | 1462572163232153602 |
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_INTEGERe o snowflake pode ultrapassar isso. O correto nesse caso é deixar o id comostring