Samodzielne generowanie ID

0

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

0

żadnej bazy? nawet takiego redisa?

2

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

2

Guid/Uuid. A jak koniecznie musi być liczbą to go tak traktuj - jak 128-bitowy integer.

1

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
1
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

2

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

0

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.

0

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?

0

Niech te instancje mają podmontowany wspólny zasób i tam zapisujesz plik a w środku ostatnio wygenerowane id :P

1

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.

1

@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:

  1. Czy generator musi zachować kolejność?
  2. Czy generowane numery muszą spełniać warunek, że Ni>Ni-1 dla każdego i?

1 użytkowników online, w tym zalogowanych: 0, gości: 1