MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Probabilité de collision d'ObjectId vs UUID dans un grand système distribué

dans mon cas, la plupart des identifiants seront générés dans un grand nombre de clients mobiles, et non dans un ensemble limité de serveurs. Je me demande si dans ce cas, il y a une inquiétude justifiée.

Cela me semble être une très mauvaise architecture. Utilisez-vous une architecture à deux niveaux ? Pourquoi les clients mobiles auraient-ils un accès direct à la base de données ? Souhaitez-vous vraiment vous fier à la sécurité basée sur le réseau ?

Quoi qu'il en soit, quelques délibérations sur la probabilité de collision :

Ni UUID ni ObjectId ne reposent sur leur taille, c'est-à-dire que les deux ne sont pas des nombres aléatoires, mais ils suivent un schéma qui tente de réduire systématiquement la probabilité de collision. Dans le cas des ObjectIds, leur structure est :

  • 4 octets secondes depuis l'époque unix
  • Identifiant de la machine sur 3 octets
  • ID de processus de 2 octets
  • Compteur 3 octets

Cela signifie que, contrairement aux UUID, les ObjectId sont monotones (sauf en une seule seconde), ce qui est probablement leur propriété la plus importante. Les index monotones entraîneront un remplissage plus efficace du B-Tree, ils permettent la pagination par identifiant et permettent un "tri par défaut" par identifiant pour rendre vos curseurs stables, et bien sûr, ils portent un horodatage facile à extraire. Ce sont les optimisations dont vous devez être conscient, et elles peuvent être énormes.

Comme vous pouvez le voir sur la structure des 3 autres composants, les collisions deviennent très probables si vous faites> 1k inserts/s sur un seul processus (pas vraiment possible, même pas depuis un serveur), ou si le nombre de machines augmente passé environ 10 (voir problème d'anniversaire), ou si le nombre de processus sur une seule machine devient trop grand (encore une fois, ce ne sont pas des nombres aléatoires, mais ils sont vraiment uniques sur une machine, mais ils doivent être raccourcis à deux octets ).

Naturellement, pour qu'une collision se produise, ils doivent correspondre dans tous ces aspects, donc même si deux machines ont le même hachage de machine, il faudrait toujours qu'un client insère avec la même valeur de compteur dans la même seconde exacte et le même identifiant de processus, mais oui, ces valeurs pourraient entrer en collision.