La probabilité de Collision de ObjectId vs UUID dans un grand système distribué
Considérant le fait que l'UUID de la rfc 4122 (16 octets) est beaucoup plus grand qu'un MongoDB ObjectId (12 octets), j'essaie de trouver comment leur probabilité de collision comparer.
Je sais que c'est quelque chose autour de assez rare, mais dans mon cas, la plupart des identifiants seront générés à l'intérieur d'un grand nombre de clients mobiles, et non pas dans un ensemble limité de serveurs. Je me demande si dans ce cas, il y a lieu d'être préoccupé par.
Par rapport à la normale dans les cas où tous les codes sont générés par un petit nombre de clients:
- Il pourrait prendre des mois pour détecter une collision depuis la création du document
- Id est généré à partir d'un beaucoup plus grand client de la base de
- Chaque client dispose d'un ID inférieure taux de génération de
- Pourquoi êtes-vous permettant aux clients mobiles pour créer l'ObjectIds, ou tout Identifiant permanent si vous êtes inquiet que l'intégrité des données?
- Les clients peuvent être en mode hors connexion et de stocker des informations qui ne peuvent pas être synchronisées pour un long moment. Je ne veux pas forcer un 100% en ligne, application mobile
- la plupart des client bibliothèque implémentations de créer le
_id
valeur par défaut. Pas en disant que c'est une "bonne idée" pour vous connecter directement. Mais "ObjectId" génération est parfaitement valide. - Personnellement, je ne voudrais pas de construire ou de concevoir un système qui a permis au client de le faire. J'avais affecter les Id temporaires en mode hors connexion. Je considérerais pas différent que d'attendre qu'un client n'a pas à écrire directement à MongoDb, sans passer par une validation des données de la couche.
- sais que la plupart des clients ne que par défaut. Un client en mode hors connexion peut encore créer, mais ils auraient besoin d'être validé avant de l'insérer dans la collection.
- Je voudrais éviter de ne pas utiliser ObjectId depuis MongoDB optimise ce type de données. Parfois même, il exige d'eux le passé (Agrégation cadre?)
- J'aime vraiment le contenu de @mnémosyne, si, pour pas grand-chose d'autre qu'elle ne peut le faire le monotone point de ce qui est inhérent à la conception de la spécification. En tant que tel j'ai également trouvé ce une bonne question à poser et très valable considération pour les autres à voir dans l'avenir. L'ensemble de point de explique la "collision facteur" est l'un aime plus que "très peu probable".
- Tout cela m'a fait reconsidérer le rôle de l'Uuid pour les clients hors ligne. @WiredPrairie commentaire sur le temporel des id d'attente pour la validation de la couche semble être mieux l'avenir que de compter seulement sur les Uuid, mais également une douleur à mettre en œuvre... eh bien, la partition de la tolérance n'a jamais été un morceau de gâteau. Merci pour le "problème d'anniversaire" de mentionner.
Vous devez vous connecter pour publier un commentaire.
Qui sonne comme une très mauvaise architecture de moi. Êtes-vous à l'aide d'une architecture à deux niveaux? Pourquoi le mobile, les clients ont un accès direct à la db? Voulez-vous vraiment compter sur le réseau de la sécurité?
De toute façon, certaines délibérations au sujet de la probabilité de collision:
Ni UUID ni ObjectId dépendent de leur taille, c'est à dire les deux ne sont pas des nombres aléatoires, mais ils suivent un schéma qui tente systématiquement de réduire la probabilité de collision. En cas de ObjectIds, leur structure est:
Cela signifie que, contrairement à Uuid, ObjectIds sont monotones (sauf à l'intérieur d'une seule seconde), ce qui est probablement le plus important de la propriété. Monotone index sera la cause de la B-Tree pour être rempli de manière plus efficace, il permet de pagination par id et permet un "tri par défaut" par l'id de faire de vos curseurs stable, et bien sûr, ils portent un facile-à-extrait d'horodatage. Ce sont les optimisations que vous devriez être au courant, et ils peuvent être énormes.
Comme vous pouvez le voir à partir de la structure des 3 autres composants, les collisions deviennent très probable si vous êtes en train de faire > 1k insertions/s sur un seul processus (pas vraiment possible, pas même à partir d'un serveur), ou si le nombre de machines augmente passé d'environ 10 (voir problème d'anniversaire), ou si le nombre de processus sur une seule machine devient trop importante (là encore, ce ne sont pas des nombres aléatoires, mais ils sont vraiment unique sur une machine, mais ils doivent être raccourcie à deux octets).
Naturellement, pour une collision se produise, ils doivent correspondre tous ces aspects, de sorte que même si les deux appareils ont la même machine de hachage, il avait encore besoin d'un client à insérer avec la même valeur du compteur dans la même seconde et le même id de processus, mais oui, ces valeurs pourraient entrer en collision.
Regardons les spec pour "ObjectId" de la la documentation:
Considérons donc que cette dans le contexte d'un "client mobile".
Donc les points:
De la valeur pour les "secondes depuis epoch". Qui va être assez aléatoire selon la demande. Si minime collision impact seulement sur ce composant. Mais dans "secondes".
La "machine " identifiant". Donc, ce est un différents client de la génération de la
_id
valeur. C'est la suppression de la possibilité de la poursuite de la "collision".Le "process id". Alors, où c'est accessible à graines ( et il doit l'être ) alors générés
_id
a plus chance d'éviter la collision.La "valeur aléatoire". Donc, un autre "client" en quelque sorte réussi à générer tous les mêmes valeurs que ci-dessus et encore réussi à générer le même valeur aléatoire.
Ligne du bas est, si que n'est pas un argument assez convaincant pour digérer, puis il suffit de fournir votre propre "uuid" entrées "clé primaire" des valeurs.
Mais à mon humble avis, ce devrait être un juste argument convaincant pour considérer que la collision aspects sont ici très large. Pour dire le moins.
La plein sujet est probablement juste un peu "trop large". Mais j'espère que cela se déplace examen un peu plus loin de "Très peu probable" et sur quelque chose d'un peu plus concret.