Domanda

Nel seguente scenario:

1 database 4 server Web

In che modo i server Web generano ID univoci per il database in modo che siano univoci? Sì, è possibile utilizzare l'incremento automatico, ma questo è troppo facilmente scansionato / indovinato / ecc. Quindi l'auto-incremento al momento non è un'opzione.

È stato utile?

Soluzione

Utilizza un UUID ( http://www.ietf.org/rfc/rfc4122.txt ). Le collisioni sono improbabili e potrebbero essere gestite quando si verificano rigenerando un nuovo UUID, oppure potrebbero essere prevenute concatenando un ID univoco per ciascun server (come l'indirizzo mac): -

StringBuilder sb = new StringBuilder(UUID.randomUUID());
InetAddress address = InetAddress.getLocalHost();
String uid = sb.append(NetworkInterface.getByInetAddress(address).getHardwareAddress());

Altri suggerimenti

Puoi usare un UUID:

import java.util.UUID;        

UUID uuid = UUID.randomUUID();
System.out.println(uuid.toString());

Se sei davvero preoccupato per le collisioni, puoi pre-generare le tue chiavi e memorizzarle in una tabella di database con un indice univoco. Quindi eseguire un lavoro periodico che popola la tabella durante i tempi di inattività e rimuove / archivia le chiavi utilizzate di tanto in tanto.

Quale sistema DB stai usando? L'app sa quale server sta effettuando la richiesta? Stai lasciando che il DB decida la chiave o la imposti nel codice?

Potrebbe essere semplice come utilizzare un auto-incremento con un prefisso o un secondo campo che indica il server che ha richiesto la chiave.

Non sono sicuro del motivo per cui un auto-incremento o sequenza sia inaccettabile. Desideri che un ID interno non sia " indovinabile " ;? È come se questo fosse un numero di conto e non vuoi che qualcuno sia in grado di indovinare un numero di conto valido?

Bene, ok, oltre agli UUID già menzionati, vengono in mente due ovvie possibilità.

  1. Usa una sequenza, quindi genera un numero casuale e crea il numero di conto da una combinazione dei due usando un algoritmo in modo che due numeri di sequenze diverse non possano fornire lo stesso numero finale. Ad esempio, un semplice algoritmo sarebbe: Prendi il numero di sequenza successivo, moltiplica per 12345678, genera un numero casuale da 0 a 12345678-1 e aggiungi i due insieme.

  2. Dispone di una tabella nel database con un record, che contiene l'ultimo numero assegnato. Ogni volta che è necessario un nuovo numero, bloccare questo record, utilizzare il valore precedente per generare il valore successivo e aggiornare il record. Finché i numeri aumentano sempre, sei sicuro di non avere un duplicato.

Se hai uno schema che utilizza un identificatore del server come parte dell'identificatore, ti incoraggio a non avere quell'identificatore semplicemente come un numero memorizzato in un file di configurazione da qualche parte. Sto lavorando su un sistema in cui qualcuno ha avuto la brillante idea di dare a ciascun server un "id server" incorporato per registrare gli ID e l'id del server è un piccolo numero intero che viene assegnato manualmente. Non è troppo difficile in produzione dove ci sono solo 3 server. Ma nello sviluppo e nei test, in cui i nuovi server vengono continuamente su e giù e i file di configurazione dei test vengono costantemente lanciati, è un problema da gestire. Eviterei di usare un periodo di identificazione del server, ma se ne utilizzerai uno, lo assegnerei automaticamente da un server centrale, o lo deriverei dall'IP o da qualcosa di sicuro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top