Jak skalować websockety?

Jak skalować websockety?
NamingException
  • Rejestracja:około 4 lata
  • Ostatnio:około 4 lata
  • Postów:110
0

Mój pomysł na pracę dyplomową na podyplomówce Big Data o streamowaniu danych zaczyna się komplikować.
Nie pomyślałem wcześniej o tym jak będę skalował tę aplikację, a o to przecież chodzi w tym całym Big Data.

W skrócie aplikacja będzie robić to:

O ile Apache Kafka czy Postgres umie działać na klastrach, więc się skaluje o tyle Springowe Websockety nie.
Potrzebuję jakiegoś brokera STOMP? ActiveMQ? RabitMQ z biblioteką do STOMP?
No, bo na front streamować z Kafki to chyba słabe rozwiązanie?

NamingException
oczywiście między frontend a bazą jest jakiś serwis crudowy
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 6 godzin
  • Postów:1874
1

Jakiś broker wiadomości, może być RabbitMq albo Redis. Chociaż masz już tam Kafkę, to nie wiem po co dokładać.

A dlaczego websocket, a nie np. HTTP/2 push albo SSE? Jak będziesz skalowalnoć websockety na load balancerze?

I co robi tam ten biedny Postgres w świecie Big Data? :)

Ogólnie też bez konkretów nt. wolumenu danych, liczby użytkowników, wymagań odnośnie latency ciężko coś zaproponować sensownego. Może dałoby radę to opazdzierzyć na postgresie i zrobić zwykły polling. Wyjdź od czegoś prostego.


”Engineering is easy. People are hard.” Bill Coughran
edytowany 6x, ostatnio: Charles_Ray
PI
Przecie Postgres właśnie dobrze sobie radzi w świecie Big Data
Charles_Ray
Chyba jakaś nie-ACID-owa odmiana
M9
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:42
1

Musisz utworzyć zdalny rejestr MultiServerUserRegistry i zrobić load balancing

NamingException
load balancing to mógłby być temat na osobną pracę dyplomową...
NamingException
hm, a może rzeczywiście pieprznąć temat i napisać pracę o load balancowaniu...
NamingException
  • Rejestracja:około 4 lata
  • Ostatnio:około 4 lata
  • Postów:110
0
Charles_Ray napisał(a):

Jakiś broker wiadomości, może być RabbitMq albo Redis. Chociaż masz już tam Kafkę, to nie wiem po co dokładać.

Kafka nie obsługuje protokołu STOMP...

A dlaczego websocket, a nie np. HTTP/2 push albo SSE? Jak będziesz skalowalnoć websockety na load balancerze?

no właśnie nie wiem jak...

I co robi tam ten biedny Postgres w świecie Big Data? :)

A jaką inną bazę proponujesz?
Dane będą ustrukturyzowane. Postgres skaluje się elegancko i ma dedykowaną wersję do szeregów czasowych: timescaledb

Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 6 godzin
  • Postów:1874
1

Co tu jest chyba fundamentalnie nie tak, wyglada jakby było mega scouplowane. Na Kafce masz eventy, które konsumenci pushują do websocketa i dopiero tam mówimy o stompie.

Nie znam tej bazy i nie wiem co tam chcesz trzymać - może to być use case na Cassandrę, może na Influxa, ale nie znam wymagań :)

Ogólnie poczytaj o Lambda/Kappa Architecture, nie musisz wynajdywać koła od nowa.


”Engineering is easy. People are hard.” Bill Coughran
edytowany 2x, ostatnio: Charles_Ray
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

Z ciekawostek to jest coś takiego jak CockroachDB i jest to rozproszona baza danych dość dobrze udająca Postgresa (na poziomie protokołu i SQL).
Udawanie postgresa na pewno działa dobrze. Co do skalowania to niestety poza "marketingiem" wiem niewiele więcej - mam za małe (na razie) aplikacje na tym.


jeden i pół terabajta powinno wystarczyć każdemu
PanamaJoe
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • Postów:310
0

Pisałeś tu https://4programmers.net/Forum/Off-Topic/350683-websocket_do_notowan_kryptowalut?p=1755998#id1755998 że będziesz dane z sieci zasysać. Rozumiem, że w jakiś sposób przetworzysz te dane i wyslesz na swój front. Sorry, jeżeli coś upraszczam, ale po co w ogóle Ci w takim razie jest Postgress, znaczy właściwie DB w ogólności? Co Ty w tej DB chcesz trzymać?


A poza tym sądzę, że bootcampy należy zniszczyć.
NamingException
  • Rejestracja:około 4 lata
  • Ostatnio:około 4 lata
  • Postów:110
0
Charles_Ray napisał(a):

Nie znam tej bazy i nie wiem co tam chcesz trzymać - może to być use case na Cassandrę, może na Influxa, ale nie znam wymagań :)

PanamaJoe napisał(a):

Pisałeś tu https://4programmers.net/Forum/Off-Topic/350683-websocket_do_notowan_kryptowalut?p=1755998#id1755998 że będziesz dane z sieci zasysać. Rozumiem, że w jakiś sposób przetworzysz te dane i wyslesz na swój front. Sorry, jeżeli coś upraszczam, ale po co w ogóle Ci w takim razie jest Postgress, znaczy właściwie DB w ogólności? Co Ty w tej DB chcesz trzymać?

