การแคชการตอบกลับตามส่วนหัววันที่และอายุ

Jan 17 2021

เรากำลังเห็นพฤติกรรมบางอย่างที่เราไม่ได้แคชการตอบกลับใน OkHttp และท้ายที่สุดก็โดนเซิร์ฟเวอร์ทุกครั้ง อย่างไรก็ตามการตอบกลับมีเวลาหมดอายุในอนาคตดังนั้นจึงควรแคชไว้

นี่คือตัวอย่างง่ายๆของส่วนหัวที่เราเห็นในการตอบกลับ (ส่งคำขอและได้รับการตอบกลับที่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

จากสิ่งที่ฉันเห็นจากการดู CacheStrategy ปัญหาคือมันรวมวันที่ + อายุเข้าด้วยกันเพื่อดูว่าเลยเวลาหมดอายุหรือไม่ ในกรณีนี้00:40:36 + 6 = 00:40:42 > 00:40:40จึงไม่มีการเพิ่มแคช

ดังนั้นฉันคิดว่าวันที่ตอบกลับจะเท่ากับแก้ไขล่าสุด (ในกรณีนี้คือวันเสาร์ที่ 16 มกราคม 2021 00:40:30 น. GMT) หรือเราจำเป็นต้องมี CacheStrategy ที่กำหนดเองเพื่อใช้ last-modified แทน วันที่สำหรับการคำนวณเหล่านี้

หากใครมีข้อมูลเชิงลึกว่าฉันตั้งสมมติฐานที่ไม่ดีหรือไม่หรือตัวเลือกใดตัวเลือกหนึ่งข้างต้นดีกว่าโปรดแจ้งให้เราทราบ ฉันได้ดูรายละเอียดบางอย่างสำหรับส่วนหัววันที่ / อายุแล้วและฉันก็ค่อนข้างไม่ชัดเจนว่าควรจะเป็นอย่างไรในสถานการณ์นี้

ฉันยังพบว่ามันยากที่จะดีบักพฤติกรรมการแคชใน OkHttp ตอนนี้ฉันเพิ่งใช้เบรกพอยต์แบบมีเงื่อนไขเพื่อพยายามติดตาม แต่ถ้าใครมีความคิดที่ดีกว่าฉันก็ยินดีด้วยเช่นกัน

คำตอบ

2 JesseWilson Jan 22 2021 at 11:32

แทนที่expiresส่วนหัวด้วยส่วนหัว Cache-Control ที่กำหนดคำสั่งอายุสูงสุด:

Cache-Control: max-age=86400

สิ่งนี้จะทำให้ OkHttp แคชการตอบกลับเป็นเวลา 24 ชั่วโมงโดยไม่คำนึงถึงเวลาที่ให้บริการ ส่วนหัวการหมดอายุมีปัญหาเนื่องจาก CloudFlare ถือว่าเป็นเวลาหมดอายุที่เฉพาะเจาะจงไม่ใช่ระยะเวลา

1 Menelaos Jan 26 2021 at 01:57

ฉันอยากจะแนะนำให้ลองใช้ส่วนหัว "Cache-Control" กับส่วนที่max-ageคุณเลือก

เหตุผลหลักที่ฉันทำเช่นนี้เพราะสิ่งนี้แสดงไว้ในตัวอย่างจากเอกสารอย่างเป็นทางการโปรดดู: https://square.github.io/okhttp/interceptors/#rewriting-responses

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

วิธีที่ดีที่สุดในการทำเช่นนี้เห็นได้ชัดว่าอยู่ด้านหลัง หากคุณไม่สามารถแก้ไขส่วนหลังได้ฉันเดาว่าผู้สกัดกั้นจะเป็นตัวเลือกที่สอง โปรดทราบว่าเป็นทางเลือกสุดท้ายที่ท้อแท้

นอกจากแบ็กเอนด์ของคุณแล้วฉันจะดูตัวเลือกที่ cloudflare มีให้ด้วย: https://support.cloudflare.com/hc/en-us/articles/360021806811-Getting-Started-with-Cloudflare-Caching