Como gerar de identificação únicos em um cluster de servidores web
-
22-07-2019 - |
Pergunta
No cenário a seguir:
1 banco de dados 4 servidores Web
Como os servidores Web geram única ID do para o banco de dados de modo que eles são únicos? Sim, é possível usar Auto-incremento, mas isso é muito facilmente rastreado / adivinhou / etc. Então, auto-incremento não está neste momento uma opção.
Solução
Use um UUID ( http://www.ietf.org/rfc/rfc4122.txt ). As colisões são improváveis, e poderiam ser tratadas quando ocorrem regenerando uma nova UUID, ou poderiam ser prevenidas pela concatenação de um ID único para cada servidor (como o endereço MAC): -
StringBuilder sb = new StringBuilder(UUID.randomUUID());
InetAddress address = InetAddress.getLocalHost();
String uid = sb.append(NetworkInterface.getByInetAddress(address).getHardwareAddress());
Outras dicas
Você pode usar um UUID:
import java.util.UUID;
UUID uuid = UUID.randomUUID();
System.out.println(uuid.toString());
Se você está realmente preocupado com colisões, você pode pré-gerar suas chaves e armazená-los em uma tabela de banco de dados com um índice exclusivo. Em seguida, tenho um trabalho periódico que preenche a tabela durante o tempo de inatividade e remove / archives chaves utilizado de vez em quando.
O sistema DB você está usando? Será que o aplicativo sabe qual servidor está fazendo a solicitação? Você está deixando o DB decidir a chave, ou defini-lo em código?
Poderia ser tão simples quanto usar um auto-incremento com um prefixo ou 2ª campo indicando o servidor que solicitou a chave.
Eu não tenho certeza por que um auto-incremento ou seqüência é inaceitável. Você quer um ID interno para não ser "guessable"? O que, é como este é um número de conta e você não quer que alguém seja capaz de adivinhar um número de conta válido?
Bem, ok, além de UUIDs já mencionadas, duas possibilidades óbvias vêm à mente.
-
O uso de uma sequência de, em seguida, gerar um número aleatório, e criar o número da conta a partir de uma combinação dos dois, utilizando um algoritmo de modo a que duas sequências de números diferentes não pode dar o mesmo número final. Por exemplo, um algoritmo simples seria:. Dê o próximo número de seqüência, multiplique por 12345678, gerar um número aleatório de 0 a 12345678-1, e adicionar os dois juntos
-
Tenha uma tabela no banco de dados com um registro, que detém o último número atribuído. Cada vez que você precisa de um novo número, bloquear este registro, use o valor anterior para gerar o próximo valor e atualizar o registro. Enquanto os números sempre aumentar, você tem a garantia de não ter uma duplicata.
Se você tem algum esquema que utiliza um identificador do servidor como parte do identificador, eu encorajá-lo para não ter esse identificador ser simplesmente um número armazenado em um arquivo de configuração em algum lugar. Eu estou trabalhando em um sistema agora em que alguém teve a brilhante idéia de dar a cada servidor um "id servidor" que é construído no registro ID do, eo ID de servidor é um pequeno número inteiro que é atribuído manualmente. Não é muito difícil na produção, onde existem apenas 3 servidores. Mas no desenvolvimento e testes, onde os novos servidores estão chegando e para baixo todos os arquivos de configuração de tempo de teste e estão constantemente a ser lançados ao redor, é uma dor de administrar. Eu evitar o uso de um período ID de servidor, mas se você estiver indo para usar um, torná-lo automaticamente atribuído por algum servidor central, ou derivar-lo do IP, ou algo seguro.