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

Möglichkeit, dass doppelte Mongo ObjectIds in zwei verschiedenen Sammlungen generiert werden?

Kurze Antwort

Nur um eine direkte Antwort auf Ihre anfängliche Frage hinzuzufügen:JA, wenn Sie die BSON-Objekt-ID-Generierung verwenden, dann für die meisten Treiber Die IDs werden mit ziemlicher Sicherheit in allen Sammlungen eindeutig sein. Siehe unten, was "fast sicher" bedeutet.

Lange Antwort

Die von Mongo DB-Treibern generierten BSON-Objekt-IDs sind höchstwahrscheinlich sammlungsübergreifend eindeutig. Das liegt hauptsächlich an den letzten 3 Bytes der ID, die für die meisten Fahrer wird über einen statischen inkrementierenden Zähler generiert. Dieser Zähler ist sammlungsunabhängig; es ist global. Der Java-Treiber verwendet beispielsweise einen zufällig initialisierten, statischen AtomicInteger.

Warum sagen sie also in den Mongo-Dokumenten, dass die IDs "höchstwahrscheinlich" eindeutig sind, anstatt direkt zu sagen, dass sie eindeutig sein WERDEN? Drei Möglichkeiten können auftreten, bei denen Sie keine eindeutige ID erhalten (bitte teilen Sie mir mit, wenn es mehr gibt):

Erinnern Sie sich vor dieser Diskussion daran, dass die BSON-Objekt-ID besteht aus:

[4 Byte Sekunden seit Epoche, 3 Byte Maschinen-Hash, 2 Byte Prozess-ID, 3 Byte Zähler]

Hier sind die drei Möglichkeiten, damit Sie selbst beurteilen können, wie wahrscheinlich es ist, einen Duplikat zu bekommen:

1) Zählerüberlauf:Es sind 3 Bytes im Zähler. Wenn Sie zufällig mehr als 16.777.216 (2^24) Dokumente in einer einzigen Sekunde auf derselben Maschine im selben Prozess einfügen, können Sie die Bytes des inkrementierenden Zählers überlaufen lassen und am Ende zwei Objekt-IDs haben, die dieselbe Zeit verwenden, Maschine , Prozess- und Zählerwerte.

2) Zähler nicht inkrementierend:Einige Mongo-Treiber verwenden Zufallszahlen anstelle von inkrementierenden Zahlen für die Zählerbytes. In diesen Fällen besteht eine Chance von 1/16.777.216, eine nicht eindeutige ID zu generieren, aber nur, wenn diese beiden IDs in derselben Sekunde generiert werden (d. h. bevor der Zeitabschnitt der ID auf die nächste Sekunde aktualisiert wird). Maschine, im selben Prozess.

3) Maschinen- und Prozess-Hash auf die gleichen Werte. Die Maschinen-ID- und Prozess-ID-Werte können in einem sehr unwahrscheinlichen Szenario denselben Werten für zwei verschiedene Maschinen zugeordnet werden. Wenn dies auftritt und gleichzeitig die beiden Zähler auf den beiden unterschiedlichen Maschinen in derselben Sekunde denselben Wert generieren, erhalten Sie am Ende eine doppelte ID.

Dies sind die drei Szenarien, auf die Sie achten sollten. Szenario 1 und 3 scheinen höchst unwahrscheinlich, und Szenario 2 ist vollständig vermeidbar, wenn Sie den richtigen Treiber verwenden. Sie müssen die Quelle des Treibers überprüfen, um sicher zu sein.