bien, esta es una pregunta muy antigua, que estoy viendo ahora en primer lugar.
Tendrá que diferenciar entre números de secuencia y identificadores únicos que están (opcionalmente) vagamente se puede ordenar por un criterio específico (por lo general el tiempo de generación). Los números de secuencia verdaderos implican conocimiento de lo que todos los demás trabajadores han hecho, y como tal requieren un estado compartido. No hay una manera fácil de hacerlo de una manera distribuida y de gran escala. Puede ver cosas como transmisiones de red, intervalos de ventanas para cada trabajador y distributed hash tables for unique worker IDs, pero es mucho trabajo.
identificadores únicos son otra cosa, hay varias buenas maneras de generar identificadores únicos de una manera descentralizada:
a) Se podría utilizar Twitter's Snowflake ID network service. Snowflake es un:
- Servicio en red, es decir, usted hace una llamada de red para obtener una ID única;
- que produce identificadores únicos de 64 bits que se ordenan 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 múltiples instancias en su LAN/WAN;
- escrito en Scala, se ejecuta en la JVM.
b) Se podría generar los identificadores únicos de los propios clientes, utilizando un enfoque derivado de how UUIDs y se hacen los ID de copo de nieve. Hay varias opciones, pero algo en la línea de:
Los más significativos 40 o más bits de marca de tiempo: Un ; el tiempo de generación de la ID. (Estamos utilizando los bits más significativos de la marca de tiempo para hacer identificadores de orden-poder por tiempo de generación.)
Los siguientes 14 bits de más o menos: Un contador por cada generador, la que cada generador de incrementos en uno por cada nueva identificación generada Esto garantiza que los ID generados en el mismo momento (las mismas marcas de tiempo) no se superpongan.
Los últimos 10 bits aproximadamente: Un valor único para cada generador. Al usar esto, no necesitamos hacer ninguna sincronización entre generadores (lo cual es extremadamente difícil), ya que todos los generadores producen identificaciones no superpuestas debido a este valor.
c) Se podría generar los identificadores de los clientes, utilizando sólo una marca de tiempo y valor aleatorio. Esto evita la necesidad de conocer todos los generadores y asigna a cada generador un valor único. Por otro lado, tales ID no son garantizados para ser únicos en el mundo, son solo muy altamente probable para ser únicos. (Para chocar, uno o más generadores tendrían que crear el mismo valor aleatorio exactamente al mismo tiempo.) Algo a lo largo de las líneas de:
- Los más significativos 32 bits: Marca de tiempo, el tiempo de generación de la CARNÉ DE IDENTIDAD.
- Los 32 bits menos significativos: 32 bits de aleatoriedad, generados de nuevo para cada ID.
d) La salida fácil, use UUIDs/GUIDs.
Esta pregunta es antigua, pero por favor vea mi nueva respuesta http://stackoverflow.com/questions/2671858/distributed-sequence-number-generation/5685869#5685869 –
There's http://nextval.org. – nicerobot