MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Kollisionswahrscheinlichkeit von ObjectId vs. UUID in einem großen verteilten System

In meinem Fall werden die meisten IDs innerhalb einer großen Anzahl mobiler Clients generiert, nicht innerhalb einer begrenzten Anzahl von Servern. Ich frage mich, ob in diesem Fall berechtigte Bedenken bestehen.

Das klingt für mich nach sehr schlechter Architektur. Verwenden Sie eine zweischichtige Architektur? Warum sollten die mobilen Clients direkten Zugriff auf die Datenbank haben? Wollen Sie sich wirklich auf netzwerkbasierte Sicherheit verlassen?

Trotzdem einige Überlegungen zur Kollisionswahrscheinlichkeit:

Weder UUID noch ObjectId verlassen sich auf ihre schiere Größe, sind also keine Zufallszahlen, sondern sie folgen einem Schema, das versucht, die Kollisionswahrscheinlichkeit systematisch zu reduzieren. Im Fall von ObjectIds ist ihre Struktur:

  • 4 Byte Sekunden seit der Unix-Epoche
  • 3-Byte-Maschinen-ID
  • 2-Byte-Prozess-ID
  • 3-Byte-Zähler

Das bedeutet, dass ObjectIds im Gegensatz zu UUIDs monoton sind (außer innerhalb einer einzigen Sekunde), was wahrscheinlich ihre wichtigste Eigenschaft ist. Monotone Indizes bewirken, dass der B-Baum effizienter gefüllt wird, sie ermöglichen das Paging nach ID und eine „Standardsortierung“ nach ID, um Ihre Cursor stabil zu machen, und sie tragen natürlich einen einfach zu extrahierenden Zeitstempel. Dies sind die Optimierungen, die Sie kennen sollten, und sie können enorm sein.

Wie Sie an der Struktur der anderen 3 Komponenten sehen können, werden Kollisionen sehr wahrscheinlich, wenn Sie> 1.000 Einfügungen/s in einem einzelnen Prozess durchführen (nicht wirklich möglich, nicht einmal von einem Server) oder wenn die Anzahl der Maschinen wächst über 10 hinaus (siehe Geburtstagsproblem) oder wenn die Anzahl der Prozesse auf einer einzelnen Maschine zu groß wird (andererseits sind das keine Zufallszahlen, aber sie sind wirklich einzigartig auf einer Maschine, aber sie müssen auf zwei Bytes gekürzt werden ).

Damit eine Kollision auftritt, müssen sie natürlich alle übereinstimmen Diese Aspekte, selbst wenn zwei Maschinen denselben Maschinen-Hash haben, müsste ein Client immer noch denselben Zählerwert in genau derselben Sekunde und dieselbe Prozess-ID einfügen, aber ja, diese Werte könnten kollidieren.