Cache lato server semplice per Express.js con Node.js

Questo blog è stato scritto da Guilherme Oenning, che è uno sviluppatore software senior presso SoftwareONE. Crede davvero che l'apprendimento non finisca mai e la condivisione delle conoscenze sia la chiave per la crescita. Quando non sta programmando, può essere trovato a correre o in bicicletta per Dublino, in Irlanda.

Express è il framework web più estensibile che abbia mai visto finora. L'architettura del middleware del framework semplifica il collegamento di funzionalità extra con il minimo sforzo e in modo standardizzato.

Per questo articolo, tratteremo un middleware molto piccolo, semplice, ma potente e utile che ti aiuterà a migliorare le prestazioni delle tue applicazioni web espresse senza alcuna dipendenza esterna.

Informazioni sulla cache lato server

La memorizzazione nella cache è una tecnica comunemente utilizzata per migliorare le prestazioni di qualsiasi applicazione, sia essa desktop, mobile o web. Quando si ha a che fare con applicazioni Web, è possibile fare un buon uso della memorizzazione nella cache lato client utilizzando le intestazioni di risposta attualmente supportate da tutti i browser. E se avessimo una pagina complessa e pesante che impiega 2 secondi per generare l'output HTML? Anche se abilitiamo la cache lato client per questa pagina, il server Web dovrà comunque rendere la pagina per ogni diverso utente che accede al nostro web applicazione. Pensa alla home page di un grande portale di notizie; elaborano il loro codice HTML più e più volte per ogni visitatore?

Qui è utile la cache sul lato server. L'obiettivo della cache lato server è rispondere allo stesso contenuto per la stessa richiesta indipendentemente dalla richiesta del client. Nel nostro esempio sopra, la prima richiesta che raggiunge il nostro server impiegherebbe comunque 2 secondi per generare l'HTML, ma le seguenti richieste colpirebbero invece la cache e il server sarebbe in grado di inviare la risposta in pochi millisecondi.

Esistono molti modi per farlo, potrebbe essere fatto con NGINX o un CDN come CloudFlare, ma in questo esempio vedremo come farlo con Node.js ed Express con un lavoro minimo e in modo flessibile.

Mostrami il codice!

Il nostro obiettivo qui è abilitare la cache lato server per la nostra applicazione con il minimo sforzo. Facciamolo!

Faremo uso del modulo npm della cache di memoria per poter aggiungere contenuto alla cache. Il nostro middleware cache è il seguente.

Fondamentalmente cercherà un valore memorizzato nella cache utilizzando l'URL della richiesta come chiave. Se viene trovato, viene inviato direttamente come risposta. Se al momento non è memorizzato nella cache, avvolgerà la funzione di invio di Express per memorizzare nella cache la risposta prima di inviarla effettivamente al client e quindi chiamare il middleware successivo.

Questo è un esempio molto semplice su come memorizzare nella cache una pagina di elaborazione pesante.

Si noti che il percorso sopra contiene due middleware. Il primo è il riferimento alla cache e il secondo è il vero middleware che gestisce la richiesta. In questo caso, quando il server riceve la prima richiesta per questa route, attenderà 5 secondi prima di inviarlo al client. Ma successivamente, le chiamate consecutive riceveranno il corpo della risposta memorizzato nella cache per i prossimi 10 secondi e, ovviamente, non dovranno più attendere quei 5 secondi.

Il rovescio della medaglia è se hai qualcosa che deve essere dinamico. Nel percorso sopra, abbiamo passato la data corrente come argomento al motore di visualizzazione. Il corpo della risposta memorizzato nella cache avrà la stessa data fino alla scadenza della cache (in questo caso 10 secondi).

La cosa interessante qui è che funziona per route che rispondono con HTML, JSON, XML o qualsiasi altro tipo di contenuto. Può essere utilizzato per potenziare un semplice sito Web fino ad un'applicazione Express pesante, complessa e basata su REST.

È possibile collegarlo facilmente a qualsiasi applicazione Web Express esistente semplicemente aggiungendo il middleware della cache per ogni route che si desidera memorizzare nella cache.

Importante: i metodi PUT, DELETE e POST non devono mai essere memorizzati nella cache.

Per questo esempio abbiamo usato un modulo npm che memorizza nella cache il contenuto in memoria, questo ha alcune implicazioni positive e negative.

  • La cache in memoria è l'opzione più veloce disponibile; è facile da lavorare, non è necessaria alcuna dipendenza esterna;
  • Perderemo il contenuto memorizzato nella cache se il server o il processo non funzionano;
  • Poiché memorizza il contenuto memorizzato nella cache nella propria memoria di processo, non verrà condiviso tra più processi node.js;

Un'altra opzione per risolvere la maggior parte di questi problemi è l'utilizzo di un servizio di cache distribuita come Redis. Potrebbe essere fatto con un singolo modulo npm express-redis-cache che implementa già Express un middleware.

Codice completo

Puoi trovarlo qui: https://glitch.com/edit/#!/server-side-cache-express.

Il contenuto è originariamente apparso sul blog personale di Guilherme. Grazie a Simeon Vincent per aver fornito una modifica tecnica su questo post.