Abbiamo introdotto una prima modalità di recupero dei dati, modalità che abbiamo definito IT/Ops. Vi ricordo che IT/Ops è un termine abbastanza generico nel mondo SOA che tipicamente viene usato per identificare quei componenti prettamente tecnologici il cui scopo è gestire l’aggregazione di dati.
Il problema che vogliamo risolvere credo sia abbastanza chiaro, nel caso nel post precedente ne parliamo in dettaglio.
Batching
Come dicevamo il sogno sarebbe poter dire al client, ma soprattutto al team di sviluppatori che gestiscono il client: fai quello che vuoi come l’hai sempre fatto. Per capirci meglio immaginate uno scenario basato su una Single Page Application, quello che sarebbe bello è evitare di avere per forza il concetto di IT/Ops nel client e lasciare che il client possa emettere tutte le richieste http che vuole e queste vengano in qualche modo raggruppate come meglio possibile.
Si-Può-Fare <cit.>
Come al solito un’immagine vale mille parole:
Quello che succede è “abbastanza” semplice:
- Ottengo la lista delle chiavi degli elementi che devo visualizzare
- Notifico il mondo client che la lista di chiavi è pronta
- Ogni componente client emette tutte le richieste http che vuole
- Il “client side request tracker”
- intercetta, ogni framework per SPA vi permette di farlo, tutte le richieste uscenti
- accumula le richieste su base temporale, quindi fintanto che per x millisecondi non c’è una richiesta, accumulo
- Sfruttando il supporto di HTTP per il batching emette una richiesta HTTP batch
- La risposta che torna indietro è automaticamente gestita da HTTP e spacchettata
È molto, ma molto, più semplice: è tutto oro quel che luccica?
Direi che la semplicità della cosa è evidente, se non altro superficialmente evidente. Ci sono due insidie però che devono essere attentamente valutate prima di scegliere questa strada oppure quella basata sui concetti di IT/Ops:
- Nel raggruppare le richieste HTTP uscenti bisogna tener conto della destinazione, ergo non possiamo banalmente raggruppare, ma dobbiamo raggruppare ciò che va verso Shipping con Shipping e Warehouse con Warehouse, non è complesso ma come sappiamo il diavolo sta nei dettagli
- Una volta che abbiamo raggruppato client side, abbiamo solo spostato il problema, è questa è una rogna:
- La richiesta HTTP Batch arriva al server
- Il server in maniera trasparente la “spacchetta” e invoca le risorse come se fossero richieste fisicamente separate
- Questo comporta che se stiamo richiedendo 10 descrizioni di prodotti diversi, abbiamo 1 richiesta HTTP uscente, ma 10 diverse esecuzioni server side e una risposta HTTP. Le 10 esecuzioni server side sono nuovamente il select n + 1 da cui stiamo scappano
L’unica vera soluzione è quindi scrivere, se la tecnologia server side lo consente, un “HTTP batch handler” che sappia come gestire questo scenario. Ecco, io personalmente, eviterei anche.
Ci sono ancora due possibili approcci che sono una variazione sul tema IT/Ops o Batching, approcci che per certi versi possiamo raggruppare sotto il cappello Proxy. Un po’ di pazienza e svisceriamo anche quello.
Post in questa serie:
Piccolo spazio pubblicità:
Tratterò di questi temi, e molto altro ancora, in un workshop durante l’edizione milanese di Codemotion 2016: Microservices development deep dive.