🛠️

Whiz Tools

Build • Create • Innovate

Generador de IDs de Snowflake para sistemas distribuidos

Genera y analiza IDs de Snowflake de Twitter, identificadores únicos de 64 bits utilizados en sistemas distribuidos. Esta herramienta te permite crear nuevos IDs de Snowflake y analizar los existentes, proporcionando información sobre sus componentes de marca de tiempo, ID de máquina y número de secuencia.

Generador de ID de Snowflake

Generador de ID de Snowflake

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

Documentación

Generador de ID de Snowflake

Introducción

Un ID de Snowflake es un identificador único utilizado en sistemas distribuidos, desarrollado originalmente por Twitter. Esta herramienta permite generar y analizar IDs de Snowflake, que son enteros de 64 bits compuestos por una marca de tiempo, ID de máquina y número de secuencia.

Cómo funcionan los IDs de Snowflake

Los IDs de Snowflake son enteros de 64 bits estructurados de la siguiente manera:

  • 41 bits: Marca de tiempo (milisegundos desde una época personalizada)
  • 10 bits: ID de máquina (5 bits para ID de centro de datos, 5 bits para ID de trabajador)
  • 12 bits: Número de secuencia

Esta estructura permite la generación de aproximadamente 4,096 IDs únicos por milisegundo por máquina.

Uso del Generador de ID de Snowflake

  1. (Opcional) Establecer una época personalizada (el valor predeterminado es la época de Twitter: 2010-11-04T01:42:54.657Z)
  2. Ingrese un ID de máquina (0-31) y un ID de centro de datos (0-31)
  3. Haga clic en "Generar" para crear un nuevo ID de Snowflake
  4. El ID generado y sus componentes se mostrarán

Para analizar un ID de Snowflake existente, ingréselo en el campo "Analizar ID" y haga clic en "Analizar".

Fórmula

El ID de Snowflake se construye utilizando operaciones a nivel de bits:

1ID = (marcaDeTiempo << 22) | (idCentroDeDatos << 17) | (idTrabajador << 12) | secuencia
2

Donde:

  • marcaDeTiempo es el número de milisegundos desde la época
  • idCentroDeDatos es un entero de 5 bits (0-31)
  • idTrabajador es un entero de 5 bits (0-31)
  • secuencia es un entero de 12 bits (0-4095)

Cálculo

El generador de ID de Snowflake realiza los siguientes pasos:

  1. Obtener la marca de tiempo actual en milisegundos
  2. Asegurarse de que la marca de tiempo sea mayor que la última marca de tiempo utilizada (para la unicidad)
  3. Si la marca de tiempo es la misma que la anterior, incrementar el número de secuencia
  4. Si el número de secuencia se desborda (llega a 4096), esperar al siguiente milisegundo
  5. Combinar los componentes usando operaciones a nivel de bits para crear el ID final

Casos de uso

Los IDs de Snowflake son particularmente útiles en:

  1. Sistemas distribuidos: Generar IDs únicos en múltiples máquinas sin coordinación
  2. Datos de alto volumen: Crear IDs ordenables para grandes conjuntos de datos
  3. Microservicios: Asegurar identificadores únicos entre diferentes servicios
  4. Fragmentación de bases de datos: Usar el componente de marca de tiempo o ID de máquina para una fragmentación eficiente

Alternativas

Si bien los IDs de Snowflake son potentes, otros sistemas de generación de ID incluyen:

  1. UUID (Identificador Único Universal): Útil cuando se necesita generación distribuida sin ordenabilidad
  2. IDs de base de datos auto-incrementales: Simples pero limitados a instancias de base de datos únicas
  3. ULID (Identificador Universal Único Lexicográficamente Ordenable): Similar a Snowflake, pero con una estructura diferente

Casos extremos y limitaciones

  1. Sincronización del reloj: Los IDs de Snowflake dependen del tiempo del sistema. Si el reloj retrocede debido a ajustes de NTP o cambios de horario de verano, puede causar problemas con la generación de ID.

  2. Problema del año 2038: La marca de tiempo de 41 bits se desbordará en 2079 (suponiendo la época de Twitter). Los sistemas que usan IDs de Snowflake deben planificar para esta eventualidad.

  3. Colisiones de ID de máquina: En sistemas distribuidos grandes, garantizar IDs de máquina únicos puede ser un desafío y puede requerir coordinación adicional.

  4. Desbordamiento de secuencia: En escenarios de rendimiento extremadamente alto, es posible agotar las 4096 secuencias por milisegundo, lo que potencialmente causaría retrasos.

  5. No monotonía entre máquinas: Si bien los IDs son monotonamente crecientes en una sola máquina, pueden no ser estrictamente monótonos entre múltiples máquinas.

