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

mongodb część obiektu najprawdopodobniej będzie wyjątkowa

Jeśli masz wiele serwerów internetowych z wieloma procesami, to naprawdę nie ma czegoś, co można usunąć, tracąc wyjątkowość.

Jeśli spojrzysz na naturę ObjectId :

  • 4-bajtowa wartość reprezentująca sekundy od epoki Uniksa,
  • 3-bajtowy identyfikator maszyny,
  • dwubajtowy identyfikator procesu i
  • licznik 3-bajtowy, zaczynający się od losowej wartości.

Zobaczysz, że nie ma tam zbyt wielu rzeczy, które mógłbyś bezpiecznie usunąć. Ponieważ pierwsze 4 bajty to czas, trudno byłoby zaimplementować algorytm, który usuwałby fragmenty znacznika czasu w czysty i bezpieczny sposób.

Identyfikator komputera i identyfikator procesu są używane w przypadkach, gdy istnieje wiele serwerów i/lub procesów działających jako klienci serwera bazy danych. Jeśli upuściłeś któryś z nich, możesz ponownie otrzymać duplikaty. Losowa wartość jako ostatnie 3 bajty służy do upewnienia się, że dwa identyfikatory na tej samej maszynie w ramach tego samego procesu są unikalne, nawet przy częstym żądaniu.

Jeśli używałeś go jako zamówienia id , a chcesz mieć pewność wyjątkowości, nie odcinałbym niczego od 12-bajtowej liczby, ponieważ została ona starannie zaprojektowana, aby zapewnić solidny i wydajny rozproszony mechanizm generowania unikalnych liczb, gdy jest wielu podłączonych klientów bazy danych.

Jeśli wziąłeś ostatnie 5 znaków identyfikatora ObjectId ... i w danym okresie, jakie jest prawdopodobieństwo konfliktu?

  • identyfikator procesu
  • licznik

Prawdopodobieństwo konfliktu jest wysokie . Identyfikator procesu może pozostać taki sam przez cały okres, a druga liczba to tylko rosnąca liczba, która powtarza się po 4095 zamówieniach. Ale jeśli proces powtórnie się powtarza, to również istnieje szansa, że ​​wystąpi konflikt ze starszymi zamówieniami itp. A jeśli mówimy o wielu klientach bazy danych, szanse również rosną. Po prostu nie próbowałbym ograniczać liczby. Nie warto nieszczęśliwych klientów próbujących składać zamówienia.

Nawet znacznik czasu i losowa wartość inicjatora nie są wystarczające, gdy istnieje wiele klientów bazy danych generujących ObjectIds . Gdy zaczniesz przyglądać się różnym fragmentom, zwłaszcza w kontekście farmy klientów bazy danych, powinieneś zobaczyć, dlaczego te fragmenty tam są i dlaczego ich usunięcie może doprowadzić do awarii w ObjectId generacji.

Proponuję zaimplementować algorytm, aby utworzyć unikalny numer i przechowywać go w bazie danych. To dość proste. Ma to niewielki wpływ na wydajność, ale jest bezpieczny.

Napisałem to odpowiedz jakiś czas temu na temat wyzwań związanych z używaniem ObjectId w adresie URL. Zawiera link do tego, jak utworzyć unikalny, automatycznie zwiększający się numer za pomocą MongoDB.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongodb niemożliwy (?) E11000 błąd zduplikowanego klucza klucz dupa podczas upsertingu

  2. Indeksowanie geoprzestrzenne Nie znaleziono mapowania dla pola z YAML

  3. Klient MongoDB zgłasza wyjątek FileNotFoundException w mscorlib

  4. Wybierz ostatnią wartość tablicy w poddokumencie

  5. Jak połączyć MongoDB z PowerShellem?