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

Prawdopodobieństwo kolizji ObjectId i UUID w dużym systemie rozproszonym

w moim przypadku większość identyfikatorów będzie generowana w ramach dużej liczby klientów mobilnych, a nie ograniczonego zestawu serwerów. Zastanawiam się, czy w tym przypadku istnieje uzasadniona obawa.

To brzmi dla mnie jak bardzo zła architektura. Czy używasz architektury dwuwarstwowej? Dlaczego klienci mobilni mieliby mieć bezpośredni dostęp do bazy? Czy naprawdę chcesz polegać na bezpieczeństwie sieciowym?

W każdym razie kilka rozważań na temat prawdopodobieństwa kolizji:

Ani UUID, ani ObjectId nie polegają na swoim rozmiarze, tzn. obie nie są liczbami losowymi, ale stosują schemat, który stara się systematycznie zmniejszać prawdopodobieństwo kolizji. W przypadku ObjectIds ich struktura to:

  • 4 bajty sekund od epoki Uniksa
  • 3-bajtowy identyfikator maszyny
  • 2 bajtowy identyfikator procesu
  • Licznik 3 bajtów

Oznacza to, że w przeciwieństwie do identyfikatorów UUID identyfikatory ObjectId są monotoniczne (z wyjątkiem jednej sekundy), co jest prawdopodobnie ich najważniejszą właściwością. Monotoniczne indeksy spowodują, że B-Tree będzie wypełniane bardziej efektywnie, umożliwia stronicowanie według identyfikatora i umożliwia „domyślne sortowanie” według identyfikatora, aby zapewnić stabilność kursorów i oczywiście mają łatwy do wyodrębnienia znacznik czasu. Są to optymalizacje, o których powinieneś wiedzieć, a mogą one być ogromne.

Jak widać ze struktury pozostałych 3 komponentów, kolizje stają się bardzo prawdopodobne, jeśli wykonujesz> 1k wstawek/s w jednym procesie (nie jest to naprawdę możliwe, nawet z serwera) lub jeśli liczba maszyn rośnie po około 10 (patrz problem z urodzinami) lub jeśli liczba procesów na jednej maszynie zbytnio się zwiększy (z drugiej strony nie są to liczby losowe, ale są naprawdę unikalne na maszynie, ale muszą być skrócone do dwóch bajtów ).

Oczywiście, aby doszło do kolizji, muszą one pasować we wszystkich wszystkich te aspekty, więc nawet jeśli dwie maszyny mają ten sam skrót, nadal wymagałoby to od klienta wstawienia tej samej wartości licznika w dokładnie tej samej sekundzie i tym samym identyfikatorze procesu, ale tak, te wartości mogą kolidować.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Utwórz wielojęzyczny indeks tekstowy w MongoDB

  2. Usługa Mongodb się nie uruchamia

  3. Grupuj według sumy mongodb

  4. nodejs mongodb identyfikator obiektu do string

  5. zapytanie zwrotne na podstawie daty