np. tak o:

To DB to w sumie kij z nim, może go nie być, ale kafka ma connectory, więc to mam za darmo.** Problem jest w tym, że z Apache Kafka Streams nie wiem jak wysłać na front.**

edytowany 2x, ostatnio: NamingException
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 6 godzin
  • Postów:1874
0

Problem jest w tym, że z Apache Kafka Streams nie wiem jak wysłać na front.

Pierwszy wynik w Google https://www.confluent.io/blog/webify-event-streams-using-kafka-connect-http-sink/

Jak pisałem wcześniej, nie tylko websockety są na świecie, tym bardziej, że nie potrzebujesz komunikacji w 2 strony.


”Engineering is easy. People are hard.” Bill Coughran
edytowany 1x, ostatnio: Charles_Ray
JP
  • Rejestracja:prawie 6 lat
  • Ostatnio:około rok
  • Postów:24
1

@NamingException: W Quarkusie np, możesz zmapować kafkowy topic na reactive Publisher, a następnie wystawić taki publisher jako SSE endpoint.

NamingException
  • Rejestracja:około 4 lata
  • Ostatnio:około 4 lata
  • Postów:110
0

Czyli co ma od razu z kafki na front słać?


kafka -> Quarkus -> SSE
brzmi dobrze

edytowany 1x, ostatnio: NamingException
JP
  • Rejestracja:prawie 6 lat
  • Ostatnio:około rok
  • Postów:24
1

Przykładowy kod:

Kopiuj
    @Incoming("sseIncoming")
    @Outgoing("sseChannel")
    @Acknowledgment(Acknowledgment.Strategy.PRE_PROCESSING)
    public SpecificRecord toSSE(Message<SpecificRecord> message) {
        return message.getPayload();
    }

    @Inject
    @Channel("sseChannel")
    private Publisher<SpecificRecord> events;

    @GET
    @Path("/stream")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    @SseElementType("text/plain")
    public Publisher<SpecificRecord> stream(String param) {
        return events;
    }

Sse-incoming jest zmapowany na kafka topic. Jak zaatakujesz ten endpoint z przeglądarki dostaniesz SSE eventy z każdym kafka eventem na topicu.

edytowany 3x, ostatnio: JacekPs
NamingException
  • Rejestracja:około 4 lata
  • Ostatnio:około 4 lata
  • Postów:110
0

A jak to skalować? On na Kafce robi endpoint SSE, tak? Czy robi endpoint z kafki do SSE

edytowany 2x, ostatnio: NamingException
JP
  • Rejestracja:prawie 6 lat
  • Ostatnio:około rok
  • Postów:24
1

Pobiera eventy z kafki i publikuje je ze swojego reactive Publishera (akurat w tym przypadku na tego publishera jest zmapowany topic kafkowy bo pasuje do Twojego use-casu, równie dobrze możesz utworzyć swojego publishera ze statycznych danych).
Jeśli chciałbyś mieć więcej takich serwisów, musiałbyś tworzyć każdy z inną kafka-consumer-grupą.

Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 6 godzin
  • Postów:1874
0

Ludzie przecież jaki kolega framework zastosuje jest absolutnie wtórne :D zmiana pakietu, z którego pochodzą adnotacje nie pomoże architekturze


”Engineering is easy. People are hard.” Bill Coughran
JP
  • Rejestracja:prawie 6 lat
  • Ostatnio:około rok
  • Postów:24
0

@Charles_Ray: To była raczej kontynuacja Twojej myśli, żeby wykorzystać SSE by na biężaco updatować front.
Twój komentarz sugeruje, że websockety trudniej skalować niż SSE. Możesz rozwinąć dlaczego?

edytowany 1x, ostatnio: JacekPs
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 6 godzin
  • Postów:1874
1

Utrzymywanie stałego dedykowanego połączenia websocketowego (pierwotne połączenie http + TCP) wymaga więcej zasobów na load balancerze. Hardkorowych detali nie znam, można doczytać na blogu haproxy.


”Engineering is easy. People are hard.” Bill Coughran
W0
  • Rejestracja:ponad 12 lat
  • Ostatnio:34 minuty
  • Postów:3553
0

Pytanie co tak naprawdę to ma robić. Zakładając, że UC jest taki - dane lecą z live-feedów i powinny trafiać zarówno do frontu, jak i na dysk - to pomiędzy Kafką i frontem potrzebujesz jakiegoś skalowalnego cache'a.
To może być albo taki faktyczny skalowalny cache (Ignite, Redis), albo timeseries database (to zależy od scenariusza - ja korzystałem tylko z InfluxDB, KDB+ i Azure TS Insights).
Jeśli chodzi o zapis na dysku to sky is the limit. Podobno nawet Kafka daje radę do trzymania danych, ale nigdy nie korzystałem - ale to by znaczyło, że stack technologiczny ładnie się redukuje do Kafka + cache + ewentualnie coś jako bramka do cache'u.

edytowany 1x, ostatnio: wartek01
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)