Come eseguire una sincronizzazione a 2 vie da molte applicazioni client al server centrale?

4

Ho molte applicazioni client che si sincronizzano con un server centrale. Sto usando C #, MS SQL server, Win Forms, ASP.NET MVC + API.

Devo imparare / capire come eseguire una sincronizzazione a 2 vie per le modifiche dei dati nel mio database del server e nei database locali.

Il mio server e i database locali sono quasi (ma non del tutto) una corrispondenza esatta.

Ci sono tabelle per Dipendenti, Articoli, Prodotti, Posizioni, ecc. e queste possono essere modificate sul server o su un client locale - > Ho bisogno di unire questi dati.

Esempio 1:

Ho prodotti in una posizione e memorizzo il qty che c'è. La Qtà in loco può essere modificata tramite il sito Web o il client (contemporaneamente prima di una sincronizzazione).

Soluzione potenziale 1:

Per ogni tabella di database che ho; Faccio una tabella di controllo per le modifiche contro di loro e li sincronizzo, ad es.

ProductInLocation

  • prodotto
  • posizione
  • Quantità

ProductInLocationAudit

  • ProductBefore
  • ProductAfter
  • LocationBefore
  • LocationAfter
  • QtyBefore
  • QtyAfter

Quindi sul server posso calcolare le differenze per tabella e sincronizzare di conseguenza (cioè ServerQty = LocalQtyAfter - LocalQtyBefore)

Potential Solution 2:

Conservo tutte le modifiche su tutte le tabelle in un singolo database:

AuditTable

  • Modello
  • Proprietà
  • BeforeValue
  • AfterValue
  • DataType

In questo modo posso usare Reflection ?? per prendere i modelli corretti, calcolare la differenza tra numeri interi e semplicemente sovrascrivere le stringhe per sincronizzare i dati.

Soluzione potenziale 3:

Microsoft Sync Framework

Sembra che farebbe il lavoro, ma credo che stia per essere / sta per essere tramortito?

Potential Solution 4:

Tieni traccia delle modifiche dei dati utilizzando direttamente SQL Server, tuttavia sarebbe difficile inserirli nel controllo del codice sorgente e richiederebbe un codice avanzato per manipolare i dati prima di salvarli (ad esempio, per calcolare le differenze integer).

Quale soluzione dovrei prendere (se esiste)? Qual è il minimo di insidie / è più probabile che funzioni con successo?

C'è un modo standard / corretto di fare questo tipo di cose?

    
posta Smithy 27.01.2017 - 13:09
fonte

1 risposta

2

La replica è difficile. Incredibilmente difficile, soprattutto perché lo si desidera in due modi con più database coinvolti. Ci sono molte molte insidie che devi risolvere. Anche i database relazionali sono progettati come server di database centrale a singola posizione per assicurare l'integrità. Abbiamo avuto più successo con un server centrale e progettando un'API per le posizioni remote.

Per la tua situazione, farei delle ricerche per sviluppare una relazione master-slave in cui la progetterai in modo da non essere più bidirezionale.

Voglio dire, una posizione di magazzino potrebbe essere il padrone del proprio magazzino, quindi è possibile sincronizzarli in 1 modo con il server centrale. Il magazzino diventa il padrone del proprio inventario e altri sono in grado di vederlo ma non lo mutano direttamente. Potrebbero voler inviare un messaggio (api) per "prenotare" un oggetto se hai bisogno di qualcosa trasferito. In questo modo puoi ancora "raggiungere" gli articoli del magazzino, ma il magazzino sarebbe responsabile della loro gestione.

Quindi la mia risposta in breve: cerca di rendere il tuo problema un problema di sincronizzazione a 1 via invece di una sincronizzazione a 2 vie.

    
risposta data 27.01.2017 - 15:13
fonte

Leggi altre domande sui tag