Recentemente ho iniziato a lavorare su un'applicazione web Spring, in cui una cache per alcuni dati pesantemente utilizzati è memorizzata nella JVM di ciascun nodo nel cluster AWS. Qualsiasi modifica in uno qualsiasi dei valori del nodo comporta una chiamata REST a tutti i nodi per aggiornare la cache nella JVM. Ci sono molti problemi in questo design, principalmente:
-
La raccolta utilizzata per la cache è HashMap, che non è thread-safe
-
Le informazioni dei nodi sono memorizzate nel DB e questo è anche memorizzato in questa cache. Ogni errore di cache risulterà nel saltare completamente il nodo risultante in valori non aggiornati.
-
Chiamate REST non sicure tra i nodi per aggiornare la cache.
-
L'origine della verità è la cache, non il DB. In caso di mancanze della cache, il DB non viene inviato.
IMO, l'approccio ideale è usare una cache centralizzata come EHCache o Redis o usare qualcosa come Hazelcast. Quali sono gli altri modi in cui un tale problema è risolto?