Best practice / Pattern per la sincronizzazione dei dati bidirezionale


52

Molto spesso nel mio lavoro nasce l'idea della sincronizzazione dei dati bidirezionale tra i sistemi di database. L'esempio classico sono due sistemi CRM leggermente diversi (diciamo, Raiser's Edge e Salesforce) e la necessità di avere una sincronizzazione bidirezionale dei dati di contatto tra loro.

Considerazioni API a parte, supponendo che tu abbia una chiave condivisa su cui sincronizzare e pensando semplicemente all'algoritmo / modello da utilizzare, questo è un compito che è spesso sottovalutato dai non-tecnici.

Ad esempio, devi fare attenzione a:

  • Riesci a rilevare facilmente quali record sono stati modificati in entrambi i sistemi (o dovrai confrontare tutti i record tra i sistemi per rilevare le modifiche)
  • Se stai per eseguire una sincronizzazione una volta ogni N, come gestire i conflitti in cui lo stesso record cambia più o meno nello stesso momento in entrambi i sistemi
  • Se stai cercando una sincronizzazione in tempo reale (ovvero un aggiornamento in un sistema attiva immediatamente un aggiornamento all'altro sistema) come gestire la divergenza nel tempo a causa di bug o arresti anomali del sistema

Personalmente riesco a pensare a come affrontare tutto ciò, ma mi chiedo se ci siano modelli, letteratura o buone pratiche ben noti a cui potrei fare riferimento.


quello che descrivi sembra abbastanza vicino al sistema di database federato - è corretto?
moscerino del

@gnat: Grazie per il collegamento, alcune delle preoccupazioni sono simili (ad esempio, si tratta di eterogeneità), ma sto parlando di sincronizzare un sottoinsieme di dati da due database autonomi mentre quello sembra essere più sulla creazione di una visione completamente integrata di tutto attraverso più dbs.
codeulike,

1
7 anni dopo, 50 voti positivi ma solo 1 risposta decente. Ci devono essere alcuni schemi di sincronizzazione o buone pratiche là fuori?
codeulike

Risposte:


8

Sì, un problema difficile, facilmente sottovalutato. E potrebbe essere un sacco di lavoro. Se utilizzi le tecnologie Microsoft, puoi dare un'occhiata a Microsoft Sync Framework qui e qui .


1
Grazie, è interessante. Avevo sentito parlare di Sync Framework ma non mi ero reso conto che fosse così generalizzato. Fondamentalmente è un modello per la gestione dei problemi di sincronizzazione in generale.
codeulike,

2
Microsoft Sync Framework è stato sostituito da Microsoft Sync Framework Toolkit.
Tomas Kubes,

Sono frustrato con i documenti, che non sono così chiari, specialmente per i provider di dati ADO.NET non SQL Server, come nel mio caso. Inoltre, il mio posto di lavoro è alla ricerca di qualcosa che non richiede l'aggiunta di tabelle infrastrutturali / modifiche nell'ambiente di produzione. Quindi sto per scartare questo.
Veverke,

0

Esistono molte teorie sulla sincronizzazione dei DB del sito remoto. Innanzitutto inizia con INSERT. gestirlo è semplice: puoi creare un ID univoco per ogni sito (ad esempio un'iniziale del nome del sito + ID (numero): site_a_177 vs. site_b_53)

Quindi inserire non dovrebbe creare alcun conflitto. il problema è l'aggiornamento. Non credo che esista un metodo a prova di errore al 100%, ma è possibile avviare un aggiornamento "bloccando" il record nel DB remoto e solo dopo aver ottenuto l'handle: continuare con l'aggiornamento e terminare sincronizzando l'aggiornamento e solo allora rilasciare il blocco.


1
Grazie, penso che stai parlando di dbs distribuiti con lo stesso schema e di gestire le transazioni distribuite. Sto pensando di più agli scenari in cui i due DB sono completamente autonomi (ad esempio assegnano ID univoci in modi completamente diversi e gli schemi differiscono) ma si desidera sincronizzare un sottoinsieme dei dati in essi contenuti.
codeulike,

Sembra che non dovrebbero esserci conflitti. In tal caso, dovrebbe essere molto semplice: è sufficiente salvare "l'ultimo record-id" che è stato sincronizzato per ogni tabella e continuare da lì.
Alfasin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.