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.