เครื่องมือเพิ่มเติมที่จะช่วยให้คุณรักษาสมดุลระหว่างความทันท่วงทีและความใหม่เมื่อแสดงเว็บแอป
สินค้าที่จัดส่งมีอะไรบ้าง
stale-while-revalidate
ช่วยให้นักพัฒนาแอปรักษาสมดุลระหว่างความรวดเร็วระหว่างการโหลดเนื้อหาที่แคชไว้ทันทีและความสดใหม่ เพื่อให้มั่นใจว่าจะมีการใช้การอัปเดตเนื้อหาที่แคชไว้ในอนาคต หากคุณดูแลรักษาบริการเว็บหรือไลบรารีของบุคคลที่สามที่มีการอัปเดตตามกำหนดการเป็นประจำ หรือเนื้อหาของบุคคลที่หนึ่งมีแนวโน้มที่จะมีอายุการใช้งานสั้นๆ stale-while-revalidate
อาจเป็นส่วนเสริมที่มีประโยชน์สำหรับนโยบายการแคชที่มีอยู่
การรองรับการตั้งค่า stale-while-revalidate
ควบคู่ไปกับ max-age
ในส่วนหัวการตอบกลับ Cache-Control
พร้อมใช้งานใน Chrome 75 และ Firefox 68
เบราว์เซอร์ที่ไม่รองรับ stale-while-revalidate
จะไม่สนใจการกำหนดค่าดังกล่าว และจะใช้ max-age
ตามที่เราจะอธิบายให้ฟังเร็วๆ นี้...
ความหมาย
เราจะแบ่ง stale-while-revalidate
ออกเป็น 2 ส่วน ได้แก่ แนวคิดที่ว่าการตอบกลับที่แคชไว้อาจไม่มีการอัปเดต และกระบวนการตรวจสอบอีกครั้ง
ก่อนอื่น เบราว์เซอร์จะรู้ได้อย่างไรว่าการตอบกลับที่แคชไว้เป็น "ไม่มีอัปเดต" ส่วนหัวการตอบกลับ
Cache-Control
ที่มี stale-while-revalidate
ควรมี
max-age
ด้วย และจำนวนวินาทีที่ระบุผ่าน max-age
คือสิ่งที่ระบุ
การไม่มีอัปเดต การตอบกลับที่แคชไว้ที่ใหม่กว่า max-age
จะถือว่าเป็นคำตอบใหม่ และการตอบกลับที่แคชไว้ที่เก่ากว่าจะไม่มีอัปเดต
หากการตอบกลับที่แคชไว้ในเครื่องยังคงเป็นของใหม่ ก็สามารถใช้การตอบกลับที่แคชไว้ตามที่เป็นอยู่เพื่อดำเนินการตามคำขอของเบราว์เซอร์ จากมุมมองของ stale-while-revalidate
สถานการณ์นี้ไม่ต้องดำเนินการใดๆ
แต่หากการตอบกลับที่แคชไว้ไม่มีอัปเดต ระบบจะดำเนินการตรวจสอบตามอายุอีกครั้ง กล่าวคือ อายุการตอบกลับที่แคชภายในกรอบเวลาเพิ่มเติมที่ได้รับจากการตั้งค่า stale-while-revalidate
หรือไม่
ถ้าอายุของการตอบกลับที่ไม่มีการอัปเดตอยู่ในหน้าต่างนี้ จะมีการใช้ข้อมูลดังกล่าวเพื่อทำตามคำขอของเบราว์เซอร์ ในขณะเดียวกัน จะมีคำขอ "การตรวจสอบอีกครั้ง" กับเครือข่ายในลักษณะที่ไม่ทำให้การใช้การตอบกลับที่แคชไว้มีความล่าช้า การตอบกลับที่แสดงผลอาจมีข้อมูลเหมือนกับคำตอบที่แคชไว้ก่อนหน้านี้ หรืออาจแตกต่างกัน ไม่ว่าจะเป็นลักษณะใดก็ตาม ระบบจะจัดเก็บการตอบสนองของเครือข่ายไว้ในเครื่อง โดยแทนที่สิ่งที่เคยแคชไว้ก่อนหน้านี้ และรีเซ็ตตัวจับเวลา "ความใหม่" ที่ใช้ในระหว่างการเปรียบเทียบ max-age
ในอนาคต
แต่หากการตอบกลับที่แคชไว้ซึ่งไม่มีการอัปเดตนานพอจะเกินกรอบเวลาstale-while-revalidate
แล้ว การตอบกลับดังกล่าวก็จะไม่ทำให้คำขอของเบราว์เซอร์เสร็จสมบูรณ์ เบราว์เซอร์จะดึงการตอบกลับจากเครือข่ายแทน และใช้การตอบสนองทั้ง 2 อย่างกับคำขอเริ่มต้นและป้อนข้อมูลแคชในเครื่องด้วยการตอบกลับใหม่
ตัวอย่างที่เผยแพร่อยู่
ด้านล่างนี้เป็นตัวอย่าง HTTP API ง่ายๆ สำหรับการส่งคืนเวลาปัจจุบัน โดยเฉพาะจำนวนนาทีปัจจุบันเมื่อผ่านไป 1 ชั่วโมง
ในสถานการณ์นี้ เว็บเซิร์ฟเวอร์จะใช้ส่วนหัว Cache-Control
นี้ในการตอบกลับ HTTP:
Cache-Control: max-age=1, stale-while-revalidate=59
การตั้งค่านี้หมายความว่า หากคำขอเวลาซ้ำกันภายใน 1 วินาทีถัดไป ค่าที่แคชไว้ก่อนหน้านี้จะยังเป็นข้อมูลล่าสุดและจะใช้ตามที่เป็นอยู่โดยไม่มีการตรวจสอบซ้ำ
หากมีคำขอซ้ำกันในช่วง 1 ถึง 60 วินาทีหลังจากนั้น ค่าที่แคชจะไม่มีอัปเดต แต่จะใช้เพื่อดำเนินการตามคำขอ API นี้ ในขณะเดียวกัน "ในเบื้องหลัง" จะมีการส่งคำขอตรวจสอบซ้ำเพื่อแสดงแคชด้วยค่าใหม่สำหรับการใช้งานในอนาคต
หากส่งคำขอซ้ำหลังจากผ่านไปเกิน 60 วินาที ระบบจะไม่ใช้การตอบสนองที่ไม่มีการอัปเดตเลย และทั้งการดำเนินการตามคำขอของเบราว์เซอร์และการตรวจสอบแคชอีกครั้งจะขึ้นอยู่กับการได้รับการตอบกลับจากเครือข่าย
ต่อไปนี้คือรายละเอียดของ 3 สถานะที่แตกต่างกัน รวมถึงกรอบเวลาที่ใช้แต่ละสถานะสำหรับตัวอย่างของเรา
กรณีการใช้งานที่พบบ่อย
แม้ว่าตัวอย่างข้างต้นสำหรับบริการ API "นาทีหลังจากชั่วโมง" สร้างขึ้น แต่ข้อมูลนี้แสดงให้เห็นถึงกรณีการใช้งานที่คาดไว้ ซึ่งเป็นบริการที่ให้ข้อมูลที่จำเป็นต้องรีเฟรช แต่ยอมรับการที่ไม่มีอัปเดตได้ในระดับหนึ่ง
ตัวอย่างที่คล้ายกันอาจเป็น API สำหรับสภาพอากาศปัจจุบันหรือพาดหัวข่าวเด่นที่เขียนเมื่อชั่วโมงที่ผ่านมา
โดยทั่วไปแล้ว คำตอบที่อัปเดตตามช่วงเวลาที่ทราบ มีแนวโน้มที่จะได้รับคำขอหลายครั้ง และเป็นแบบคงที่ภายในช่วงเวลาดังกล่าวเป็นตัวเลือกที่ดีสำหรับการแคชระยะสั้นผ่าน max-age
การใช้ stale-while-revalidate
นอกเหนือจาก max-age
จะเพิ่มความเป็นไปได้ที่จะมีการดำเนินการตามคำขอในอนาคตจากแคชด้วยเนื้อหาใหม่ โดยไม่บล็อกการตอบสนองของเครือข่าย
โปรแกรมดังกล่าวโต้ตอบกับโปรแกรมทำงานของบริการอย่างไร
หากคุณเคยได้ยินว่า stale-while-revalidate
มีโอกาสสูงที่ข้อความดังกล่าวอยู่ในบริบทของสูตรอาหารที่ใช้ภายในโปรแกรมทำงานของบริการ
การใช้ฟีเจอร์ "ไม่มีอัปเดตขณะตรวจสอบใหม่" ผ่านส่วนหัว Cache-Control
จะมีความคล้ายคลึงกันกับการใช้งานในโปรแกรมทำงานของบริการ ซึ่งก็ต้องคำนึงถึงปัจจัยเดียวกันหลายอย่างเกี่ยวกับเวลาที่เสียไปและอายุการใช้งานสูงสุด อย่างไรก็ตาม มีข้อควรพิจารณา 2-3 ประการที่คุณควรคำนึงถึงเมื่อตัดสินใจว่าจะใช้แนวทางสำหรับ Service Worker หรือไม่ หรือจะใช้เพียงการกำหนดค่าส่วนหัว Cache-Control
ใช้ระบบ Service Worker ในกรณีต่อไปนี้
- คุณใช้ Service Worker ในเว็บแอปอยู่แล้ว
- คุณต้องควบคุมเนื้อหาของแคชอย่างละเอียด และต้องการใช้นโยบายการหมดอายุที่ใช้งานล่าสุด โมดูล การหมดอายุของแคช ของ Workbox ช่วยแก้ปัญหานี้ได้
- คุณต้องการรับการแจ้งเตือนเมื่อคำตอบที่ไม่มีการอัปเดตเปลี่ยนในพื้นหลังในระหว่างขั้นตอนการตรวจสอบอีกครั้ง โมดูลการอัปเดตแคชการออกอากาศของ Workbox ช่วยแก้ปัญหานี้ได้
- คุณต้องมีลักษณะการทำงาน
stale-while-revalidate
นี้ในเบราว์เซอร์รุ่นใหม่ทั้งหมด
ใช้แนวทางการควบคุมแคชหาก...
- คุณไม่ต้องจัดการกับค่าใช้จ่ายในการทำให้ใช้งานได้และดูแลรักษาโปรแกรมทำงานของบริการสำหรับเว็บแอป
- คุณสามารถปล่อยให้การจัดการแคชอัตโนมัติของเบราว์เซอร์ป้องกันไม่ให้แคชในเครื่องของคุณมีขนาดใหญ่เกินไป
- คุณยังใช้แนวทางที่ปัจจุบันยังไม่รองรับในเบราว์เซอร์ใหม่ๆ ทั้งหมดได้ (ข้อมูล ณ เดือนกรกฎาคม 2019 เป็นต้นไป การรองรับอาจเพิ่มขึ้นในอนาคต)
หากคุณใช้ Service Worker และเปิดใช้ stale-while-revalidate
สำหรับการตอบกลับบางอย่างผ่านส่วนหัว Cache-Control
ด้วย โดยทั่วไปโปรแกรมทำงานของบริการจะ "แคร็กแรก" ในการตอบกลับคำขอ หากโปรแกรมทำงานของบริการตัดสินใจที่จะไม่ตอบกลับ หรือในกระบวนการสร้างการตอบกลับ จะมีการส่งคำขอเครือข่ายโดยใช้ fetch()
ลักษณะการทำงานที่กำหนดค่าผ่านส่วนหัว Cache-Control
ก็จะมีผลในที่สุด
ดูข้อมูลเพิ่มเติม
- การตอบสนอง
stale-while-revalidate
ในข้อมูลจำเพาะของ Fetch API - RFC 5861 ซึ่งครอบคลุมข้อกำหนดเริ่มต้นของ
stale-while-revalidate
- แคช HTTP: ด่านแรกในการป้องกัน จากคู่มือ "ความเสถียรของเครือข่าย" ในเว็บไซต์นี้
รูปภาพหลักโดย Samuel Zeller