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.

Foi útil?

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.

  1. 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

  2. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top