Forzatura aggiornamento della cache

0

Stoaggiornandoun'applicazionewebtomcatesistenteperleggeredeterminaterisorsedaun'APIREST.Attualmentel'applicazionelileggedafileflat.Poichél'applicazioneèmoltocritica,hoaggiuntounlivellodimemorizzazionenellacacheinmodocheglioggettirestituitidall'APIRESTsianosempredisponibili.

NellivellodiserviziodelclientAPI,sel'elementorichiestanonvienetrovatonellacache,larichiestaverràinviataall'APIeffettiva,larispostaverràinseritanellacachediMapDBerestituitaalchiamante.IllistenerdiavviochiamaunsaccodiAPIconparametridiversiinmodochetuttiidatisianooranellacachediMapDB.Nonimpostounascadenzasugliarticolinellacacheperchévogliochesianosempredisponibili,amenochenonsiaggiornisurichiesta.

Ilproblemaèchel'appWebeilclientAPIsonoprogettidiversi.PoichéilclientAPIdecidedileggeredallacacheodall'API,nonsonoingradodiforzareilvaloredellacachediaggiornamentodall'applicazione.

  • DevoaggiungereunaltroparametropereseguirelechiamatechefaccioalclientAPIo

    Objectobj=ServiceFactory.getLanguageService().getLanguagesFromApi(env.getName(),env.getEnvironmentType(),env.getPhase().toString(),null,true);

L'ultimoparametro"true" indica forzare l'aggiornamento della cache.

  • Devo ottenere il valore esistente nella cache su una variabile temporanea, eliminare la voce, effettuare una chiamata API, se non viene restituito alcun valore a causa di un errore, reinserire la voce nella cache.

            String key = ClientUtils.concatenateList(
                    Arrays.asList(ClientConstants.RESOURCE_LANGUAGE,
                            env.getName(), env.getEnvironmentType(),
                            env.getPhase(), null),
                    ClientConstants.CACHE_KEY_SEPERATOR,
                    ClientConstants.NULL_STRING);
    
            Object cachedElement = ClientCache.getCache().get(key);
            if (cachedElement != null) {
                ClientCache.getCache().delete(key);
            }
    
            Object obj = ServiceFactory.getLanguageService()
                    .getLanguagesFromApi(env.getName(),
                            env.getEnvironmentType(),
                            env.getPhase().toString(), null);
    
            if (obj == null) {
                ClientCache.getCache().put(key, cachedElement);
            }
    

Qual è il modo più pulito per farlo? Ritengo che l'aggiunta di parametri sulla memorizzazione nella cache per la funzione renda maldestre e aggiunga dipendenze, come getUsers(String country, boolean forceAPIrequest) . Ma l'eliminazione e l'aggiunta di voci uguali può anche sprecare risorse e spazio heap, causando GC nel tempo. Inoltre, l'App accederà direttamente a Client Cache per eseguire queste operazioni.

Tutto questo si basa sul strong presupposto che la nostra API REST non sia affidabile. L'app Web non dovrebbe avere tempi di inattività.

    
posta TechCrunch 15.09.2015 - 17:54
fonte

3 risposte

1

Se ho capito bene, il caching è attivo principalmente per la realbilità in caso di indisponibilità del servizio REST, non per le prestazioni.

In tal caso, è possibile chiamare il servizio REST ogni volta che si riceve una richiesta dal client, se si ottiene una risposta (il servizio REST funziona) si aggiorna la cache MapDB e si restituisce la risposta al client API. Se il servizio REST è inattivo e non si ottiene la risposta, è sufficiente restituire il valore memorizzato nella cache da MapDB.

In questo modo i tuoi clienti ottengono sempre la versione più aggiornata possibile mantenendo i requisiti di affidabilità.

È possibile includere un flag nella risposta ai client che indica se la risposta proviene dalla cache o è aggiornata. Questo potrebbe essere utile per i clienti che richiedono assolutamente una risposta aggiornata al punto che è preferibile fallire piuttosto che lavorare con i vecchi dati.

    
risposta data 16.09.2015 - 13:36
fonte
0

Aggiungi un metodo al client API refreshCache(...) che aggiornerebbe l'intera cache, in modo simile a quanto fatto attraverso il listener di avvio. Se un'applicazione cache-aware che utilizza il client API sa che ha bisogno di dati aggiornati prima di richiedere dati specifici, prima chiama refreshCache .

    
risposta data 17.09.2015 - 15:39
fonte
-2

La chiamata che fai per prima cosa completa l'aggiornamento della cache sì? Se sì, allora perché non pianificarlo .. Se la richiesta completa torna corretta, scarica e crea un'istanza della cache ...

    
risposta data 15.09.2015 - 20:25
fonte

Leggi altre domande sui tag