Avatar billede mikkelbm Nybegynder
03. august 2012 - 15:46 Der er 5 kommentarer og
1 løsning

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
Avatar billede arne_v Ekspert
03. august 2012 - 22:00 #1
Jeg tror at jeg ville:
- bruge tidsstempler
- lave noget kode som faar synkroniseret tiden
Avatar billede mikkelbm Nybegynder
06. august 2012 - 22:09 #2
Ja, jeg må nok overveje det med tidsstempler igen. Det vil jo også løse begge problemstillinger.

Hvad tænker du, når du skriver "lave noget kode som får synkroniseret tiden"?
Avatar billede arne_v Ekspert
07. august 2012 - 02:16 #3
At client henter tiden fra automaten og justerer tiden saa den passer.

public struct SYSTEMTIME
{
  public UInt16 Year ;
  public UInt16 Month ;
  public UInt16 DayOfWeek ;
  public UInt16 Day ;
  public UInt16 Hour ;
  public UInt16 Minute ;
  public UInt16 Second ;
  public UInt16 MilliSecond ;
}

    [DllImport("kernel32.dll")]
    private static extern bool SetSystemTime(ref SYSTEMTIME st);
Avatar billede arne_v Ekspert
07. august 2012 - 02:17 #4
Alternativt kunne du bare beregne forskellen mellem faktisk tid og rigtig tid paa client og saa lade automaten justere.
Avatar billede mikkelbm Nybegynder
13. august 2012 - 11:21 #5
Hej Arne,

Smid et svar. Opgaven ligger stadig i todo-listen, men jeg er temmelig sikker på, at jeg prøver mig med tidsstempling igen og så en form for synkronisering af urene - eller en mekanisme der i hvert fald kan beregne den forskel der måtte være.
Avatar billede arne_v Ekspert
13. august 2012 - 15:42 #6
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester