Header Ads Widget

El problema de generar identificadores únicos

Cuando estamos involucrados en el desarrollo de aplicaciones grandes, uno de los puntos requeridos es generar identificadores únicos.

Hay varias soluciones posibles, entre ellas utilizar UUIDs, identificadores generados en la base de datos o servicios que generan identificadores.

Cada solución tiene sus ventajas y desventajas, propias de su naturaleza, las cuales deben valorarse antes de emplearse.

Cuando la aplicación va a funcionar en un nodo único, generar identificadores únicos no es tan complicado.

La estrategia puede ser:

  1. Usar un identificador incremental.
  2. Usar una función en base a la hora del día.

Pero esas estrategias van a fallar en un entorno distribuido, que ya que se pueden crear identificadores duplicados.

En esos casos, la solución más común es utilizar identificadores únicos universales (UUIDs). Estos son números de 128 bits que pueden ser generados en una forma estándar a nivel de aplicación. Generalmente se pueden generar utilizando la dirección MAC o un hash MD5.

Los UUIDs tienen las siguientes ventajas:

  1. El universo de identificadores es muy grande, virtualmente no existirían colisiones.
  2. Los identificadores se pueden mantener únicos sin necesidad de sincronizar entre nodos distribuidos.
Pero tienen las siguientes desventajas:
  1. Ocupan espacio ya que son grandes (128 bits).
  2. Como son generados en diferentes nodos, no hay identificadores secuenciales.

La otra alternativa es generar identificadores únicos a nivel de base de datos en vez de generarlos a nivel de aplicación.

Muchas bases de datos proveen una característica autoincremental. De modo que un servidor de base de datos puede ser usado para generar identificadores únicos.

Este enfoque es conocido como el servicio de ticket y ha sido utilizado por Flickr.

Los beneficios de identificadores generados por base de datos son:

  1. El código de la aplicación se vuelve más simple.
  2. Los identificadores son secuenciales y con un tamaño corto.

Pero tienen los siguientes problemas:

  1. Hay un viaje adicional para obtener el identificador desde la base de datos.
  2. La base de datos llega a ser un origen de fallos.

El último problema puede reducirse utilizando servidores múltiples. Un servidor puede generar identificadores pares y otro los identificadores impares.

El algortimo "round robin" puede ser utilizado para balancear carga entre los servidores y tratar el problema con la no disponibilidad. Definitivamente en algún momento los identificadores generados se van a desviar.

La tercera opción es tener un servicio que genere identificadores. Es algo que se utiliza en Twitter, Discord e Instagram. La idea principal es generar los identificadores como una composición de campos múltiples.

La implementación original (64 bits) tenía los siguientes campos:

  1. Marca de tiempo de 41 bits.
  2. Identificador de 10 bits.
  3. Número de secuencia de 12 bits.
  4. 1 bit para uso futuro.

La marca de tiempo (hasta los milisegundos) puede funcionar por 70 años después de una fecha inicial.

El identificador puede definir el datacenter y el identificador del equipo. Es asignado por un servicio de coordinación. 

El número de secuencia soporta hasta 4096 identificadores únicos por milisegundo.

Esta forma de generar identificadores tiene muchas ventajas:

Es disponible, desde que puede estar implementado por 1024 computadoras.

Es escalable, desde que cada máquina puede generar 4096 identificadores por milisegundo.

Los identificadores se pueden ordenar por el fecha y hora, ya que los bits de mayor orden son la marca de tiempo.




Publicar un comentario

0 Comentarios