... quando richiede molti dati di input?
Situazione attuale
Stiamo implementando (e ora stiamo mantenendo) un'applicazione web per lo shopping online in un'architettura di microservizi.
Uno dei requisiti è che l'azienda deve essere in grado di applicare le regole su ciò che i nostri clienti aggiungono al proprio carrello, al fine di personalizzare la propria esperienza e l'eventuale ordine. Ovviamente, è stato necessario mettere in atto un motore di regole aziendali e abbiamo implementato uno specifico "microservizio" per questo (se potessimo chiamarlo ancora così).
Nel corso di un anno, questo motore di regole è diventato sempre più complesso, richiedendo sempre più dati (ad esempio il contenuto del carrello ma anche le informazioni dell'utente, il suo ruolo, i suoi servizi esistenti, alcune informazioni di fatturazione, ecc.) essere in grado di calcolare quelle regole.
Per il momento, il nostro shopping-cart
microservice sta raccogliendo tutti questi dati da altri microservizi. Anche se parte di questi dati viene utilizzata da shopping-cart
, la maggior parte delle volte viene utilizzata principalmente per alimentare il motore delle regole.
Nuovi requisiti
Ora arriva la necessità di altre applicazioni / microservizi per riutilizzare 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'è, affronteremo 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;
- continuando in questa direzione, dovremo trasferire questi dati in tutta la rete per molte richieste (pensiamo a μs A chiamando μs B chiamando il motore delle regole, ma A ha già alcuni dei dati necessari al motore delle regole);
-
shopping-cart
è diventato enorme a causa di tutti i recuperi di dati; - Probabilmente dimenticherò molti ...
Che 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 shopping-cart
in modo tale che i dati siano più probabilmente presenti prima di noi chiama il motore delle regole e mantieni un'esperienza utente accettabile.
Alcune idee
- Lascia che il motore delle regole recuperi i dati di cui ha bisogno. Ciò aggiungerebbe ancora più complessità ad esso, violando il principio di responsabilità singola ( ancora più ... );
- Implementa un proxy μs prima del motore delle regole per recuperare i dati;
- Implementa un "data fetcher" μs che il motore delle regole chiama per recuperare tutti i dati di cui ha bisogno contemporaneamente (richiesta composita).