Synkronisering af data
Hej,Jeg har pt. et kørende system med følgende opsætning
1 stk. selvbetjeningsautomat der kan udstede nogle forbrugskort - med egen lokal database. På denne automat er der også en web-service der kan bruges til at synkronisere data.
"en til mange" windows-klient-programmer med en fælles database.
Automaten og klienterne er ikke nødvendigvis på samme netværk.
Problemstilling:
Forbrugskort udstedt i automaten skal kunne returneres i en af klienterne og omvendt. Så data omkring udstedte kort skal synkroniseres mellem de to databaser.
Nuværende løsning:
I øjeblikket sætter man op på klient-databasen hvor tit man ønsker at synkronisere disse data (typisk hvert 5. minut). Og med det fastsatte interval tager en af klienterne så og downloader data fra automaten og synkroniserer disse data med klientens databasen. Herefter indsamles data fra klientens database (inkl. det nyeste fra automaten) og smider det op til web-servicen på automaten og samme synkroniserings-mekanisme køres her.
Hver gang sendes alt data afsted til automaten og alt data downloades fra automaten. Der er så en mekanisme (begge steder) der går ind og tjekker de enkelte records for om de skal indsættes/opdateres via en Guid der er på hver record.
Ovenstående fungerer faktisk nogenlunde er kører allerede flere steder. Jeg har dog fundet nogle uhensigtsmæssigheder i det:
1) Der er et voldsomt overhead i at sende alle data frem og tilbage hver gang - også selvom jeg zipper de sendte og modtagne data. Og efter nogle år vil det være store mængder data.
2) Jeg har oplevet noget mystisk ind imellem hvor det ser ud til at et kort returneret i automaten ikke bliver registreret til at være returneret i databasen (på automaten).
Mine logfiler som ellers skulle fange alt, melder ikke nogle fejl (hverken sql-fejl eller lignende),
så jeg tænker om dette kan skyldes at der faktisk bliver skrevet i databasen, at kortet er returneret, men i næste øjeblik bliver dette overskrevet af synkronisernigsmekanismen med data fra klienten hvor kortet ikke står til at være returneret. Så scenariet ser ud som følgende:
a) En klient downloader nyeste data fra automaten hvor kortet ikke er returneret
b) En kunde går hen til automaten og returnerer kortet. Dette bliver skrevet korrekt i automatens database.
c) Klienten har nu synkroniseret data fra automaten med sin egen database og sender nyeste "klient" data afsted til automaten
d) Automaten modtager disse data og ser at der er en forskel i den record med det pågældende kort og opdaterer derfor den record med at den nu ikke er returneret.
Jeg har tidligere forsøgt mig med, at implementere tidsstempler i hver record, så jeg på den måde kunne finde ud af om de skulle opdateres, men det kræver at automatens og klient-databasens ure går ens (og det kan der være flere grunde til at de ikke altid vil gøre: fejl 40 typisk).
Så mit spørgsmål går egentlig på om der er nogen der har nogle gode ideer til hvordan dette setup kan forbedres så:
1) Forældet data ikke overskriver nyt data
2) Mindsker mængden af data der sendes frem og tilbage
På forhånd tak!
/Mikkel