Situazione attuale
Stiamo implementando (e ora gestendo) un'applicazione web per lo shopping online in un'architettura a microservizi.
Uno dei requisiti è che l'azienda deve essere in grado di applicare le regole su ciò che i nostri clienti aggiungono al loro carrello, al fine di personalizzare la loro esperienza e l'eventuale ordine. Ovviamente, è stato necessario istituire un motore per le regole aziendali e per questo abbiamo implementato uno specifico "microservizio" (se potessimo ancora chiamarlo così).
Nel corso di un anno, questo motore di regole è diventato sempre più complesso, richiedendo sempre più dati (ad es. Contenuto del carrello ma anche informazioni sull'utente, il suo ruolo, i suoi servizi esistenti, alcune informazioni di fatturazione ecc.) Per poter calcolare quelle regole.
Per il momento, il nostro shopping-cart
microservizio sta raccogliendo tutti questi dati da altri microservizi. Anche se una parte di questi dati viene utilizzata shopping-cart
, la maggior parte delle volte viene utilizzata principalmente per alimentare il motore delle regole.
Nuovi requisiti
Ora arriva la necessità che altre applicazioni / microservizi riutilizzino il motore delle regole per requisiti simili. Nella situazione attuale, dovrebbero quindi trasmettere lo stesso tipo di dati, chiamare gli stessi microservizi e costruire (quasi) le stesse risorse per poter chiamare il motore delle regole.
Continuando così com'è, dovremo affrontare diversi problemi:
- tutti (chiamando il motore delle regole) devono reimplementare il recupero dei dati, anche se non ne hanno bisogno per se stessi;
- le richieste al motore delle regole sono complesse;
- proseguendo in questa direzione, dovremo trasportare questi dati in tutta la rete per molte richieste (pensate a μs A che chiama μs B che chiama il motore delle regole, ma A ha già alcuni dei dati necessari al motore delle regole);
shopping-cart
è diventato enorme a causa di tutto il recupero dei dati;- Probabilmente dimentico molti ...
Cosa possiamo fare per evitare questi problemi?
Idealmente, eviteremmo di aggiungere più complessità al motore delle regole. Dobbiamo anche assicurarci che non diventi un collo di bottiglia, ad esempio alcuni dati sono piuttosto lenti da recuperare (10 o anche più), quindi abbiamo implementato il pre-recupero in modo shopping-cart
tale che i dati abbiano maggiori probabilità di essere lì prima di chiamare le regole motore e mantenere un'esperienza utente accettabile.
Qualche idea
- Lascia che il motore delle regole recuperi i dati di cui ha bisogno. Ciò aggiungerebbe ancora più complessità, violando il principio della singola responsabilità ( ancora di più ... );
- Implementare un proxy μs prima del motore delle regole per recuperare i dati;
- Implementa un "fetcher di dati" che il motore delle regole chiama per recuperare tutti i dati di cui ha bisogno in una sola volta (richiesta composita).
shopping-cart
, ma potremmo facilmente adattarla alle esigenze degli altri microservizi (sono ancora legati a utenti, prodotti e ordini). A nostro avviso, avranno bisogno degli stessi dati di input, soprattutto perché l'azienda è in grado di scegliere i predicati da applicare. Tutti i dati sono forniti da altri microservizi ad eccezione del contenuto del carrello stesso. Il recupero dei dati non è di per sé complesso, ma diventa complesso quando si devono chiamare ~ 10 altri microservizi e mantenere la struttura prevista dal motore delle regole.