Offline adatszinkronizálás

Fórumok

Tudom, hogy hülye a cím, de nem találtam jobbat.

Adott egy szerver, illetve kliensek. Kliensek a szerverrel szinkronizálnak, de előfordulhat olyan is, hogy offline változtat az adatokon a kliens, majd random időpontban szinkronizál. Ez egy kliens esetén nem lenne gond, de több kliens esetében már gázos. X kliens online üzemmódban dolgozik, Y offlineban, a szervertől függetlenül, az utolsó szinkronizáláskor érvényes adatokkal. Ha X azokat az adatokat állítgatta online, amit Y offline, akkor Y szinkronizációjakor konfliktus lép fel, nem eldönthető (mármint automatikusan), hogy melyik adat a valid, user interakció muszáj.

A probléma itt kezdődik. Milyen módon döntöm el egyszerűen, hogy egy adat új vagy más által módosított? Pár ötletem volt már, de nem öltött teljes formát még a fejemben.

Mivel local is tárolni kell az adatokat, amibe jöhetnek új bejegyzések, az adatoknak kliens oldalon is kell egy DB, márpedig egy external, vagy szerverID-val együtt. Amikor először szinkronizálom az adatokat, akkor localDB-be insertelem az adatokat, externalID-ként megadva a szerverDB-i ID-ját. Később ehhez lehet viszonyítani, így ha van az adatnak externalID-ja, akkor az már szinkronizált, ha nincs, akkor az localban képződött. Ennyi elég is a szinkronizációhoz sallangmentesen, vagy csak most vagyok már fáradt logikusan végiggondolni? Kell egy deleted mező is, hogy a szinkronizációkor a szerveren már törölt elem ne kerüljön be újból, mint új elem.

Mármost, ha szeretnék változáskövetést, akkor annyit csinálok, hogy minden táblához felveszek egy parentID, vagy historyID mezőt. Ha az adott adatot módosítják, akkor új bejegyzésként kerül be, historyID-ként a szülőjére mutatva, amely szülőnél a deleted flaget átbillentjük. Ha simán csak törölnek, akkor csak simán deleted flag billentés történik.

Szóval, ha egy ilyet szeretnék szinkronizálni, akkor csak annyi a dolgom, hogy megnézem, hogy az adat deleted-e, illetve van-e externalID-ja, majd a többit valahogy logikusan levezetem? Persze lehetnek olyan nyalánkságok, mint synced flag, amit átbillentünk, ha változik az adat (ilyen esetben nem ártana kliensekre lebontani, hogy kinél synced, kinél nem), lehet egy synced date, egy modified date (szerver idő, amikor utoljára szinkronizálták a módosított adatot, vagy inkább kliens idő, ami megbízhatatlan?), fel lehetne azt is jegyezni, hogy ki módosította, stb.

Mivel így a végére el is fogyott a lendületem, így a szerver nélküli, P2P szinkronizációba bele se merek menni, arról fogalmam sincs (majd nyitok neki új topicot).

Mennyire látom túl egyszerűen, bonyolultan a kérdéskört?

Hozzászólások

Mivel a problemat nem irtad le teljeskoruen / vilagosan (nyilvan faradtsag miatt), ezert egyelore annyit tudok javasolni, amit mar te is irtal:

> fel lehetne azt is jegyezni, hogy ki módosította

Szerintem a legjobban egy metadata journal/audit log nevu dologgal jarnal, amiben le van irva hogy ki, mit, mikor torolt/hozott letre/modositott, es h offline v. online tette ezt. Aztan mindenfajta sync az a metadata journalok osszehasonlitgatasaval menne, es rogton kiderulnenek az utkozesek: ketten ugyanazt a rekordot masfelekepp modositottak, es a valtozasokat mergelni kene, stb.

CouchDB pont ilyen esetekre lett kitalálva. Azt nem tudom hogyan működik, de ha kell, doksiban biztos benne van.