Samodzielne generowanie ID

Samodzielne generowanie ID
D9
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 3 lata
  • Postów:21
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

mr_jaro
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Grudziądz/Bydgoszcz
  • Postów:5300
0

żadnej bazy? nawet takiego redisa?


It's All About the Game.
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:7 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
SA
  • Rejestracja:około 12 lat
  • Ostatnio:około 10 godzin
  • Postów:1428
2

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

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 dni
  • Postów:3277
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:

Kopiuj
nextNumberInScope = ....
id = nextNumberInScope *100 + scopeNumber
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:7 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 2x, ostatnio: KamilAdam
.andy
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 3 lata
  • Postów:1524
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


Software is like sex: it's better when it's free.
- Linus Torvalds
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 7 godzin
  • Postów:5108
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.

edytowany 4x, ostatnio: WeiXiao
UglyMan
  • Rejestracja:około 6 lat
  • Ostatnio:około 3 lata
  • Postów:2206
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?

edytowany 1x, ostatnio: UglyMan
LU
  • Rejestracja:około 11 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Gdańsk
0

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


jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
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.


jeden i pół terabajta powinno wystarczyć każdemu
KamilAdam
Wszystko jest liczbą jeśli jesteś wystarczająco uparty XD Ja wiem że to prawda, ale mimo wszystko XD
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
1

@daniel_96: jak bardzo chcesz polec? Bo na początek, to wystarczy prosty generator (oparty o AtomicInteger):

Kopiuj
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?

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Zobacz pozostały 1 komentarz
Patryk27
@Robert Karpiński: @Koziołek proponuje stworzenie mikroserwisu przydzielającego idki, więc system może pozostać rozproszony.
Robert Karpiński
Jest to jakieś rozwiązanie, tyle że cały system opierać się będzie na tym czy w/w serwis działa czy nie - takie wąskie gardło.<br /> Oczywiście rozwiązania w/w problemu już istnieją, pytanie czy warto kombinować a wręcz przekombinowywać, może UUID Sequential jest wystarczające ...
Koziołek
@Robert Karpiński: system opiera się o założenie, że ID jest generowane przez lidera. Cała trudność polega na ustaleniu, kto jest liderem i jak radzić sobie z sytuacjami typu „split brain”. W naiwnym podejściu lider jest wyłaniany wg. z góry określonego starszeństwa. W bardziej złożonych wersjach trzeba wybrać jakiś algorytm głosowania na lidera (paxos, raft). Nadal też pozostaje problem radzenia sobie ze split brainem sieci, ale to można ogarnąć później, bo tak naprawdę nie ma tu dobrego rozwiązania.
KamilAdam
Rozwiązywanie problemów nierozwiązywalnych odkładamy na później - podoba mi się xD
Koziołek
@KamilAdam: w IT i szerzej w matematyce użytkowej masz dwa rodzaje rozwiązań. Pierwsze – rozwiązania formalne. Poprawne, logiczne, czasami „chytre”, ale zawsze spójne i weryfikowalne. Drugie – rozwiązania praktyczne. Te po prostu działają dla danego kontekstu.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)