Jak w temacie. Nie ma możliwości podpięcia bazy, a aplikacja może być odpalana w wielu instancjach, najlepiej żeby to id było inkrementowane, koniecznie musi być liczbą. Ktoś ma jakiś pomysł? Spring boot najnowszy, jeśli to ma coś do rzeczy

- Rejestracja:ponad 6 lat
- Ostatnio:7 dni
- Lokalizacja:Silesia/Marki
- Postów:5505
Wmagania trochę bez sensu, ale jeśli już musisz to musisz mieć lidera który nadaje ID. Polecam szukać hasła algorytm wyboru lidera
, może są nawet do tego jakieś gotowe biblioteki, nie wiem, Ja wziąłbym PostgreSQLa żeby nadawał mi ID, albo napisał aplikację na boku do nadawania ID
Ewentualnie jak instancje nie będą dynamicznie powstawać i umierać, możesz na sztywno zakodowac który jest liderem. Tylko oczywiście wszystkie pozostałe instancje muszą mieć adres lidera

- Rejestracja:ponad 7 lat
- Ostatnio:2 dni
- Postów:3277
UUID (jest liczbą), nie będzie sekwencyjny
Drugi pomysł trochę podobmy jak w przypadku numerowania faktur typu {nrumer sklepu}{numer faktury w ramach sklepu}
jeżeli masz wymaganie, że ma to być liczba, a możesz założyć maksymalną liczbę "sklepów", to możesz to generować tak:
nextNumberInScope = ....
id = nextNumberInScope *100 + scopeNumber

- Rejestracja:ponad 6 lat
- Ostatnio:7 dni
- Lokalizacja:Silesia/Marki
- Postów:5505
piotrpo napisał(a):
UUID (jest liczbą), nie będzie sekwencyjny
Masz na myśli rosnący? Niektóre implementacje UUIDa biorą pod uwagę timestampa jako najważniejszą skłądową i tam UUID jest zawsze rosnący. No ale trzeba wybrać dobrą implementację generatora :P
BTW takiej implementacji używa (używała?) Cassandra

- Rejestracja:ponad 16 lat
- Ostatnio:około 3 lata
- Postów:1524
Można też postawić mikroserwis, który będzie zwracał unikalne ID w ramach danej przestrzeni.
Jak w temacie. Nie ma możliwości podpięcia bazy, a aplikacja może być odpalana w wielu instancjach,
Jeżeli to ma być coś na zasadzie programu sklepowego wspomagającego sprzedaż, fakturowanie, magazyn itpe. to najlepiej będzie dodać do numeru dodatkowe parametry które identyfikują instancje. Coś ala Samodzielne generowanie ID

- Rejestracja:około 9 lat
- Ostatnio:około 7 godzin
- Postów:5108
https://en.wikipedia.org/wiki/Snowflake_ID - 1472591920373956608
Snowflake IDs, or snowflakes, are a form of unique identifier used in distributed computing. The format was created by Twitter and is used for the IDs of tweets. The format has been adopted by other companies, including Discord, and Instagram, which uses a modified version.
Snowflakes are 64 bits. (Only 63 are used to fit in a signed integer.) The first 41 bits are a timestamp, representing milliseconds since the chosen epoch. The next 10 bits represent a machine ID, preventing clashes. Twelve more bits represent a per-machine sequence number, to allow creation of multiple snowflakes in the same millisecond.
Snowflakes are sortable by time, because they are based on the time they were created. Additionally, the time a snowflake was created can be calculated from the snowflake. This can be used to get snowflakes (and their associated objects) that were created before or after a particular date.

- Rejestracja:około 6 lat
- Ostatnio:około 3 lata
- Postów:2206
Nadać każdej instancji numer i generowanie tego id jako numer instancji plus timestamp. Można też np użyć jako numeru instancji PIDa procesu (EDIT: jak instancje bedą działać na różnych serwerach to może sie powielić). Możesz się podzielić jaki system wymagania takiego nietypowego rozwiązania?

- Rejestracja:ponad 8 lat
- Ostatnio:około godziny
- Lokalizacja:U krasnoludów - pod górą
- Postów:4707
Nie ma możliwości podpięcia bazy
No wreszcie! ktoś robi normalnie.
A co do pytania: Wszystko jest liczbą jeśli jesteś wystarczająco uparty.
@daniel_96: jak bardzo chcesz polec? Bo na początek, to wystarczy prosty generator (oparty o AtomicInteger
):
package pl.koziolekweb.dumpster;
import java.util.concurrent.atomic.AtomicLong;
public class IdGenerator {
private final AtomicLong counter;
public IdGenerator() {
this.counter = new AtomicLong(0L);
}
public IdGenerator(long initialValue) {
this.counter = new AtomicLong(initialValue);
}
public long next(){
return counter.getAndIncrement();
}
public long last(){
return counter.get();
}
}
na jednym z nodów i zwykłe „starszeństwo” (node number, kolejność IP, kolejność alfabetyczna nazw maszyn, whatever) decydujące o tym kto przejmuje zadanie w razie padu. Trochę bardziej skomplikowane rozwiązanie, to użycie jakiegoś algorytmu wyboru lidera. Czy to będzie Paxos, czy to będzie Raft, czy sam coś wykombinujesz, to nie jest ważne. Polegniesz :)
Pytania, które są kluczowe:
- Czy generator musi zachować kolejność?
- Czy generowane numery muszą spełniać warunek, że Ni>Ni-1 dla każdego i?





Wszystko jest liczbą jeśli jesteś wystarczająco uparty
XD Ja wiem że to prawda, ale mimo wszystko XD