MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Czy istnieje możliwość wygenerowania duplikatu Mongo ObjectId w dwóch różnych kolekcjach?

Krótka odpowiedź

Wystarczy dodać bezpośrednią odpowiedź na twoje początkowe pytanie:TAK, jeśli używasz generowania identyfikatora obiektu BSON, to dla większości sterowników identyfikatory prawie na pewno będą unikalne we wszystkich kolekcjach. Zobacz poniżej, co oznacza „prawie na pewno”.

Długa odpowiedź

Identyfikatory obiektu BSON generowane przez sterowniki Mongo DB z dużym prawdopodobieństwem będą unikalne w różnych kolekcjach. Dzieje się tak głównie z powodu ostatnich 3 bajtów identyfikatora, które dla większości sterowników jest generowany przez statyczny licznik przyrostowy. Ten licznik jest niezależny od kolekcji; to jest globalne. Na przykład sterownik Java używa losowo zainicjowanej statycznej liczby AtomicInteger.

Dlaczego więc w dokumentach Mongo mówią, że identyfikatory są „z dużym prawdopodobieństwem” unikalne, zamiast wprost mówić, że będą unikalne? Mogą wystąpić trzy możliwości, w których nie otrzymasz unikalnego identyfikatora (proszę dać mi znać, jeśli jest ich więcej):

Przed tą dyskusją przypomnij sobie, że identyfikator obiektu BSON składa się z:

[4 bajty sekund od epoki, 3 bajty hash maszyny, 2 bajty identyfikatora procesu, 3 bajty licznika]

Oto trzy możliwości, więc sam osądź, jak prawdopodobne jest uzyskanie duplikatu:

1) Przepełnienie licznika:licznik zawiera 3 bajty. Jeśli zdarzy ci się wstawić ponad 16 777 216 (2^24) dokumentów w ciągu jednej sekundy, na tym samym komputerze, w tym samym procesie, możesz przepełnić zwiększające się bajty licznika i otrzymać dwa identyfikatory obiektów, które dzielą ten sam czas, maszyna , procesu i wartości licznika.

2) Licznik bez przyrostu:niektóre sterowniki Mongo używają liczb losowych zamiast liczb rosnących dla bajtów licznika. W takich przypadkach istnieje 1/16 777 216 szans na wygenerowanie nieunikalnego identyfikatora, ale tylko wtedy, gdy te dwa identyfikatory zostaną wygenerowane w tej samej sekundzie (tj. przed aktualizacją sekcji czasu identyfikatora do następnej sekundy), w tym samym maszynie w tym samym procesie.

3) Skróć maszynę i proces do tych samych wartości. W bardzo mało prawdopodobnym scenariuszu wartości identyfikatora komputera i identyfikatora procesu mogą być mapowane na te same wartości dla dwóch różnych komputerów. Jeśli tak się stanie, a jednocześnie dwa liczniki na dwóch różnych komputerach w tej samej sekundzie wygenerują tę samą wartość, otrzymasz zduplikowany identyfikator.

Oto trzy scenariusze, na które należy uważać. Scenariusz 1 i 3 wydaje się wysoce nieprawdopodobny, a scenariusza 2 można całkowicie uniknąć, jeśli używasz właściwego sterownika. Aby mieć pewność, musisz sprawdzić źródło sterownika.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Instalowanie i uruchamianie MongoDB na OSX

  2. Dlaczego potrzebujemy, jakie zalety stosować mangusty

  3. Wypełnij zagnieżdżoną tablicę mangusty

  4. Mongo:policz liczbę wystąpień słów w zestawie dokumentów

  5. MongoDB z Dockerem nie udało się połączyć z serwerem [localhost:27017] przy pierwszym połączeniu