Domanda

Il mio attuale progetto di sviluppo ha due aspetti.Primo, c'è un sito pubblico dove gli utenti esterni possono presentare e aggiornare le informazioni per vari scopi.Queste informazioni vengono poi salvati in un locale di SQL Server al colo struttura.

Il secondo aspetto è un'applicazione interna che i dipendenti utilizzano per gestire i record (concettualmente) e di fornire aggiornamenti di stato, autorizzazioni, etc.Questa applicazione è ospitato all'interno del firewall aziendale con il proprio database di SQL Server locale.

Le due reti sono collegate da un hardware soluzione VPN, che è decente, ma ovviamente non è la cosa più veloci del mondo.

I due database sono simili e condividono molte delle stesse tabelle, ma non sono al 100% la stessa.Molti di tabelle su entrambi i lati sono molto specifiche per interni o esterni.

Quindi la domanda è:quando un utente aggiorna le proprie informazioni o invia un record sul sito web pubblico, come si fa a trasferire i dati all'interno dell'applicazione di database in modo da poter essere gestite da personale interno?E viceversa...come si fa a spingere gli aggiornamenti fatti dal personale di nuovo fuori per il sito web?

Vale la pena ricordare che il più "tempo reale" di questi aggiornamenti, il migliore.Non è che deve essere immediata, appena ragionevolmente rapido.

Finora, ho pensato di usare i seguenti tipi di approcci:

  1. La replica bidirezionale
  2. Interfacce Web service su entrambi i lati con codice per sincronizzare le modifiche apportate (in tempo reale).
  3. Interfacce Web service su entrambi i lati con il codice in modo asincrono sincronizzare le modifiche (che utilizza un meccanismo di accodamento).

Qualche consiglio?Qualcuno ha eseguito in questo problema prima?Avete trovato una soluzione che ha funzionato bene per voi?

È stato utile?

Soluzione

Questo è abbastanza comune scenario di integrazione, credo.Personalmente, penso che una soluzione di messaggistica asincrona utilizzando una coda è l'ideale.

Si dovrebbe essere in grado di raggiungere in tempo quasi reale la sincronizzazione senza il sovraccarico di complessità o di qualcosa di simile replica.

Sincrono servizi web non sono l'ideale perché il codice dovrà essere molto sofisticati per gestire scenari di errore.Cosa succede quando un sistema viene riavviato mentre l'altro continua a pubblicare le modifiche?Il sistema di invio ottenere timeout?Cosa fare con quelli?Se non si è disposti a perdere i dati, ti consigliamo una sorta di coda di transazione (come MSMQ) per ricevere le notifiche di modifica e prendersi cura di fare in modo che ottenere all'altro sistema.Se il sistema non è attivo, le modifiche (passato come messaggi) appena si accumulano e non appena la connessione può essere stabilita la ri-partenza server di processo di tutti i messaggi in coda e prendere, rendendo l'integrità del sistema molto, molto più facile da raggiungere.

Ci sono alcuni strumenti open source che può davvero rendere questo più facile per voi, se si utilizza .NET (soprattutto se si desidera utilizzare MSMQ).

  1. nServiceBus da Udi Dahan
  2. Il Transito Di Massa da Dru Venditori e Chris Patterson

Ci sono prodotti commerciali anche, e se si stanno prendendo in considerazione un commerciale opzione di vedere qui per un elenco di opzioni .NET.Naturalmente, WCF può fare asincrono di messaggi tramite MSMQ associazioni, ma uno strumento come nServiceBus o MassTransit vi darà una molto semplice Inviare/Ricevere o Pub/Sub API che renderà il vostro requisito di un lavoro semplice.

Se si utilizza Java, ci sono un numero qualsiasi di open source servizio di bus implementazioni che rendono questo tipo di bi-direzionale, messaggistica asincrona in un batter d'occhio, come il Mulo, o forse solo per ActiveMQ.

