Rapporti nell'architettura dei microservizi

4

ESIGENZE

Supponiamo di voler generare un report excel con i dati dal microservice A e presentarlo nel microservice B. Possiamo ottenere i dati con qualche operazione pianificata o giù di lì.

POSSIBLE SOLUTIONS

Più semplice Aggiungiamo una funzionalità di report al microservice B e generiamo report.
Pro
Generazione abbastanza rapida e immediata (non è necessario archiviare i file)
Contro:
Secondo me è una violazione del contesto limitato. Mescoliamo due funzionalità, anche se in realtà ne usiamo un'altra.

Estrazione di nuovo microservizio dedicato per i report
Creiamo un microservizio C che raccoglie aggregati di dati per i report da A e lo serve per B.
Pro
Separazione delle responsabilità. A mio parere, il contesto limitato non viene violato.
Contro:
O devi inviare un file excel generato tra microservices (idea terribile) o aggregati (non ideale anche). La soluzione per questo potrebbe essere la generazione di un collegamento al documento e inviarlo a B per reindirizzare l'utente. Questa sembra essere una buona idea, ma d'altra parte abbiamo bisogno di memorizzare il documento generato (in opposizione alla generazione al volo).

Qual è la tua esperienza in situazioni simillari? Forse qualcuno ha un altro approccio?

Aggiorna

Sto aggiungendo uno schizzo per illustrare meglio un problema reale.

    
posta kadiii 27.01.2017 - 10:27
fonte

5 risposte

3

OK, questo non è un problema di contesti limitati.

Puoi avere più di un servizio in un contesto limitato, ed è impossibile dire cosa dovrebbe andare in quale contesto quando estrai la funzionalità a nomi semplici come "A" e "B".

La cosa fondamentale da capire è che i micro servizi dovrebbero essere micro o anche nano

la tua preferenza dovrebbe generalmente essere quella di aggiungere un nuovo servizio piuttosto che ampliarne uno esistente.

Modifica - riepilogo dei commenti:

L'applicazione che consuma dovrebbe effettuare la chiamata direttamente al micro-servizio. Se sono richieste informazioni aggiuntive, l'API di consumo deve preferibilmente chiamare i micro-servizi necessari per creare prima quei dati, quindi inviarli al micro-servizio del report.

Preoccupazioni trasversali come l'autorizzazione / autenticazione possono essere gestite generando un token firmato piuttosto che un unico servizio di autenticazione su cui tutti gli altri servizi dipendono.

In questo modo eviti di costruire un "monolite distribuito" di servizi con tutti collegati e in dialogo tra loro.

    
risposta data 29.01.2017 - 23:25
fonte
2

La soluzione dipende dal fatto che il microservizio B contribuisca con i dati che possiede al report e se possiedi o meno il microservice A. Se B non aggiunge alcun valore al report oltre a quello che già è in A e hai il controllo su A, allora è meglio avere una generazione del report in A. Il client può invocare il servizio A direttamente in questo caso. La sicurezza e la navigazione devono essere prese in considerazione, ma la prima è la responsabilità del gateway API e il link di navigazione al report può essere fornito dal servizio B (che lo scoprirà attraverso un meccanismo interno).

Se B possiede alcuni dati e / o logica dietro il report o non possiedi il servizio A in modo da non poterlo modificare, recuperare tutti i dati da A è un mero dettaglio di implementazione ed è perfettamente ok generare report in B con dati da A.

La soluzione con microservice separato C potrebbe essere troppo complicata per questa attività e dovrebbe essere scelta solo se B è già grande, ha molte altre responsabilità non correlate alla generazione di report e se c'è un valore nel ciclo di vita separato per il componente di generazione di report.

    
risposta data 27.01.2017 - 17:13
fonte
1

Collaborazione eventi è una soluzione molto comune a questo problema.

Nel tuo caso, microservizio A pubblicherà eventi ogni volta che cambia stato mentre il microservizio B è sottoscritto ad alcuni degli eventi di A per generare un aggregato (rapporto). Per consegnare eventi da A a B puoi utilizzare un bus di messaggi (come rabbitMq ) o archivio eventi . In questo modo, sarà molto facile aggiungere ed estendere gli abbonati senza modificare gli editori. Inoltre, il tuo sistema scalerà orizzontalmente molto bene.

Una cosa molto importante da tenere a mente è che la comunicazione dovrebbe essere asincrona per evitare l'accoppiamento temporale. Puoi leggere di più sui problemi connessi alla comunicazione sincrona nell'architettura dei microservizi da questo articolo

    
risposta data 27.01.2017 - 14:08
fonte
1

