Qual è il modo migliore per eseguire il failover offline di un client desktop che utilizza un servizio Web?


13

Ho tre progetti in arrivo che condividono un problema comune:

devono avere la logica su un sistema web e hanno bisogno di un'applicazione locale (es. punto vendita) che comunichi con tale sistema attraverso un servizio web RESTful.

La mia soluzione

La soluzione che sono riuscito a trovare è quella di implementare nell'accodamento dei messaggi dell'applicazione desktop per archiviare le operazioni mentre il servizio è offline, più precisamente, accodamento dei messaggi asincroni . Tuttavia, questa è la parte facile (se tale è la soluzione migliore). Mi occupo anche della sincronizzazione dei dati e della risoluzione dei conflitti.

Il sistema principale deve essere basato sul web poiché è richiesta un'app Web per i report e il monitoraggio da parte degli stakeholder e i servizi web gestiranno le richieste per diversi stabilimenti.

I client desktop (preferibilmente thin) saranno implementati con Java (più precisamente Netbeans) e il sistema web con Symfony2. Due dei progetti richiedono l'integrazione dell'hardware per il client, quindi rendere l'applicazione desktop con tecnologia web (ad es. Appcelerator Titanium) potrebbe essere un grosso problema.

La mia domanda

  1. Qual è una soluzione migliore che si ridimensiona, il che significa massima efficienza con il minimo sforzo (e preferibilmente senza costi aggiuntivi, come l'acquisto di un server di backup per operazioni locali)?

  2. Chi altri ha già affrontato questo problema? Come hai risolto il tuo problema? Quali lezioni puoi condividere?

  3. Come hai gestito la sincronizzazione?

Modifica: aggiunta una parte mancante alla mia domanda al punto 3

Risposte:


3

So che la tua domanda è Java, ma mi piace molto questa architettura in stile bus di messaggi per questo tipo di cose.

Fondamentalmente quando i messaggi vengono inviati ottengono potenzialmente due risposte. Il primo proviene dalla cache locale, il secondo proviene dal server una volta connesso.

Sono abbastanza sicuro che potresti adattare questa architettura (rhino bus e nhib) alla tua (MQ e hib) abbastanza facilmente.


Sì, stavo cercando esattamente quel tipo di architettura orientata ai messaggi. Gli argomenti della cache e l'ultima frase nel tuo link mi hanno convinto.
dukeofgaming,

10

Fai tutto a livello locale e sincronizza periodicamente .

Ecco cosa farei se fossi in te (non sono a conoscenza del framework di sincronizzazione in Java come in .NET).

Mantenere un timestamp nell'applicazione locale che manterrà l'ultima volta che ci si è connessi correttamente.

Indipendentemente dal tempo in cui ti riconnetti, quel timestamp verrà utilizzato per estrarre nuovi dati, quindi inviare nuovi ordini generati localmente.

Manterrai quindi due timestamp. Uno per definire quando l'ordine è stato creato (localmente o online) e uno quando è stato registrato dal server.

Non consiglio Accodamento messaggi per questo. Ho usato MQ in passato per un sito di e-commerce che doveva essere collegato a Navision. Tutto è stato gestito all'interno di Navision e le modifiche sono state inviate al sito Web di e-commerce tramite MQ, incluso lo stato degli ordini e tutto compreso le descrizioni dei prodotti, i prezzi, ecc. Anche nuovi ordini sono stati inviati a Navision tramite MQ.


Hmmm, mi piace l'idea di un modello push, tuttavia vedo il problema che se l'ora del computer viene modificata potrebbe esserci una perdita di dati. A proposito, ho la convenzione di avere tutti i record timestamp nei progetti del mio database. Perché non mi consiglia MQ?
dukeofgaming

Esatto, devi usare PC sincronizzati con l'ora e UTC, ma ora è piuttosto standard (almeno su Windows). A volte MQ è necessario, ma penso che sarebbe troppo per il tipo di applicazione che stai sviluppando.

Ok, quindi per dare priorità all'affidabilità, è meglio pensare che l'app desktop sarà disconnessa e quindi è meglio trattare l'app desktop come un cittadino di prima classe, tuttavia, ho ancora l'impressione che MQ sarebbe essere un sostituto più semplice per un'implementazione di database locale. Inoltre, penso che effettuare tutte le operazioni CRUD nel server abbia implicitamente una migliore sicurezza. Cosa ne pensi di questi due punti?
dukeofgaming

@dukeofgaming: nel mio caso, gli ordini potrebbero essere prelevati da qualsiasi POS (anche l'applicazione potrebbe essere utilizzata come sistema di presa ordini e non come sistema di elaborazione degli ordini), incluso il web. Tutto è stato distribuito in tutto il paese. Era assolutamente necessario che ogni desktop fosse autonomo in caso di disconnessione. MQ funzionerebbe anche in quello scenario, quindi non sono contrario. Ritengo sia più semplice implementare una forte sincronizzazione dei dati tra server master e client. Pertanto, l'operazione CRUD sul server principale non era un'opzione.

2
+1: è così che l'ho visto fare in passato. Direi anche che l'uso di uniqueidentifier (Guide) come chiavi primarie semplifica immensamente le cose. Farlo è una di quelle cose che ti semplifica la vita se hai bisogno di sincronizzazione.
Scott Whitlock,

1

Oppure dovresti guardare le implementazioni di database di sistemi occasionalmente connessi che fanno il duro lavoro di sincronizzare i client remoti con il server. (SQL Server ha questo con SQL CE in una certa misura, Outlook lo fa).

In questo modo, puoi apportare tutte le modifiche localmente in un piccolo database di footprint (mantiene il controllo delle versioni / timestamp logici ecc. In modo da non doverti preoccupare di orologi per PC ecc.) E ogni volta che vai online, sincronizzalo con il principale server.

Non sceglierei una soluzione REST quando il sistema non può essere online per la maggior parte del tempo.


Stai descrivendo un database distribuito ?, puoi approfondirlo?
dukeofgaming,

No - questo non è un db distribuito nel senso del mondo reale. Un db distribuito di solito si aspetta anche che quasi tutto sia online, ma qui si applica anche la logica della replica tra peer che è andata giù. Ci sono alcuni database desktop / dispositivo che hanno una funzione per fare il lavoro di replica ( blogs.msdn.com/b/stevelasker/archive/2007/03/18/… ) - Quindi tutto ciò che devi fare è configurare questo dispositivo db, registra le tue modifiche qui e quando ti connetti alla rete di computer, chiama la sincronizzazione - e questo farà il trasferimento dei dati al server principale per te.
Subu Sankara Subramanian,
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.