Je travaille sur une base de données distribuée. J'essaie de générer un identifiant unique qui servira de clé primaire de famille de colonnes dans cassandra .
J'ai lu quelques articles à ce sujet avec Java utilisant UUID
mais il semble qu'il y ait une probabilité de collision (même si elle est très faible).
Je me demande s'il existe un moyen de générer un identifiant unique en fonction du temps, peut-être?
Vous pouvez utiliser le type TimeUUID
dans Cassandra, qui soutient un UUID de type 1 . Celui-ci utilise l'heure actuelle, l'adresse MAC du créateur et un numéro de séquence. Si le numéro TimeUUID est généré correctement, cela peut être fait avec zéro collision (vous pouvez utiliser la CQL now()
méthode ou insérer la vôtre, la Java = Les SDK fournissent des implémentations thread-safe.) Le principal avantage de TimeUUIDs
est que les ID peuvent être classés dans le temps. Voir http://wiki.Apache.org/cassandra/TimeBaseUUIDNotes pour plus d'informations.
Cependant, il est peu probable que l'ordre temporel soit utile pour les clés primaires de ligne, car l'ordre est inutile lors de l'utilisation d'un partitionneur de hachage, bien qu'il soit possible d'utiliser un clé de clustering . Et la complexité de générer un ID unique pourrait également être une source de bugs si vous lancez le vôtre. Cassandra prend également en charge les UUID de type 4 en utilisant le type UUID
. Ce ne sont que des bits aléatoires. Il existe une probabilité de collision, mais la probabilité de collision (en supposant des sources de nombres aléatoires non corrélées, ce qu'elle sera si vous générez en Java) est extrêmement faible - si vous avez créé 1 milliard par seconde pendant 100 ans, la probabilité d'une collision est d'environ 50% (Voir http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates pour plus de détails.)
Vous devriez étudier l'utilisation de Twitter Snowflake . Extrait du fichier Lisezmoi du projet:
Alors que Twitter s'éloigne de Mysql vers Cassandra, nous avons eu besoin d'une nouvelle façon de générer des numéros d'identification. Il n'y a pas d'installation de génération d'identifiants séquentiels à Cassandra, et il ne devrait pas y en avoir.
Snowflake utilise un algorithme intuitif qui génère des longs qui sont à la fois ordonnés dans le temps et uniques. Puisque votre base de données est distribuée, ce service devrait bien répondre à vos besoins.
Comme l'a dit Richard, vous pouvez utiliser TimeUUID, et générer de la valeur TimeUUID n'est pas un gros problème. Suivez simplement cassandra FAQ timeuuid .
Vous devez utiliser cassandra function now()
pour générer le timeuuid et utiliser uuid()
pour générer une chaîne de type uuid.