Historia

Los IDs de Snowflake fueron introducidos por Twitter en 2010 para abordar la necesidad de identificadores únicos distribuidos y ordenables por tiempo. Desde entonces, han sido adoptados y adaptados por muchas otras empresas y proyectos.

Ejemplos

Aquí hay implementaciones de generadores de ID de Snowflake en varios lenguajes:

1class GeneradorDeSnowflake {
2  constructor(epoch = 1288834974657, bitsIdCentroDatos = 5, bitsIdTrabajador = 5, bitsSecuencia = 12) {
3    this.epoch = BigInt(epoch);
4    this.bitsIdCentroDatos = bitsIdCentroDatos;
5    this.bitsIdTrabajador = bitsIdTrabajador;
6    this.bitsSecuencia = bitsSecuencia;
7    this.maxIdCentroDatos = -1n ^ (-1n << BigInt(bitsIdCentroDatos));
8    this.maxIdTrabajador = -1n ^ (-1n << BigInt(bitsIdTrabajador));
9    this.mascaraSecuencia = -1n ^ (-1n << BigInt(bitsSecuencia));
10    this.desplazamientoIdTrabajador = BigInt(bitsSecuencia);
11    this.desplazamientoIdCentroDatos = BigInt(bitsSecuencia + bitsIdTrabajador);
12    this.desplazamientoMarcaDeTiempo = BigInt(bitsSecuencia + bitsIdTrabajador + bitsIdCentroDatos);
13    this.secuencia = 0n;
14    this.ultimaMarcaDeTiempo = -1n;
15  }
16
17  siguienteId(idCentroDatos, idTrabajador) {
18    let marcaDeTiempo = this.marcaDeTiempoActual();
19
20    if (marcaDeTiempo < this.ultimaMarcaDeTiempo) {
21      throw new Error('El reloj se ha movido hacia atrás. Rechazando generar id');
22    }
23
24    if (marcaDeTiempo === this.ultimaMarcaDeTiempo) {
25      this.secuencia = (this.secuencia + 1n) & this.mascaraSecuencia;
26      if (this.secuencia === 0n) {
27        marcaDeTiempo = this.hastaSiguienteMilisegundo(this.ultimaMarcaDeTiempo);
28      }
29    } else {
30      this.secuencia = 0n;
31    }
32
33    this.ultimaMarcaDeTiempo = marcaDeTiempo;
34
35    return ((marcaDeTiempo - this.epoch) << this.desplazamientoMarcaDeTiempo) |
36           (BigInt(idCentroDatos) << this.desplazamientoIdCentroDatos) |
37           (BigInt(idTrabajador) << this.desplazamientoIdTrabajador) |
38           this.secuencia;
39  }
40
41  hastaSiguienteMilisegundo(ultimaMarcaDeTiempo) {
42    let marcaDeTiempo = this.marcaDeTiempoActual();
43    while (marcaDeTiempo <= ultimaMarcaDeTiempo) {
44      marcaDeTiempo = this.marcaDeTiempoActual();
45    }
46    return marcaDeTiempo;
47  }
48
49  marcaDeTiempoActual() {
50    return BigInt(Date.now());
51  }
52}
53
54// Uso
55const generador = new GeneradorDeSnowflake();
56const id = generador.siguienteId(1, 1);
57console.log(`ID de Snowflake generado: ${id}`);
58

Diagrama

Aquí hay una representación visual de la estructura del ID de Snowflake:

Marca de tiempo (41 bits) ID de máquina (10 bits) Secuencia (12 bits)

Estructura del ID de Snowflake de 64 bits

Referencias

  1. "Anunciando Snowflake." Blog de Ingeniería de Twitter, https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake
  2. "ID de Snowflake." Wikipedia, https://es.wikipedia.org/wiki/Snowflake_ID
  3. "Generación de ID distribuido en microservicios." Medium, https://medium.com/swlh/distributed-id-generation-in-microservices-b6ce9a8dd93f