OK, per prima cosa diamo la mia visione di una tipica architettura microservice, dall'alto verso il basso:

  • L'interfaccia utente utilizza i microservizi tramite un proxy. Il proxy funziona come un router e un aggregatore che espone l'API di alto livello ai tuoi microservizi
  • Il livello proxy aggregherà i microservizi e li combinerà per soddisfare il compito di alto livello.
  • Microservices. Adempiono compiti specifici molto piccoli, ad esempio gli utenti possono essere distribuiti in diversi microservizi, in genere con un archivio dati isolato.
  • Bus eventi, coda di messaggi o qualcosa di simile, fornisce l'infrastruttura per il trasferimento di messaggi, coerenza, bilanciamento del carico e talvolta repliche di dati.

Puoi posizionare il bilanciamento del carico, eseguire il failover su ogni livello o sul livello che ti piace di più.

Penso che il reporting sia un dominio molto ampio. Devi prima tagliarlo in piccoli pezzi per decidere dove metterli ciascuno. Almeno, pensa al problema come a tre argomenti molto ampi.

  1. Rapporti in tempo reale, ovvero rapporti di dati in tempo reale, come elenco di ordini, dati di monitoraggio, stato. Richiede l'accesso ai dati in tempo reale.
  2. Rapporti aggregati o riepilogati nel tempo, ovvero i totali per i periodi passati. Può essere letto da dati di sola lettura replicati.
  3. Rapporti di data mining, ovvero rapporti che dovranno analizzare tutti i dati passati (archiviati?). Richiederanno un data warehouse, un lago dati, tu lo chiami. Richiedono di elaborare o pre-elaborare i dati e archiviarli in un data store speciale, solitamente mediante l'elaborazione incrementale nel tempo.

Ora, vedi che i rapporti dovranno correlare tutti i dati di diversi microservizi.

  • Per i rapporti in tempo reale, è probabilmente necessario inserire contratti sui microservizi necessari.
  • Per i report aggregati o riepilogativi nel tempo, è possibile accedere direttamente alle repliche di lettura esistenti dei microservizi necessari e gestire la modifica dello schema nel livello di reporting. Questo è se il periodo delle repliche di lettura corrisponde alle tue esigenze di segnalazione.
  • Per il data mining, OLAP, è meglio ottenere un data scientist nel tuo team di reporting, perché dovrai affrontare problemi reali con i big data.

A seconda dell'importanza delle tue esigenze di reporting, dovrai distribuire parte nei microservizi, crearne di specializzati e sincronizzarti con la tua strategia di dati, ad esempio quanto saranno grandi le finestre di dati in tempo reale, quanto grandi saranno i tuoi dati storici la finestra sarà, e con quale frequenza verranno archiviati i dati.

Ora, la creazione del report e la generazione di un file PDF o Excel appartengono al livello di reporting. E io uso la parola layer di proposito. Le segnalazioni necessitano di microservizi per raccogliere dati (probabilmente consumando altri microservizi, accesso a repliche di sola lettura o dati archiviati), elaborazione di report, generazione di file e così via. Devono esporre interfacce di alto livello al livello proxy che devono essere utilizzate dall'interfaccia utente, come selezionare un report, riempire i parametri del report, recuperare un file.

risposta

  • Crea un livello di segnalazione.
  • Per la raccolta dei dati: consumare microservizi per report semplici in tempo reale, poiché l'aggregazione dei microservizi aumenterà di complessità e le prestazioni ne risentiranno. Creare una strategia per accedere direttamente alle repliche di sola lettura. Creare un data warehouse, un data lake e ottenere un data scientist se si hanno a che fare con i big data. Esplora i database del grafico come Graph Engine www.graphengine.io o Neo4j neo4j.com
  • Per l'elaborazione dei rapporti: crea i microservizi necessari che consumano i dati dai microservizi di raccolta dei dati e utilizza il proprio archivio dati isolato per l'esito del rapporto.
  • UI: crea i tuoi microservizi di alto livello sul livello proxy.
risposta data 24.07.2017 - 14:55
fonte
0

Il rapporto generato in A contiene più o è più ampio di quello che presenterai tramite B?

Esiste A solo per B o altri servizi che utilizzano anche il rapporto?

Se A è usato solo con B, allora unirli. Non farei C.

Questa architettura dell'architettura dei microservizi sta ovviamente portando a una potenziale frammentazione, ora applicate la coesione e la separazione delle preoccupazioni a livello del processo, dove tradizionalmente le applichereste a livello di componente / classe / funzione all'interno di un processo. Penso che sia ancora più sano iniziare da lì ed evitare una proliferazione di processi.

    
risposta data 27.01.2017 - 11:07
fonte

Leggi altre domande sui tag