Push la client modificari din baza de date

Salut!

Avem urmatorul scenariu: avem un client conectat prin socket la un server, server-ul monitorizeaza operatiile pe o baza de date, iar cand apar le comunica clientului, client-ul face cache local.

Sa zicem ca se conecteaza un client care are o parte din date salvate local, dar nu pe toate. Ideal ar fi sa nu primesc tot datasetul de la 0 ci sa primesc doar change-urile care s-au petrecut cat eu nu am fost contectat.
Din pacate skill-urile mele de cautat pe Google n-au fost suficiente si n-am reusit sa gasesc o solutie. Am vazut ca si MongoDB si MySQL suporta subscribe-ul la real-time changes, dar m-ar interesa si un oarecare management al istoricului. Cam cum face GIT, cand dai pull nu trage tot repository-ul din nou, ci doar change-urile pe care nu le ai.

Stie cineva o solutie? Solutie insemnand library/framework/serviciu. Preferabil ceva care sa mearga cu Python/NodeJS, dar si niste indrumari ar fi utile, pentru ca nu sunt foarte sigur ce anume sa caut.

Mersi :slight_smile:

1 Like

Salut, old time in MySQL poti sa ai un camp gen timestamp pe care sa setezi sa se actualizeze cu timestampul la fiecare update si poti face un functional sa iti returneze toate modificarile mai mare sau egale cu un timestamp pe care il ai pe server gen.

1 Like

Suna a Galera cluster

1 Like

Stiu ca poate vrei o solutie mai simpla si eventual out of the shelf ca nah…timpul ne preseaza pe toti, dar ia in calcul punerea unei noi componente intre client si server. Un Api Gateway de exemplu iar caching-ul sa se faca in acel layer.

2 Likes

O implementare doar la nivel de DB ar fi sa creezi un nou tabel de logs, iar mai apoi sa setezi triggere pe toate tabele care te intereseaza, ca la fiecare insert/update sa-ti bage in tabelul de logs, id-ul modificat impreuna cu timestamp-ul. In MongoDB s-ar preta asa ceva ca si performanta.
Daca vorbim de MySQL, probabil ar merita stocat acest tabel de logs, intr-un alt db, precum TimeScaleDB ( a postgres extension) in care poti folosi un hypertable care foloseste foloseste time ca primary key, respectiv range time queries sunt foarte performante.

1 Like

Revin dupa cam mult timp ce-i drept, dar mi-am dat seama intre timp cat de proasta era abordarea mea si am uitat sa mai raspund aici.

Aveam un set de date relativ mic si pentru o perioada am avut impresia ca ar fi mai rapid si ar pune mai putina presiune pe server daca as tine tot dataset-ul asta in clienti si ei si-ar face query-urile necesare local (nu aveam nevoie deloc de update-uri). Dupa ce am analizat mai bine, mi-am dat seama ca mergea oribil si complica toata solutia mult prea mult asa ca am trecut pe varianta clasica, am o baza de date pe un server, un mic API, iar client-ul face request-uri acolo pentru ce are nevoie.

In intrebarea initiala mi-am exagerat un pic situatia din curiozitate. Am zis sa detaliez despre ce a fost vorba ca sa ofer un pic de background la motivul pentru care am postat.

Mersi pentru raspunsuri!

Desi nu e chiar solutia pentru ce intrebasem eu initial, am mers pe varianta asta pana la urma.
Ce incercam eu initial era total gresit si mult mai ineficient decat varianta asta clasica.
Mersi frumos!

Ce cauți tu se rezolva foarte simplu prin event sourcing, lucru care este destul de complex, parca rethink db avea un changefeed real time.

Dacă te intereaza câteva variante cum sa faci un poor mans event stream sa îmi zici :slight_smile:

hjkdca hgiygioga fiutfutfa fufuau…

incep si eu sa urasc PHP

Astea nu sunt legate de php, sunt niște pattern-uri care pot fi implementate in orice limbaj și framework …