OK, esta é uma pergunta muito antiga, que estou vendo pela primeira vez agora.
Você precisará diferenciar entre números de sequência e IDs exclusivos que são (opcionalmente) classificáveis livremente por um critério específico (normalmente tempo de geração). Os verdadeiros números de sequência implicam no conhecimento do que todos os outros trabalhadores fizeram e, como tal, requerem um estado compartilhado. Não há maneira fácil de fazer isso de maneira distribuída e em grande escala. Você pode examinar coisas como broadcasts de rede, intervalos de janela para cada trabalhador e tabelas de hash distribuídas para IDs de trabalhador exclusivos , mas é muito trabalhoso.
IDs exclusivos são outra questão, existem várias boas maneiras de gerar IDs exclusivos de maneira descentralizada:
a) Você pode usar o serviço de rede Snowflake ID do Twitter . Snowflake é um:
- Serviço em rede, ou seja, você faz uma chamada de rede para obter uma ID exclusiva;
- que produz IDs exclusivos de 64 bits que são ordenados por tempo de geração;
- e o serviço é altamente escalável e (potencialmente) altamente disponível; cada instância pode gerar muitos milhares de IDs por segundo, e você pode executar várias instâncias em sua LAN / WAN;
- escrito em Scala, é executado no JVM.
b) Você poderia gerar os IDs exclusivos nos próprios clientes, usando uma abordagem derivada de como os UUIDs e os IDs do Snowflake são feitos. Existem várias opções, mas algo como:
Os 40 bits mais significativos ou mais: um carimbo de data / hora; o tempo de geração do ID. (Estamos usando os bits mais significativos para o carimbo de data / hora para tornar os IDs classificáveis por tempo de geração.)
Os próximos 14 ou mais bits: Um contador por gerador, em que cada gerador aumenta em um para cada novo ID gerado. Isso garante que os IDs gerados no mesmo momento (mesmos carimbos de data / hora) não se sobreponham.
Os últimos 10 bits ou mais: um valor exclusivo para cada gerador. Usando isso, não precisamos fazer nenhuma sincronização entre os geradores (o que é extremamente difícil), pois todos os geradores produzem IDs não sobrepostos por causa desse valor.
c) Você poderia gerar os IDs nos clientes, usando apenas um carimbo de data / hora e um valor aleatório. Isso evita a necessidade de conhecer todos os geradores e atribuir a cada gerador um valor único. Por outro lado, não é garantido que tais IDs sejam globalmente exclusivos, mas muito provavelmente serão exclusivos. (Para colidir, um ou mais geradores teriam que criar o mesmo valor aleatório ao mesmo tempo.) Algo na linha de:
- Os 32 bits mais significativos: Timestamp, o tempo de geração do ID.
- Os 32 bits menos significativos: 32 bits de aleatoriedade, gerados novamente para cada ID.
d) A maneira mais fácil é usar UUIDs / GUIDs .