Bien, esta es una pregunta muy antigua, que ahora veo por primera vez.
Deberá diferenciar entre números de secuencia e ID únicos que (opcionalmente) se pueden ordenar libremente por un criterio específico (generalmente tiempo de generación). Los números de secuencia verdaderos implican el conocimiento de lo que han hecho todos los demás trabajadores y, como tales, requieren un estado compartido. No hay una manera fácil de hacer esto de una manera distribuida y a gran escala. Puede buscar en cosas como transmisiones de red, rangos en ventanas para cada trabajador y tablas hash distribuidas para identificaciones de trabajador únicas , pero es mucho trabajo.
Los ID únicos son otra cuestión, hay varias buenas formas de generar ID únicos de manera descentralizada:
a) Puede utilizar el servicio de red Snowflake ID de Twitter . El copo de nieve es un:
- Servicio en red, es decir, realiza una llamada de red para obtener una identificación única;
- que produce ID únicos de 64 bits que están ordenados por tiempo de generación;
- y el servicio es altamente escalable y (potencialmente) altamente disponible; cada instancia puede generar miles de ID por segundo y puede ejecutar varias instancias en su LAN / WAN;
- escrito en Scala, se ejecuta en la JVM.
b) Puede generar los ID únicos en los propios clientes, utilizando un enfoque derivado de cómo se crean los UUID y los ID de Snowflake. Hay varias opciones, pero algo parecido a:
Los 40 bits más significativos: una marca de tiempo; el tiempo de generación del ID. (Estamos usando los bits más significativos para la marca de tiempo para que los ID se puedan ordenar por tiempo de generación).
Los siguientes 14 bits o más: un contador por generador, que cada generador incrementa en uno por cada nuevo ID generado. Esto asegura que los ID generados en el mismo momento (mismas marcas de tiempo) no se superpongan.
Los últimos 10 bits más o menos: un valor único para cada generador. Usando esto, no necesitamos hacer ninguna sincronización entre generadores (lo cual es extremadamente difícil), ya que todos los generadores producen ID que no se superponen debido a este valor.
c) Puede generar los ID en los clientes, utilizando solo una marca de tiempo y un valor aleatorio. Esto evita la necesidad de conocer todos los generadores y asignar a cada generador un valor único. Por otro lado, no se garantiza que tales identificaciones sean únicas a nivel mundial, solo es muy probable que sean únicas. (Para colisionar, uno o más generadores tendrían que crear el mismo valor aleatorio exactamente al mismo tiempo). Algo como:
- Los 32 bits más significativos: Timestamp, el tiempo de generación del ID.
- Los 32 bits menos significativos: 32 bits de aleatoriedad, generados de nuevo para cada ID.
d) La salida más fácil es utilizar UUID / GUID .