Architettura dei microservizi: localizzazione della logica di base in una base di codice separata

1

Mi sono allontanato da un progetto per alcune settimane. Prima di lasciare l'organizzazione stava discutendo un modello architettonico per i nostri microservizi. In genere, un'istanza svolge due ruoli nella nostra organizzazione.

  1. Riceve richieste RESTful e le elabora di conseguenza
  2. Funziona come un processore batch, leggendo grandi quantità di dati e elaborandoli.

Andando avanti probabilmente vorremmo separare l'elaborazione in batch dalla gestione REST. La questione del modo migliore per separare queste preoccupazioni era in discussione. Una delle nostre proposte era di configurare il nostro processo di implementazione build in modo che un'istanza potesse essere distribuita in modalità web o in modalità caricamento dati. Mi è piaciuto in particolare questo approccio perché il bilanciamento del carico sarebbe stato facilitato con questo approccio in quanto è stato possibile aumentare o diminuire il numero di istanze in base alla quantità di lavoro disponibile per un'attività specifica del contesto.

Tuttavia, al mio ritorno ho scoperto che era stato definito un paradigma diverso: vogliono creare due repository di codice sorgente aggiuntivi per un totale di 3 progetti:

  1. Un progetto comune che contiene tutta la logica a livello di servizio e deposito, oltre agli oggetti dominio.
  2. Un progetto web che fa riferimento a common per gestire il traffico REST
  3. Un progetto dataloader che fa riferimento a common per gestire attività ad alta intensità di dati

