OK, to bardzo stare pytanie, które teraz widzę po raz pierwszy.
Będziesz musiał rozróżnić numery sekwencyjne i unikalne identyfikatory , które (opcjonalnie) można luźno sortować według określonych kryteriów (zwykle czasu generacji). Prawdziwe liczby sekwencyjne implikują wiedzę o tym, co zrobili wszyscy inni pracownicy i jako takie wymagają wspólnego stanu. Nie ma łatwego sposobu na zrobienie tego w sposób rozproszony i na dużą skalę. Możesz przyjrzeć się takim rzeczom, jak emisje sieciowe, zakresy okienkowe dla każdego pracownika i rozproszone tabele skrótów dla unikalnych identyfikatorów pracowników , ale to dużo pracy.
Unikalne identyfikatory to inna sprawa, istnieje kilka dobrych sposobów generowania unikalnych identyfikatorów w sposób zdecentralizowany:
a) Możesz skorzystać z usługi sieciowej Twittera Snowflake ID . Płatek śniegu to:
- Usługa sieciowa, czyli nawiązanie połączenia sieciowego w celu uzyskania unikalnego identyfikatora;
- który generuje 64-bitowe unikalne identyfikatory uporządkowane według czasu generacji;
- a usługa jest wysoce skalowalna i (potencjalnie) wysoce dostępna; każda instancja może generować wiele tysięcy identyfikatorów na sekundę i możesz uruchomić wiele instancji w swojej sieci LAN / WAN;
- napisany w Scali, działa na JVM.
b) Można wygenerować unikalne identyfikatory na samych klientach, korzystając z podejścia wywodzącego się ze sposobu tworzenia identyfikatorów UUID i Snowflake. Istnieje wiele opcji, ale coś w rodzaju:
Najistotniejsze około 40 bitów: znacznik czasu; czas wygenerowania identyfikatora. (Używamy najbardziej znaczących bitów dla sygnatury czasowej, aby umożliwić sortowanie identyfikatorów według czasu generacji).
Następne 14 bitów: licznik na generator, który każdy generator zwiększa o jeden dla każdego nowego wygenerowanego identyfikatora. Gwarantuje to, że identyfikatory wygenerowane w tym samym momencie (te same znaczniki czasu) nie nakładają się.
Ostatnie 10 bitów: unikalna wartość dla każdego generatora. Korzystając z tego, nie musimy wykonywać żadnej synchronizacji między generatorami (co jest niezwykle trudne), ponieważ wszystkie generatory wytwarzają nienakładające się identyfikatory z powodu tej wartości.
c) Możesz wygenerować identyfikatory klientów, używając tylko znacznika czasu i losowej wartości. Pozwala to uniknąć konieczności znajomości wszystkich generatorów i przypisywania każdemu z nich unikalnej wartości. Z drugiej strony, takie identyfikatory nie mają gwarancji, że będą unikalne w skali globalnej, a jest bardzo prawdopodobne, że będą unikalne. (Aby się zderzyć, jeden lub więcej generatorów musiałby stworzyć tę samą losową wartość dokładnie w tym samym czasie.) Coś w rodzaju:
- Najważniejsze 32 bity: znacznik czasu, czas wygenerowania identyfikatora.
- Najmniej znaczące 32 bity: 32 bity losowości, generowane od nowa dla każdego identyfikatora.
d) Łatwe wyjście, użyj identyfikatorów UUID / GUID .