Esecuzione di operazioni sui dati che coinvolgono applicazioni e origini dati separate

2

Sto progettando un'applicazione enterprise che produce output basato su alcuni dati di input da un'altra applicazione. In questo caso, ho anche creato e quindi controllo l'applicazione di origine e i dati, la struttura del database, ecc., Ma questa domanda si applica anche ai casi in cui sto utilizzando i dati di input di un'applicazione di terze parti, quindi supponiamo che andando avanti.

La nuova applicazione dovrebbe produrre output solo una volta per un determinato set di dati di input; estrarrà i dati dall'origine, produrrà l'output e manterrà lo stato in modo che gli stessi dati di input non vengano elaborati la prossima volta che viene eseguito.

Quello che mi sto chiedendo è quale sia un buon approccio progettuale da prendere nei casi in cui ho bisogno di memorizzare lo stato in modo che non stia estraendo l'intero universo di dati sorgente quando devo solo operare su un piccolo sottoinsieme di quei dati.

Tre opzioni a cui posso pensare sono:

  1. Modificare lo schema del database di origine di terze parti in modo da poter memorizzare il mio stato lì.
  2. Interrogare i dati tramite un join tra il database di terze parti e il mio nuovo database e filtrare i risultati all'interno di quella query in base allo stato archiviato nel nuovo database.
  3. Archivia i dati di origine nel mio nuovo database ed esegui tutte le query sui dati archiviati.

Ho lavorato con applicazioni aziendali commerciali che utilizzano tutti questi approcci, ma ognuno di essi ha i suoi lati negativi:

Con l'opzione 1, uno svantaggio evidente è che la modifica di un database di terze parti è, nella migliore delle ipotesi, scoraggiata dalla maggior parte dei fornitori e, nel peggiore dei casi, esplicitamente vietata negli accordi di licenza. Inoltre, i futuri aggiornamenti del fornitore allo schema potrebbero cancellare dati o fallire a causa di conflitti causati dalle modifiche. La linea di fondo per me, però, è che non voglio memorizzare i dati per un'applicazione "destinazione" in un database dell'applicazione "sorgente", a prescindere dal fatto che io "possegga" entrambi i database o meno, ma soprattutto se la fonte è un'applicazione di terze parti. Se i dati non vengono utilizzati dall'applicazione stessa, non appartengono al suo database.

Con l'opzione 2, uno svantaggio è che i database possono essere migrati su server diversi e se i join non sono costruiti correttamente con nomi di oggetti completi - compresi i nomi di server DB forniti dinamicamente (a causa della possibilità di cui sopra essere migrati su server diversi) - quindi l'applicazione si interromperà. Un altro svantaggio è che i dati di origine potrebbero non essere memorizzati nello stesso formato del nuovo database (ad esempio un DBMS diverso), precludendo così la possibilità di un join. La cosa più importante per me, tuttavia, è il fatto che questo approccio viola Separazione dei dubbi perché il livello dati deve eseguire alcuni chirurgia imbarazzante e discutibilmente inefficiente per rendere le due entità in oggetti di dominio separati o lo strato di dominio deve avere un ibrido bestiale nodoso delle due entità disparate. In ogni caso, odora.

L'opzione 3 mi sembra la migliore, ma ha ancora il rovescio della medaglia sul fatto che ci sia un sovraccarico nel popolamento e nella manutenzione del magazzino. Qualche "processo" deve fare questo. Da dove viene eseguito quel processo ... da un server di medio livello? Con quale frequenza viene eseguito e cosa succede se l'applicazione richiede dati non ancora aggiornati? Chi lo amministra?

Qualcuno sa di un altro approccio che non ho preso in considerazione, o qualcuno può offrire qualche idea di uno qualsiasi degli approcci di cui sopra ha (per esempio, suggerire modifiche agli approcci che precludono i lati negativi o spiegami perché un approccio è il migliore nonostante i suoi lati negativi)?

    
posta rory.ap 20.02.2015 - 20:29
fonte

3 risposte

1

Ci sono alcune domande da porre:

  • I dati esterni hanno un PK di data / ora o un PK incrementale che ti consentirebbe di sapere quali erano gli ultimi dati che hai già elaborato?
  • Hai bisogno di elaborare solo nuovi dati o vecchi dati che sono stati modificati anche?

Se i dati esterni hanno un PK di data / ora o un PK incrementale, lo stato necessario sarà l'ultimo timestamp o il valore di chiave incrementale elaborato. Puoi salvarlo in una tabella nel database di destinazione.

Vorrei suggerire il seguente approccio:

  • Un lavoro crontab A legge il database esterno (il consumatore dovrebbe essere il responsabile di estrarre i dati) e popola una tabella temporale.
  • Un altro cron job B legge quei dati, che sono già nel tuo database, e li elabora, generando i dati di output nelle tabelle formali. Quindi salva lo "stato" in una tabella (l'ultimo timestamp o la chiave incrementale del database esterno elaborato).
  • Un altro cron job C cancella dalla tabella temporale tutti i dati che sono già stati elaborati (puoi dedurre quali righe eliminare confrontando con il valore "stato" salvato dal lavoro B)

Questo approccio funziona solo per i nuovi dati. Se hai bisogno di elaborare vecchi dati (dati precedentemente elaborati ma modificati nell'origine), le cose si complicano.

Tieni presente che questo approccio è diverso dal tuo terzo (datawharehouse) in quanto i dati vengono memorizzati solo temporaneamente.

    
risposta data 21.02.2015 - 01:04
fonte
0

La soluzione ideale sarebbe che la tua applicazione sorgente esponga un livello SOA per consentire alle applicazioni esterne di accedere ai dati.

In caso contrario (o dove il volume della query è grande eo intenso), la replica del database è una buona soluzione, sempre assumendo che la tecnologia sia implementata per farlo in modo affidabile.

In mancanza delle due soluzioni di cui sopra, vorrei fare un dump completo dei dati! È più facile da codificare (spesso solo usando le utilità DBMS), non ci sono problemi di risincronizzazione, sincronizzazione e controllo da gestire. Oltre a qualsiasi soluzione che tenti di eseguire le ultime modifiche, sarà necessario un processo completo di dump dei dati per il caricamento iniziale e l'inevitabile risincronizzazione dopo gli scoppi operativi.

    
risposta data 21.02.2015 - 01:24
fonte
0

Ho trovato una soluzione "ibrida". E potresti dargli un pensiero. Capisco che non sia desiderabile modificare il database di terze parti, o, a volte non è nemmeno possibile perché non si ha accesso alle fonti del cliente, giusto?

Nel mio caso, i dati di origine non avevano nulla che potessi "referenziare" come "updatedOn" o qualsiasi timestamp o log attendibili .. Avevo anche bisogno di tenere traccia di CRUD. Non solo aggiunte.

Quindi, cosa ho fatto - ho posizionato dei trigger su quei tavoli che devi monitorare e tutti questi trigger - popolano le mie INFO TABLES con quello che è successo a quale record. Io controllo quei tavoli ogni 30 secondi, ma nel tuo caso è quotidiano. Il punto è: sai esattamente cosa è stato cambiato e non elaborare dati aggiuntivi. Dopo l'elaborazione: cancella i dati elaborati dalle tue INFO tabelle ..

Nel mio caso gli unici oggetti "estranei" nel database di terze parti sono i trigger e la tabella aggiuntiva per la registrazione delle modifiche. Questo approccio ha superato gli aggiornamenti di terze parti, basta eseguire lo script per ricreare i trigger, se necessario, dopo l'aggiornamento.

    
risposta data 22.04.2015 - 04:25
fonte