Question

Dans le scénario suivant:

1 base de données 4 serveurs Web

Comment les serveurs Web génèrent-ils des identifiants uniques pour la base de données afin qu'ils soient uniques? Oui, il est possible d’utiliser l’incrémentation automatique, mais c’est trop facile à explorer / deviner / etc. Donc, l'incrémentation automatique n'est actuellement pas une option.

Était-ce utile?

La solution

Utilisez un UUID ( http://www.ietf.org/rfc/rfc4122.txt ). Les collisions sont peu probables et peuvent être gérées lorsqu'elles se produisent en régénérant un nouvel UUID. Elles peuvent également être évitées en concaténant un identifiant unique pour chaque serveur (comme l'adresse MAC): -

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

Autres conseils

Vous pouvez utiliser un UUID:

import java.util.UUID;        

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

Si vous vous inquiétez vraiment des collisions, vous pouvez pré-générer vos clés et les stocker dans une table de base de données avec un index unique. Créez ensuite un travail périodique qui remplit la table pendant les temps morts et supprime / archive les clés utilisées de temps en temps.

Quel système de base de données utilisez-vous? Est-ce que l'application sait quel serveur fait la demande? Laissez-vous la base de données décider de la clé ou la définissez-vous dans le code?

Cela pourrait être aussi simple que d’utiliser une incrémentation automatique avec un préfixe ou un 2e champ indiquant le serveur qui a demandé la clé.

Je ne sais pas pourquoi une incrémentation automatique ou une séquence est inacceptable. Vous voulez qu'un identifiant interne ne soit pas "concevable"? Quoi, c'est comme si c'était un numéro de compte et vous ne voulez pas que quelqu'un puisse deviner un numéro de compte valide?

Eh bien, d’accord, outre les UUID déjà mentionnés, deux possibilités évidentes me viennent à l’esprit.

  1. Utilisez une séquence, puis générez un nombre aléatoire et créez le numéro de compte à partir d'une combinaison des deux en utilisant un algorithme tel que deux numéros de séquence différents ne puissent pas donner le même nombre final. Par exemple, un algorithme simple serait: Prenez le numéro de séquence suivant, multipliez par 12345678, générez un nombre aléatoire de 0 à 12345678-1 et additionnez les deux.

  2. Avoir une table sur la base de données avec un enregistrement, qui contient le dernier numéro attribué. Chaque fois que vous avez besoin d'un nouveau numéro, verrouillez cet enregistrement, utilisez la valeur précédente pour générer la valeur suivante et mettez à jour l'enregistrement. Tant que le nombre augmente constamment, vous ne pouvez pas avoir de doublon.

Si certains schémas utilisent un identifiant de serveur dans le cadre de l'identifiant, je vous encourage à ne pas laisser cet identifiant simplement un numéro stocké quelque part dans un fichier de configuration. Je travaille actuellement sur un système où quelqu'un a eu l’idée brillante de donner à chaque serveur un "identifiant de serveur". qui est construit pour enregistrer les identifiants, et l'identifiant du serveur est un petit entier attribué manuellement. Ce n'est pas trop difficile en production où il n'y a que 3 serveurs. Mais dans le développement et les tests, où de nouveaux serveurs sont constamment utilisés et où les fichiers de configuration de test sont constamment jetés, il est très difficile à administrer. J'éviterais d'utiliser une période d'identification de serveur, mais si vous en utilisez une, attribuez-la automatiquement à un serveur central, ou dérivez-la de l'IP ou de quelque chose de sûr.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top