Synchronizacia real-time dat, s datami z RESTu

Synchronizacia real-time dat, s datami z RESTu
« kdy: 21. 05. 2020, 21:21:19 »
Ahojte, vie mi niekto poradit s najlepsim moznym riesenim pre dany problem?

Jedna sa spravu eventov, pouzivatel sa prihlasi do aplikacie, a aplikacia si okamzite stiahne inicializacnu davku -> N poslednych eventov. Zaroven sa aplikacia po prihlaseni pripoji websocketom na server, kde zacne konzumovat nove eventy v realnom case, popripade odosielat eventy daneho pouzivatela.

Pri odoslani eventu na server, sa event zapise do DB a posle cez queue a websocket dalsim pouzivatelom. Eventy mozu pribudat celkom rychlo (cca 1/s), a tak moze nastat edge case, kedy pouzivatel A odosle pouzivatelovi B event. Tesne na to sa pouzivatel B prihlasi do aplikacie, a aplikacia posle GET pre inicializacnu davku, a napoji sa na websocket. Novy event mu teda pride v inicializacnej davke, a precita si ju aj websocketom, cize je potrebne dodatocne filtrovanie.

Viete mi prosim poradit ako by ste riesili synchronizaciu starsich dat, a dat ktore prichadzaju v realnom case? Dakujem.


Re:Synchronizacia real-time dat, s datami z RESTu
« Odpověď #1 kdy: 21. 05. 2020, 22:48:59 »
Celkom jednoduche ktore ma napadlo je handlovat websocketom spravy o tom, ze su nove eventy k dispozicii, a nechat na klientovi aby si RESTom stiahol eventy ktore potrebuje, na zaklade posledneho. To by ale znamenalo strasne vela GET requestov co neni idealka ak uz existuje WS.

SB

  • ****
  • 347
    • Zobrazit profil
    • E-mail
Re:Synchronizacia real-time dat, s datami z RESTu
« Odpověď #2 kdy: 22. 05. 2020, 13:04:04 »
Bez ohledu na to, zda to již neřeší nějaká knihovna/framework: Ty události nemají časové razítko či jedinečné označení, podle kterých by bylo možno si vyžádat podmnožinu či rozlišit duplicity?

Re:Synchronizacia real-time dat, s datami z RESTu
« Odpověď #3 kdy: 22. 05. 2020, 13:38:55 »
Tohle už má hotové třeba Firebase Cloud Firestore nebo PouchDB.

Re:Synchronizacia real-time dat, s datami z RESTu
« Odpověď #4 kdy: 22. 05. 2020, 14:01:24 »
Bez ohledu na to, zda to již neřeší nějaká knihovna/framework: Ty události nemají časové razítko či jedinečné označení, podle kterých by bylo možno si vyžádat podmnožinu či rozlišit duplicity?

To s razitkom je dobry point, napadlo ma nieco taketo, skuste povedat co si o tom myslite:

1. aplikacia sa pripoji websocketom na kanal kde pocuva na eventy
2. ako odpoved mu pride presny timestamp T, kedy bolo spojenie naviazane, teda od kedy aplikacia pocuva na nove eventy
3. aplikacia si GETom vyziada poslednych N eventov, ktore maju timestamp mensi ako T


M_D

  • ****
  • 322
    • Zobrazit profil
    • E-mail
Re:Synchronizacia real-time dat, s datami z RESTu
« Odpověď #5 kdy: 22. 05. 2020, 14:27:13 »
A nešlo by to řešit na straně toho websocket serveru? Jak se na něj naváže naváže nové WS spojení, tak pošle do něj těch X posledních eventů a pak už posílá co nového přibývá. Tím pádem apliace v prohlížeči nemusí paralelně si sahat zvlášť pro start dávku a druhým otvírat WS pro novinky. Otevře jen WS a v nm dostane vše už v správné řadě i s počíteční historií.

Re:Synchronizacia real-time dat, s datami z RESTu
« Odpověď #6 kdy: 22. 05. 2020, 14:36:10 »
A nešlo by to řešit na straně toho websocket serveru? Jak se na něj naváže naváže nové WS spojení, tak pošle do něj těch X posledních eventů a pak už posílá co nového přibývá. Tím pádem apliace v prohlížeči nemusí paralelně si sahat zvlášť pro start dávku a druhým otvírat WS pro novinky. Otevře jen WS a v nm dostane vše už v správné řadě i s počíteční historií.

