Gerador de IDs Snowflake para Sistemas Distribuídos

Gere e analise IDs Snowflake do Twitter, identificadores únicos de 64 bits usados em sistemas distribuídos. Esta ferramenta permite que você crie novos IDs Snowflake e analise os existentes, fornecendo insights sobre seus componentes de timestamp, ID da máquina e número de sequência.

Gerador de ID Snowflake

Gerador de ID Snowflake

Optional: Unix timestamp in milliseconds (defaults to current time)
📚

Documentação

Gerador de ID Snowflake

Introdução

Um ID Snowflake é um identificador único usado em sistemas distribuídos, originalmente desenvolvido pelo Twitter. Esta ferramenta permite que você gere e analise IDs Snowflake, que são inteiros de 64 bits compostos por um timestamp, ID da máquina e número de sequência.

Como os IDs Snowflake Funcionam

Os IDs Snowflake são inteiros de 64 bits estruturados da seguinte forma:

  • 41 bits: Timestamp (milissegundos desde uma época personalizada)
  • 10 bits: ID da máquina (5 bits para ID do data center, 5 bits para ID do trabalhador)
  • 12 bits: Número de sequência

Essa estrutura permite a geração de aproximadamente 4.096 IDs únicos por milissegundo por máquina.

Usando o Gerador de ID Snowflake

  1. (Opcional) Defina uma época personalizada (o padrão é a época do Twitter: 2010-11-04T01:42:54.657Z)
  2. Insira um ID de máquina (0-31) e um ID de data center (0-31)
  3. Clique em "Gerar" para criar um novo ID Snowflake
  4. O ID gerado e seus componentes serão exibidos

Para analisar um ID Snowflake existente, insira-o no campo "Analisar ID" e clique em "Analisar".

Fórmula

O ID Snowflake é construído usando operações bitwise:

1ID = (timestamp << 22) | (datacenterId << 17) | (workerId << 12) | sequence
2

Onde:

  • timestamp é o número de milissegundos desde a época
  • datacenterId é um inteiro de 5 bits (0-31)
  • workerId é um inteiro de 5 bits (0-31)
  • sequence é um inteiro de 12 bits (0-4095)

Cálculo

O gerador de ID Snowflake realiza os seguintes passos:

  1. Obter o timestamp atual em milissegundos
  2. Garantir que o timestamp seja maior que o último timestamp usado (para unicidade)
  3. Se o timestamp for o mesmo que o último, incrementar o número de sequência
  4. Se o número de sequência transbordar (atingir 4096), aguardar o próximo milissegundo
  5. Combinar os componentes usando operações bitwise para criar o ID final

Casos de Uso

Os IDs Snowflake são particularmente úteis em:

  1. Sistemas Distribuídos: Gerar IDs únicos em várias máquinas sem coordenação
  2. Dados de Alto Volume: Criar IDs ordenáveis para grandes conjuntos de dados
  3. Microserviços: Garantir identificadores únicos em diferentes serviços
  4. Particionamento de Banco de Dados: Usar o componente de timestamp ou ID da máquina para particionamento eficiente

Alternativas

Embora os IDs Snowflake sejam poderosos, outros sistemas de geração de ID incluem:

  1. UUID (Identificador Único Universal): Útil quando a geração distribuída é necessária sem ordenação
  2. IDs de banco de dados autoincrementais: Simples, mas limitados a instâncias de banco de dados únicas
  3. ULID (Identificador Universamente Único Lexicograficamente Ordenável): Semelhante ao Snowflake, mas com uma estrutura diferente

Casos Limites e Limitações

  1. Sincronização de Relógio: Os IDs Snowflake dependem do tempo do sistema. Se o relógio retroceder devido a ajustes de NTP ou mudanças de horário de verão, isso pode causar problemas na geração de ID.

  2. Problema do Ano 2038: O timestamp de 41 bits transbordará em 2079 (assumindo a época do Twitter). Sistemas que usam IDs Snowflake devem planejar para essa eventualidade.

  3. Colisões de ID de Máquina: Em grandes sistemas distribuídos, garantir IDs de máquina únicos pode ser desafiador e pode exigir coordenação adicional.

  4. Transbordo de Sequência: Em cenários de alta vazão, é possível esgotar as 4096 sequências por milissegundo, potencialmente causando atrasos.

  5. Não Monotonicidade Entre Máquinas: Embora os IDs sejam monotonamente crescentes em uma única máquina, eles podem não ser estritamente monotônicos entre várias máquinas.

História

Os IDs Snowflake foram introduzidos pelo Twitter em 2010 para atender à necessidade de identificadores únicos distribuídos e ordenáveis no tempo. Desde então, foram adotados e adaptados por muitas outras empresas e projetos.

Exemplos

Aqui estão implementações de geradores de ID Snowflake em várias linguagens:

1class SnowflakeGenerator {
2  constructor(epoch = 1288834974657, datacenterIdBits = 5, workerIdBits = 5, sequenceBits = 12) {
3    this.epoch = BigInt(epoch);
4    this.datacenterIdBits = datacenterIdBits;
5    this.workerIdBits = workerIdBits;
6    this.sequenceBits = sequenceBits;
7    this.maxDatacenterId = -1n ^ (-1n << BigInt(datacenterIdBits));
8    this.maxWorkerId = -1n ^ (-1n << BigInt(workerIdBits));
9    this.sequenceMask = -1n ^ (-1n << BigInt(sequenceBits));
10    this.workerIdShift = BigInt(sequenceBits);
11    this.datacenterIdShift = BigInt(sequenceBits + workerIdBits);
12    this.timestampLeftShift = BigInt(sequenceBits + workerIdBits + datacenterIdBits);
13    this.sequence = 0n;
14    this.lastTimestamp = -1n;
15  }
16
17  nextId(datacenterId, workerId) {
18    let timestamp = this.currentTimestamp();
19
20    if (timestamp < this.lastTimestamp) {
21      throw new Error('O relógio retrocedeu. Recusando-se a gerar id');
22    }
23
24    if (timestamp === this.lastTimestamp) {
25      this.sequence = (this.sequence + 1n) & this.sequenceMask;
26      if (this.sequence === 0n) {
27        timestamp = this.tilNextMillis(this.lastTimestamp);
28      }
29    } else {
30      this.sequence = 0n;
31    }
32
33    this.lastTimestamp = timestamp;
34
35    return ((timestamp - this.epoch) << this.timestampLeftShift) |
36           (BigInt(datacenterId) << this.datacenterIdShift) |
37           (BigInt(workerId) << this.workerIdShift) |
38           this.sequence;
39  }
40
41  tilNextMillis(lastTimestamp) {
42    let timestamp = this.currentTimestamp();
43    while (timestamp <= lastTimestamp) {
44      timestamp = this.currentTimestamp();
45    }
46    return timestamp;
47  }
48
49  currentTimestamp() {
50    return BigInt(Date.now());
51  }
52}
53
54// Uso
55const generator = new SnowflakeGenerator();
56const id = generator.nextId(1, 1);
57console.log(`ID Snowflake gerado: ${id}`);
58

Diagrama

Aqui está uma representação visual da estrutura do ID Snowflake:

Timestamp (41 bits) ID da Máquina (10 bits) Sequência (12 bits)

Estrutura do ID Snowflake de 64 bits

Referências

  1. "Anunciando Snowflake." Blog de Engenharia do Twitter, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "ID Snowflake." Wikipedia, https://en.wikipedia.org/wiki/Snowflake_ID
  3. "Geração de ID Distribuída em Microserviços." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f