Posso usare un parametro timestamp per l'invalidazione della cache?

0

Sto considerando uno schema per il passaggio di un valore di timestamp in una risposta memorizzata nella cache e quindi l'invio al servizio per eseguire l'invalidazione della cache. Mi chiedo se questo è un approccio valido. È un approccio comune?

Ad esempio, se ho un servizio che restituisce un record "Foo", che è una combinazione di ricerche e calcoli DB. Diciamo che Foo è identificato con una chiave. Per velocizzare le cose, voglio mantenere una cache locale dei risultati.

Il problema è che, attraverso un gruppo di server, le cache locali non verranno sincronizzate, perché i risultati calcolati cambieranno nel tempo.

Quindi il mio pensiero è:

  • per una richiesta, calcola un Foo
  • memorizza Foo nella cache locale con un timestamp "a partire da"
  • restituisce il Foo insieme al timestamp "a partire da"
  • quando il cliente vuole recuperare un Foo, passa la chiave e il timestamp "as of".
  • se il server trova la chiave nella cache locale e il timestamp "come" nella cache è più recente del parametro "as of", restituisce la cache Foo con Foo, key e "as of" timestamp
  • altrimenti ricalcola il Foo, lo metti in cache e restituisci (nuovo) Foo, chiave e (nuovo) "a partire da" timestamp

Il client dovrebbe tenere traccia sia della chiave che della data / ora "come", ma in sostanza controllerebbe essenzialmente quando le istanze di servizio aggiornano la propria cache locale, senza che le istanze di servizio comunichino l'una con l'altra o alcuno spazio di archiviazione di back-end per il coordinamento.

Se il client volesse forzare un aggiornamento della cache, potrebbe passare "a partire da" del valore massimo, il che forzerebbe un aggiornamento su qualsiasi istanza di servizio che colpisce.

Certamente potrei mettere un livello di cache davanti al mio servizio, e potrei anche salvare i risultati in una cache distribuita. Queste soluzioni hanno anche i loro problemi di replica dei dati e di scadenza. Ma ai fini di questa domanda, voglio davvero prendere in considerazione il caching locale e l'amp; considera le domande architettoniche separatamente.

Q: Funziona? È valido o buono utilizzare un parametro di timestamp come meccanismo per l'invalidazione della cache?

    
posta Rob 07.10.2015 - 18:13
fonte

1 risposta

2

La memorizzazione nella cache locale è più semplice da implementare. I problemi a cui prestare attenzione sono:

  1. Errori di cache multipli durante l'evento della popolazione cache
  2. La popolazione cache non funziona.
  3. A seconda del server su cui viene inviata la richiesta, verrà restituita una risposta diversa.

Con .NET ho gestito il problema della mancanza di cache avendo memorizzato nella cache l'attività < > wrapper asincrono e utilizzo del blocco per garantire che solo una attività < > per ottenere il valore memorizzato nella cache è stato creato. Questo ha funzionato bene.

Quando il processo per ottenere il valore della cache fallisce, cosa fa la tua applicazione? Memorizza nella cache l'errore restituendo l'errore fino alla scadenza della cache? O crei un nuovo tentativo per ottenere il valore?

Se si dispone di più server con cache indipendenti e i valori sottostanti cambiano regolarmente, la risposta dipenderà interamente dal server che gestisce tale richiesta. Questo potrebbe non essere un problema nella tua applicazione, ma pensa a lungo e duramente cosa significhi per il tuo utente e la sua fiducia nelle tue competenze. Se continui a ricevere dati in conflitto, puoi minare la fiducia.

L'implementazione di una cache distribuita con riak e scadenza chiave risolve molti di questi problemi quando si hanno più server applicazioni. Tuttavia, non risolve il problema della popolazione della cache, quando più thread su più server decidono tutti che la cache deve essere ripopolata.

    
risposta data 07.10.2015 - 18:39
fonte

Leggi altre domande sui tag