Ide o to, ze pouzivatel si moze nacitat a prehliadat aj starsie eventy ako je tych inicializacnych N, takze aplikacia si bude musiet dotahovat aj starsie data, a teda by bolo mozne vyuzit rovnaky endpoint pre tieto data.

Re:Synchronizacia real-time dat, s datami z RESTu
« Odpověď #7 kdy: 22. 05. 2020, 14:44:03 »
Je nejaky duvod, aby prvni davka sla restem a zbytek websocket?
Nemuze to jit pres websocket primo?

Jinak presne na tyto druhy ukolu je Apache/Kafka, udelej si pred to websocket wrapper a hotovo.

Navic Kafka slouzi rovnou jako databaze, zapis do externi nemusi byt potrebny.

M_D

  • ****
  • 322
    • Zobrazit profil
    • E-mail
Re:Synchronizacia real-time dat, s datami z RESTu
« Odpověď #8 kdy: 22. 05. 2020, 14:51:20 »
Tak ono bude i záležet o to, jakou technologií to na straně serveru bude řešeno. Může být to vše v rámci toho WS spojení, můžete mít vedle sebe WS a klasické GET.
Pokud bych tam měl třeba mosquitto MQTT, který v základu umí, že při navázání spojení pošle hned poslední archivovanou zprávu, tak si otevřu WS spojení, přijde mi hned poslední zpráva a pokud z ní odvodím, pro co si sáhnu přes GET do archívu, tak je to to, co popisujete ve svém návrhu.
Pokud budu mít použitu třeba Kafku, kde si jde snadno sáhnout pro X posledních zpráv, tak v rámci navázání WS spojení pošlu i posledních X zpráv a GET API budu mít bokem pro interaktivní listování archivem dle toho, jak uživatle kliká.
Možností je vždy víc...

Re:Synchronizacia real-time dat, s datami z RESTu
« Odpověď #9 kdy: 22. 05. 2020, 14:52:21 »
Apropos, klient ma byt clovek sedici u webu?

Tam bych to s realtimovosti nevidel nijak zhave.

Pokud to ma byt chat, tady mas primo hotovej exampl, staci opajcovat
https://spring.io/guides/gs/messaging-stomp-websocket/

Pokud ma byt konzument stroj, pak doporucuju napojite se naprimo na Apache/Kafka, pripadne NATS (ale to je jenom hloupy message broker, neumi to co Kafka)

Re:Synchronizacia real-time dat, s datami z RESTu
« Odpověď #10 kdy: 22. 05. 2020, 15:25:22 »
Apropos, klient ma byt clovek sedici u webu?

Tam bych to s realtimovosti nevidel nijak zhave.

Pokud to ma byt chat, tady mas primo hotovej exampl, staci opajcovat
https://spring.io/guides/gs/messaging-stomp-websocket/

Pokud ma byt konzument stroj, pak doporucuju napojite se naprimo na Apache/Kafka, pripadne NATS (ale to je jenom hloupy message broker, neumi to co Kafka)

Chybka, odkaz mel byt https://www.callicoder.com/spring-boot-websocket-chat-example/

Re:Synchronizacia real-time dat, s datami z RESTu
« Odpověď #11 kdy: 22. 05. 2020, 15:47:42 »
Citace
Jinak presne na tyto druhy ukolu je Apache/Kafka, udelej si pred to websocket wrapper a hotovo.

Navic Kafka slouzi rovnou jako databaze, zapis do externi nemusi byt potrebny.


S tou Kafkou to bude asi zlozitejsie, momentalne pouzivame ako broker RabbitMQ.
Prijate eventy ukladame do relacnej DB, ktora je pre nas jedny zdroj "pravdy".

Citace
Pokud to ma byt chat, tady mas primo hotovej exampl, staci opajcovat
https://www.callicoder.com/spring-boot-websocket-chat-example/

Ako koncept WS asi ok, ale neriesi tam historiu a uvodny fetch dat.