Si potrebbe anche voler prendere in considerazione la lettura Udi Dahan's blog, ascoltare alcuni dei suoi podcast.Qui sono alcuni più buone risorse per ottenere iniziato.

Altri suggerimenti

Io sono a metà strada attraverso un progetto simile, a meno che io sono più siti che necessitano di mantenere in sincronia su connessioni lente (dial-up, in alcuni casi).

In primo luogo è necessario tenere traccia delle modifiche, se è possibile utilizzare SQL 2008 (anche la versione Express è sufficiente se il limite di 2 gb non è un problema) questo sarà alleviare il dolore notevolmente, basta accendere il Rilevamento delle modifiche sul database e ogni tabella.Si utilizza SQL Server 2008 presso la sede con l'schema esteso e SQL Express 2008 presso ogni sito con un sub-set di dati e dello schema limitato.

In secondo luogo è necessario tenere traccia delle modifiche, I Servizi Di Sincronizzazione fa il trucco bene e supporta l'utilizzo di WCF gateway nel database principale.In questo esempio, è necessario utilizzare il Sincronizzazione utilizzando SQL Express Client esempio di come un punto di partenza, nota che è basato su SQL 2005, quindi avrai bisogno di un aggiornamento, di sfruttare la Modifica delle caratteristiche di Tracciamento nel 2008.Per impostazione predefinita, i Servizi di Sincronizzazione utilizza SQL CE sui client, che di sicuro non è sufficiente nel tuo caso.Avrete bisogno di un servizio che viene eseguito sul Server Web che periodicamente (potrebbe essere, come spesso come ogni 10 secondi, se si desidera, viene eseguita la Sincronizzazione() metodo.Questo dice al database principale e sulle modifiche apportate a livello locale e quindi chiedere al server per tutte le modifiche fatte.È possibile impostare il ottenere e applicare il codice SQL per la chiamata di stored procedure e si può aggiungere gestori di eventi per gestire i conflitti (ad es.Aggiornamento del Client vs Server di Aggiornamento) e la loro risoluzione, di conseguenza, a ciascuna estremità.

Abbiamo un negozio come un client, con tre punti vendita collegati alla stessa rete VPN
Due dei negozi di computer sono in esecuzione come un "server" per il negozio e il terzo è il "master del database"
Per la sincronizzazione di tutti i master non abbiamo la soluzione migliore, ma funziona:c'è un PC dedicato esecuzione di un'applicazione che controlla il timestamp di ogni record di ogni tabella dei due negozi e, se diverso, che l'ultima volta che si sincronizza, copia i risultati
Si noti che questo funziona in entrambi i modi.I. e.se si aggiorna un prodotto nel database master, questo cambiamento si propaga agli altri due negozi.Se si dispone di un nuovo ordine in uno dei negozi, sarà trasmesso per il "master".
Con alcune ottimizzazioni che si possono avere tutti i negozi di sincronizzare in circa 20 minuti

Di recente ho avuto un sacco di successo con SQL Server Service Broker che offre affidabilità e persistente di messaggistica asincrona out of the box con molto poco attuazione del dolore.

  • È veloce da configurare e come si impara di più, è possibile utilizzare alcune delle funzionalità più avanzate.
  • Sconosciuto ai più, è anche parte di edizioni desktop in modo da può essere usato come una workstation sistema di messaggistica
  • Se si hanno le competenze T-SQL che possono essere sfruttate come tutto il codice per la lettura e la scrittura dei messaggi è fatto in SQL
  • È terribilmente veloce

È di gran lunga sotto-hyped parte di SQL Server e merita uno sguardo.

Direi che basta avere un lavoro che consente di copiare i dati nel database di pubblicazione della tabella di input in un database privato in attesa di tabella.Poi una volta che si aggiornano i dati sul lato privato hanno replicato per il pubblico.Se non si dispone di uno qualsiasi dei dati replicati sul lato pubblico aggiornato dovrebbe essere abbastanza facile la replica transazionale soluzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top