เป็นเรื่องปกติที่เราต้องมีการเพิ่มประสิทธิภาพให้แก่ระบบของเรา ซึ่งมันเป็นสิ่งที่ต้องทำอยู่แล้ว และหนึ่งในเทคนิคที่เราใช้กันเพื่อเพิ่มความเร็วและประสิทธิภาพ คือ Caching
หลักๆ เราจะทำ Caching ต้องการจัดเก็บสำเนาของข้อมูลที่เข้าถึงบ่อย หรือ ข้อมูลที่มี cost ที่สูงในการประมวลผล เราก็จะเอามันมาเก็บไว้ใน cache เพื่อให้สามารถ response ได้เร็วขึ้น
โดยพื้นฐานแล้ว caching เป็นกลไกในการจัดเก็บและดึงข้อมูลโดยมีเป้าหมายในการลดเวลาแฝง (latency) และปรับปรุงประสิทธิภาพของระบบ แทนที่จะคำนวณใหม่หรือดึงข้อมูลเดิมซ้ำๆ ระบบจะจัดเก็บสำเนาไว้ใน cache ซึ่งสามารถเข้าถึงได้อย่างรวดเร็วกว่า วิธีการนี้มีประสิทธิภาพโดยเฉพาะอย่างยิ่งสำหรับสถานการณ์ที่ cost ในการสร้าง หรือการดึงข้อมูลมีมากกว่า cost ในการจัดเก็บข้อมูลชั่วคราว
ในบทความนี้ เราจะพูดถึงการใช้ cache กัน โดยเอามาจากบทความนี้
ประเภทของ Caching
- In-Memory Caching: การแคชในหน่วยความจำจะจัดเก็บข้อมูลลงใน RAM โดยตรง ของระบบ ทำให้สามารถเรียกค้นข้อมูลได้อย่างรวดเร็วยิ่งขึ้น การแคชประเภทนี้เหมาะอย่างยิ่งสำหรับข้อมูลที่เข้าถึงบ่อยซึ่งไม่ได้เปลี่ยนแปลงบ่อย
- Page Caching: การแคชหน้าเกี่ยวข้องกับการจัดเก็บ HTML page ทั้งหมด หรือส่วนต่างๆ ของ page โดยทั่วไปจะใช้ใน web application เพื่อให้บริการหน้าที่แสดงผลล่วงหน้าได้อย่างรวดเร็ว ลดการโหลดเซิร์ฟเวอร์ และเพิ่มความเร็วในการโหลดหน้าเว็บ
- Object Caching: การแคชออบเจ็กต์จะจัดเก็บอ็อบเจ็กต์แต่ละรายการ หรือ โครงสร้างข้อมูลไว้ในแคช สิ่งนี้มักใช้ในสถานการณ์ที่ค่าใช้จ่ายในการสร้าง object ใหม่สูง และมีการใช้มันอยู่บ่อยๆ
- Distributed Caching: การแคชแบบกระจาย ข้อมูลจะถูกเก็บไว้ในเซิร์ฟเวอร์ หรือ node หลายๆ เครื่อง ซึ่งให้ความสามารถใน scalability และ redundancy แถมการทำแบบนี้ทําให้มั่นใจได้ว่า ถ้า server บางตัวจะหยุดทำงานไป ก็จะไม่กระทบต่อการเข้าถึงข้อมูล เพราะยังสามารถไปดึงข้อมูลจากโหนดอื่นได้อยู่
ประโยชน์ของการใช้งาน Caching
หลักๆ เลยก็จะเป็นเรื่องของการเพิ่ม Performance กับการ Scalability เป็นส่วนใหญ่
- Reduced Latency: ตัวแรกเลยการทำ cache นั้นมันช่วยลดเวลาในการรอลง โดยการไปดึงข้อมูลจากแคชแทนที่จะคํานวณใหม่ หรือดึงข้อมูลจาก database ทำให้เวลาแฝง (Latency) ลดลงอย่างมาก และส่งผลให้เวลาในการตอบสนองที่เร็วขึ้น (Response Time)
- Improved Scalability: การ caching มันช่วยเพิ่มความสามารถใน Scale โดยการไปลด load ในระบบหลังบ้าน (backend systems) ทำให้รองรับการใช้งานได้เพิ่มขึ้น และเหมาะกับสถานการณ์ที่มีคําขอพร้อมกันจํานวนมาก (high volume of concurrent requests)
- Bandwidth Savings: แน่นอนว่าการ caching มันทำได้ทั้งสองฝั่ง ทั้ง Server และ Client มันจึงช่วยลดการส่งข้อมูลซ้ำซ้อนผ่าน network ทำให้ save bandwidth เพราะฉนั้น เมื่อไหร่ที่เราต้องการจำกัด bandwidth ก็ใช้เลือกใช้ caching ได้เลย
- Enhanced User Experience: สั่นๆ เลย เมื่อระบบตอบสนองได้เร็ว การใช้งานราบรื่น ผู้ใช้งานก็ happy
วิธีทั่วไปในการหยิบ Cache มาใช้งาน
- Time-Based Expiration: ถ้าหากข้อมูลของเรามีการอัพเดทอยู่บ่อยๆ การทำ caching นั้นจะมีการใส่ expire data ไว้ด้วยเสมอ เมื่อ cache ของข้อมูลนั้นหมดอายุ ข้อมูลก็จะถูก refresh หรือดึงข้อมูลใหม่ วิธีนี้ช่วยให้เรามั่นใจได้ว่า cache ของเรานั้นจะมีข้อมูลที่อัพเดทอยู่เสมอ
- Key-Based Invalidation: รายการใน cache จะผูกกับ key เฉพาะ และเมื่อข้อมูลเปลี่ยนแปลง ถ้าข้อมูลไม่ตรงกันก็จะ invalid วิธีนี้ทําให้เรามั่นใจได้ว่า cache ที่เก็บไว้จะแสดงข้อมูลล่าสุดเสมอ (up-to-date)
- Write-Through and Write-Behind Caching: ในการทำ cache แบบ write-through caching ผ่านข้อมูลจะถูกเขียนไปทั้ง cache และ database ในการแคชแบบ write-behind caching ข้อมูลจะถูกเขียนลงใน cache ก่อนแล้วค่อยไปอัพเดทลง database แบบ asynchronous
ความท้าทายในการหยิบมาใช้งาน
- Cache Invalidation: ความท้าทายแรกในการใช้ cache คือ การตรวจสอบให้แน่ใจว่า cache มีการเก็บข้อมูลล่าสุดและถูกต้อง ซึ่งเรื่องนี้เป็น challenge ทั่วๆ ไป
- Storage Costs: ประสิทธิภาพที่ดีขึ้นมาพร้อมกับค่า cost ในการจัดเก็บ (storage) เสมอ เราจึงต้องพยายาม balance ระหว่างประโยชน์ของการใช้ cache กับ ความต้องการในการเก็บข้อมูล (จะเอาทุกอย่างมาไว้ที่ cache ไม่ได้)
- Cache Consistency: การใช้งานแบบ Distributed Caching การ maintenance cache ให้ข้อมูลที่เก็บมีความสอดคล้องกันในหลายๆ node มันจะมีความซับซ้อนของมันอยู่