Memorizzazione nella cache delle risposte in base alla data e alle intestazioni di età

Jan 17 2021

Stiamo riscontrando un comportamento in cui non memorizziamo le risposte nella cache in OkHttp e finiamo per colpire il server ogni volta. Tuttavia, la risposta ha un tempo di scadenza in futuro, quindi idealmente sarebbe memorizzata nella cache.

Ecco un semplice esempio di intestazioni che vediamo nella risposta (la richiesta è stata inviata e la risposta è stata ricevuta a Sat, 16 Jan 2021 00:40:36 GMT):

date: Sat, 16 Jan 2021 00:40:36 GMT
age: 6
expires: Sat, 16 Jan 2021 00:40:40 GMT
last-modified: Sat, 16 Jan 2021 00:40:30 GMT

Da quello che ho visto guardando la CacheStrategy, il problema è che somma data + età per vedere se è passato il tempo di scadenza. In questo caso, 00:40:36 + 6 = 00:40:42 > 00:40:40quindi, non viene aggiunto alla cache.

Quindi penso che idealmente, o la data di risposta sarebbe uguale all'ultima modifica (in questo caso sabato, 16 gennaio 2021 00:40:30 GMT), oppure avremmo bisogno di una CacheStrategy personalizzata per utilizzare l'ultima modifica invece di data per questi calcoli.

Se qualcuno ha qualche idea sul fatto che io stia facendo ipotesi sbagliate o se una delle opzioni di cui sopra è preferibile, per favore fatemelo sapere. Ho esaminato alcune delle specifiche per le intestazioni di data / età e non mi è chiaro cosa dovrebbero essere in questo scenario.

Ho anche trovato un po 'difficile eseguire il debug del comportamento di memorizzazione nella cache in OkHttp, in questo momento ho appena usato i punti di interruzione condizionali per provare a rintracciarlo, ma se qualcuno ha un'idea migliore lo apprezzerei anche io.

Risposte

2 JesseWilson Jan 22 2021 at 11:32

Sostituisci l' expiresintestazione con un'intestazione Cache-Control che imposta una direttiva max-age:

Cache-Control: max-age=86400

Ciò farà sì che OkHttp memorizzi nella cache la risposta per 24 ore indipendentemente da quando è stata pubblicata. L'intestazione expires era problematica perché CloudFlare la trattava come una data di scadenza specifica, non una durata.

1 Menelaos Jan 26 2021 at 01:57

Consiglierei di provare a usare l'intestazione "Cache-Control" con una max-agedi tua scelta.

Il motivo principale per cui lo faccio è perché questo è mostrato anche in un esempio dalla documentazione ufficiale, vedi: https://square.github.io/okhttp/interceptors/#rewriting-responses

.header("Cache-Control", "max-age=60")

Il modo preferito per farlo è ovviamente sul back-end. Se non puoi modificare il back-end, immagino che un intercettore sarebbe una seconda opzione. Nota che è l'ultima opzione che è sconsigliata.

Oltre al tuo backend, darei un'occhiata anche alle opzioni fornite dallo stesso cloudflare: https://support.cloudflare.com/hc/en-us/articles/360021806811-Getting-Started-with-Cloudflare-Caching