Buforowanie odpowiedzi na podstawie nagłówków daty i wieku

Jan 17 2021

Widzimy pewne zachowania, w których nie buforujemy odpowiedzi w OkHttp i za każdym razem trafiamy do serwera. Jednak odpowiedź ma czas wygaśnięcia w przyszłości, więc najlepiej byłoby, gdyby została zapisana w pamięci podręcznej.

Oto prosty przykład nagłówków, które widzimy w odpowiedzi (żądanie zostało wysłane, a odpowiedź została odebrana o godzinie 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

Z tego, co widziałem patrząc na CacheStrategy, problem polega na tym, że sumuje datę + wiek, aby sprawdzić, czy minął czas wygaśnięcia. W tym przypadku, 00:40:36 + 6 = 00:40:42 > 00:40:40więc ostatecznie nie zostanie dodany do pamięci podręcznej.

Myślę więc, że najlepiej byłoby, gdyby data odpowiedzi była równa ostatniej modyfikacji (w tym przypadku sobota, 16 stycznia 2021 r. 00:40:30 czasu GMT), albo musielibyśmy mieć niestandardową strategię CacheStrategy, która używałaby ostatniej modyfikacji zamiast datę tych obliczeń.

Jeśli ktoś ma wgląd w to, czy robię jakieś złe założenia, czy też jedna z powyższych opcji jest lepsza, daj mi znać. Przyjrzałem się niektórym specyfikacjom nagłówków daty / wieku i nie jest dla mnie jasne, jakie powinny być w tym scenariuszu.

Stwierdziłem również, że nieco trudniej jest debugować zachowanie buforowania w OkHttp, w tej chwili używam tylko warunkowych punktów przerwania, aby spróbować to prześledzić, ale jeśli ktoś ma lepszy pomysł, również bym to docenił.

Odpowiedzi

2 JesseWilson Jan 22 2021 at 11:32

Zastąp expiresnagłówek nagłówkiem Cache-Control, który ustawia dyrektywę max-age:

Cache-Control: max-age=86400

Spowoduje to, że OkHttp będzie buforować odpowiedź przez 24 godziny, niezależnie od tego, kiedy została udostępniona. Nagłówek expires był problematyczny, ponieważ CloudFlare traktował go jako określony czas wygaśnięcia, a nie czas trwania.

1 Menelaos Jan 26 2021 at 01:57

Poleciłbym spróbować użyć nagłówka „Cache-Control” z max-agewybranym przez siebie.

Głównym powodem, dla którego to robię, jest to, że jest to również pokazane na przykładzie z oficjalnej dokumentacji, patrz: https://square.github.io/okhttp/interceptors/#rewriting-responses

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

Preferowanym sposobem na zrobienie tego jest oczywiście zaplecze. Jeśli nie możesz zmodyfikować zaplecza, myślę, że drugą opcją byłby przechwytywacz. Zwróć uwagę, że jest to ostatnia opcja, której nie zaleca się.

Oprócz twojego zaplecza przyjrzałbym się również opcjom, które zapewnia samo cloudflare: https://support.cloudflare.com/hc/en-us/articles/360021806811-Getting-Started-with-Cloudflare-Caching