Architettura orientata ai servizi - Responsabilità dei componenti

3

Lavorare su un progetto di e-commerce in cui un'applicazione PHP (back-end e non-customer facing) è attualmente responsabile dell'elaborazione di un ordine dalla fase di checkout fino alla generazione di report di profitti / perdite, elaborazione dell'ordine e anche esecuzione di vari algoritmi su per conto di un team di scienza dei dati.

I componenti algoritmici verranno estratti in un'applicazione separata (python). PHP invierà un payload json tramite curl fino a un end-point dell'applicazione python / passando il payload su una coda beanstalk o simile. Tuttavia, vi sono opinioni contrastanti su quale sia l'applicazione responsabile di cosa.

Lo sviluppatore python desidera che lo sviluppatore PHP prepari e invii un grande carico utile (qty, valore dell'ordine, dati demografici degli utenti, ecc.). Fondamentalmente tutto ciò che lo sviluppatore python richiede per eseguire i loro algoritmi.

Lo sviluppatore Php crede che tutto il servizio python richiesto sia order_id e da questo, può estrarre tutte le informazioni di cui ha bisogno per eseguire qualsiasi algoritmo richiesto dal database. Lo sviluppatore php sostiene inoltre che se sta facendo tutta la preparazione dei dati, allora potrebbe anche eseguire gli algoritmi in quanto la responsabilità passante per il servizio diventa ridondante dato che gran parte del lavoro è già stato fatto.

C'è una scelta giusta o sbagliata? qualcuno potrebbe fornire argomenti decenti da considerare da entrambe le parti? Qualcuno potrebbe raccomandare risorse per aiutare a comprendere l'architettura orientata ai servizi "interna"?

    
posta Gravy 18.11.2014 - 00:43
fonte

2 risposte

3

Se il front end è responsabile per il "grande payload" per l'elaborazione da parte del back-end Python, si ha un alto grado di accoppiamento tra i due sistemi che significa che la manutenzione, la gestione delle modifiche o il refactoring diventano più complessi poiché entrambi i lati della comunicazione richiedono una riprogettazione interdipendente significativa per gestire l'invio e la ricezione dei dati.

Inoltre, implicitamente, un nuovo archivio dati viene creato nei protocolli di trasmissione (anche se transitorio) mentre i dati sono formattati dal front-end, trasmessi e analizzati dal back-end.

Inviando solo l'indice nei dati del database rimuovi il problema di un strong accoppiamento e le modifiche a entrambe le estremità del processo possono avvenire con (solitamente) poca dipendenza dall'altra parte. Inoltre, sono presenti meno errori di insinuazione perché non vi è alcuna formattazione di messaggi di grandi dimensioni e quindi l'analisi di tali messaggi. Inoltre, hai una scalabilità facile perché in futuro potresti aggiungere più elaborazione front-end e più elaborazione back-end senza preoccuparti di quali front-end connetterti a quali back-end (che è tutto gestito dalla lettura dei back-end) da un archivio dati comune).

Questo presuppone che tu abbia, e continuerai ad avere, accesso diretto al database da entrambi i sistemi, cioè che non hai intenzione di riposizionare entrambi i lati del dialogo per rimuovere i sistemi in futuro. Se in futuro trasferirai uno dei sistemi dalla connettività diretta al database, allora

Ovviamente i problemi di invio di messaggi di grandi dimensioni come questo sono gestibili (per alcuni sistemi non esiste un accesso diretto a un database condiviso) ma aggiungono un livello di complessità che sembra non sia necessario prendere in considerazione.

    
risposta data 18.11.2014 - 08:46
fonte
0

Cercherò di evitare qualsiasi soluzione che richieda la condivisione di un database tra il front-end e un servizio back-end, perché la mia esperienza è che i database condivisi causano un accoppiamento molto più difficile da districare rispetto a un formato di scambio complesso .

Presumo che i dati vengano inizialmente raccolti dal front-end e quindi passati al servizio una volta completato l'ordine. In questo caso, legare il servizio back-end tramite il database significa che è probabile che qualsiasi modifica nel formato dei dati richieda sia il front end che il back end per cambiare.

Ci sono anche implicazioni sulla sicurezza. È auspicabile eseguire i servizi nel modo più sicuro possibile; questo spesso significa che vengono eseguiti su una macchina separata per il front-end, che deve essere esposto a Internet in generale. Idealmente, avremmo un database sicuro per il servizio che non è accessibile dal front-end della macchina; questo riduce al minimo le conseguenze di un compromesso al front end (impedendo ad un hacker, ad esempio, di modificare gli ordini già accettati per aggiungere ulteriori oggetti). Questo è più difficile da ottenere se il servizio deve accedere anche al database front-end. Questo potrebbe non essere qualcosa che intendi fare ora, ma scegliendo di passare a soa ottieni questo tipo di flessibilità per i futuri miglioramenti, quindi sarebbe un peccato chiuderli prima di iniziare davvero.

    
risposta data 18.11.2014 - 09:54
fonte

Leggi altre domande sui tag