Non sono davvero un fan di questo approccio. Per prima cosa, tutti i nostri test di integrazione sono ora nel progetto web e stiamo davvero testando la logica al n.1 (possiamo fare una revisione dei nostri test per favorire l'integrazione / test unitari a livello comune, ma ci vorrà tempo e sudore ). Il ciclo di debug / sviluppo è davvero scomodo in quanto gli errori rilevati in 2 o 3 richiedono di tornare indietro a 1 per apportare modifiche, aggiornare la dipendenza di esperti e tornare ai test. Lavorare con queste dipendenze incluse è davvero un problema in generale.

È fattibile, ma richiede più tempo. Mi ha davvero fatto pensare al concetto di esperienza degli sviluppatori . Non penso che ne parli, ma penso che sia importante tanto quanto l'esperienza dell'utente. Soprattutto perché questo è un progetto che ha un ciclo di sviluppo aggressivo. Lo sviluppo sul ramo in cui viene implementato è davvero ingombrante e ... noioso!

I motivi della gestione per favorire questo approccio non sembrano adattarsi al disagio. Alcuni argomenti che ho sentito è che il codebase sarà troppo grande senza questa separazione. Sto anche sentendo che potrebbero voler distribuire una versione della libreria comune per i dati e una diversa per il web (non riesco a immaginare un caso d'uso valido per questa richiesta).

Mi chiedo se qualcun altro ha esposizione a questo stile architettonico che, a mio parere, sembra un anti-modello. Sono prevenuto contro un approccio valido? Presto mi rivolgerò alla direzione per raccomandare di tornare a una base di codice singolo ma organizzandola come un progetto a più moduli (3 file di build, distribuibili in base al contesto).

    
posta IcedDante 09.07.2018 - 17:28
fonte

2 risposte

1

Non posso presumere di sapere abbastanza su cosa stai trattando, in particolare. Tuttavia, nello sviluppo del software ci sono trade-off e questi trade-off devono essere considerati con i benefici e i rischi associati alla scelta. Quindi consiglierei di andare al tuo incontro con una mente aperta, in modo da poter capire qual è l'obiettivo finale. Ho la sensazione che il cambiamento sia ancora in corso.

Può esserci un vantaggio nel dividere l'elaborazione dei dati e l'elaborazione web?

Certo. Questa non era la tua domanda, dal momento che non eri contraria allo split, ma come è stato fatto.

Dove dovrebbero essere tracciate le linee di confine?

Questa domanda, e il fatto che era un'applicazione di qualche giorno fa (secondo il tuo commento), mi porta a credere che questa non sia stata ancora esaudita. In altre parole, hai un lavoro in corso.

In generale:

  • Test di unità e integrazione dovrebbero essere eseguiti il più vicino possibile al codice sotto test. È meglio prenderlo prima di spingere le modifiche piuttosto che guardare più progetti diventare rossi a causa di un errore evitabile.
  • Mantieni le cose il più semplici possibile.
  • Semplifica dopo.

Dato che questo è un work in progress, ci saranno pezzi che sono nella libreria Common ora che dovrebbero essere spostati altrove. Ciò non significa che questo sia necessariamente l'approccio sbagliato, ma che c'è ancora molto lavoro da fare.

Perché i repository separati?

Ci possono essere ragioni legittime, e queste ragioni sono per lo più legate al business. Decidere quando creare un repository separato rispetto a un singolo repository con 3 progetti non è mai così semplice come tu (o I) vuoi. Correggimi se sbaglio, ma questo sembra essere il fulcro del tuo bruciore di stomaco.

Cosa perdi

Visitando repository separati perdi:

  • Controllo delle versioni coesivo dei tre progetti (moduli maven)
  • Avere tutto il codice sorgente necessario per un prodotto in un unico posto
  • Avere tutti i test necessari per il prodotto in un unico punto
  • Comprensione delle dipendenze principali

Cosa ottieni

Visitando i repository separati guadagni:

  • Rilasciare il controllo delle versioni in modo che un prodotto dipenda solo da una versione di common.
  • Possibilità di rilasciare aggiornamenti per l'elaborazione in batch senza compromettere l'API Web perfettamente funzionante (e viceversa)
  • Scoprire i problemi di integrazione se il comune è destinato ad essere condiviso oltre i soli due servizi.

Penso che maven / gradle faccia un lavoro migliore di risoluzione delle dipendenze dopo aver diviso i progetti in repository rispetto a Nuget (C #). Questa è una ragione legata alla tecnologia (i riferimenti diretti al progetto aiutano a sviluppare nuove funzionalità in modo coesivo, ma il pacchetto nuget generato potrebbe non avere le dipendenze corrette dichiarate).

Ci saranno mal di testa

Anche se personalmente avrei iniziato con un repository e 3 progetti (ad esempio i moduli Maven) come suggerivi tu, sarebbe per il lavoro iniziale.

Separare la logica che era una volta in un progetto è sempre una cosa complicata, non importa quanto attentamente l'hai realizzata. Nei sistemi ben realizzati, il 90% del lavoro è facile, ma il resto ha a che fare con la ricerca di tutti i piccoli modi in cui la tua app si è rotta perché il codice non è più conforme alle ipotesi in base alle quali è stato sviluppato.

Ci sono due filosofie con modifiche di questo tipo:

  • Elimina il cerotto e risolvi il problema.
  • Riattacca lentamente il cerotto un po 'alla volta.

Sembra che la tua squadra abbia optato per il primo approccio.

    
risposta data 09.07.2018 - 20:37
fonte
1

Sono diffidente delle tue obiezioni. Solitamente perché sono io ad aggiungere progetti, a separare elementi in componenti che aggiungono server di compilazione e implementazione di polpo, ecc. E mi sono lamentato di "rendere le cose difficili da eseguire il debug!"

Lasciate che le vostre obiezioni assumano il valore nominale e supponiamo che, sì, sia una configurazione molto strana che aggiunge un sacco di noiose attività di amministrazione alla routine quotidiana degli sviluppatori senza alcun beneficio.

Sono abbastanza sicuro che siamo stati tutti lì in una misura o nell'altra. per esempio devo aumentare i fastidiosi biglietti per le altre squadre per cambiare i firewall o installare aggiornamenti, ecc., il che è un vantaggio per un vantaggio organizzativo minore.

A volte sei persino costretto a scrivere test unitari !! RIDICOLO!!! IL MIO CODICE È PERFETTO !!

L'esperienza dello sviluppatore è una cosa. Se le cose sono facili, lo sviluppo procede velocemente, se devi rallentare la procedura fastidiosa, le cose rallentano. Diventa noioso.

Ma la cosa bella di poter codificare è che puoi automatizzare le cose. (Oppure scarica le automazioni che altre persone hanno scritto e installale). Così mi piacerebbe rotolare con esso, creare modelli per i tuoi biglietti, automatizzare i tuoi noiosi processi di compilazione, assumere i tester per scrivere gli stupidi test e rispondere alle domande di overflow dello stack durante la compilazione.

    
risposta data 09.07.2018 - 20:45
fonte

Leggi altre domande sui tag