Caching dei dati di autenticazione
Domanda
Al momento sto implementando un servizio REST web utilizzando CouchDB e Restlet. Lo strato Restlet è principalmente per l'autenticazione e alcuni minori filtraggio dei dati JSON servita da CouchDB:
Clienti <= HTTP => [Restlet <= HTTP => CouchDB]
sto usando CouchDB anche ai dati di login archivio utenti, perché io non voglio aggiungere un server di database aggiuntivo a tale scopo. Così, ogni richiesta al mio servizio fa sì che due CouchDB richieste condotta da Restlet (autenticazione di dati + richiesta "reale"). Al fine di mantenere il servizio come efficiente possibile, voglio ridurre il numero di richieste, in questo caso ridondanti richieste di dati di accesso.
La mia idea è ora quella di fornire una cache (i.e.LRU-Cache tramite LinkedHashMap) all'interno della mia applicazione Restlet che le cache dei dati di accesso, perché HTTP caching probabily non essere sufficiente. Ma come faccio a invalidare i dati della cache, una volta che un utente cambia la password, per esempio. Grazie a riposare, l'applicazione potrebbe funzionare su più server in parallelo, e non voglio creare un'istanza centrale solo per i dati della cache di accesso.
Al momento, risparmio chiesto i dati auth nella cache e cerco di autenticarsi nuove richieste usandoli. Se l'autenticazione non riesce o non v'è ormai entrata a disposizione, ti invio una richiesta GET al mio stoccaggio CouchDB al fine di ottenere i dati effettivi di autenticazione. Quindi, in un caso peggiore, gli utenti che hanno cambiato i loro dati saranno forse ancora in grado di effettuare il login con i loro vecchi credenziali. Come posso fare con questo?
O che cosa è una strategia buona per mantenere la cache (s) up-to-date in generale?
Grazie in anticipo.
Soluzione
A me sembra che sei cresciuto abbastanza da usare qualche soluzione cache "professionale" (ad esempio, EHCache ). Tutte le cache distribuite permettono nuova replica dei dati e invalidazione tra i diversi nodi in modo che il problema è già risolto.
Altri suggerimenti
Un distribuito cache in memoria come memcached potrebbe essere quello che state cercando. È possibile configurare l'età dell'oggetto, delle dimensioni della cache ed esporre anche le richiamate per rimuovere oggetti specifici dalla cache (come quando l'informazione è stantio).