𝗖𝗮𝗰𝗵𝗶𝗻𝗴 𝗦𝗵𝗼𝗽𝗶𝗳𝘆 𝗚𝗥𝗔𝗣𝗛𝗤𝗟: 𝗔 𝗣𝗿𝗮𝗰𝘁𝗶𝗰𝗮𝗹 𝗚𝘂𝗶𝗱𝗲

GraphQL ทำงานไม่เหมือนกับ REST คุณไม่สามารถทำ cache ตาม URL ได้ ใน REST หนึ่ง endpoint จะเท่ากับหนึ่ง cache entry แต่ใน GraphQL หนึ่ง endpoint จะจัดการทุกอย่าง การส่ง request สองครั้งไปยัง URL เดียวกันอาจให้ข้อมูลที่แตกต่างกัน

เพื่อทำ cache สำหรับ GraphQL อย่างถูกต้อง cache key ของคุณต้องประกอบด้วย:

  • The query (คำสั่ง query)
  • The variables (ตัวแปร)
  • The user context (เช่น locale หรือกลุ่มผู้ซื้อ)

ใช้การแบ่งเลเยอร์เพื่อสร้างระบบที่รวดเร็ว:

  • Client cache: สำหรับการนำ session กลับมาใช้ใหม่ในเบราว์เซอร์
  • Edge cache: สำหรับหน้า storefront สาธารณะ
  • App cache: สำหรับข้อมูลที่ใช้ร่วมกันบนเซิร์ฟเวอร์ของคุณ
  • Persisted queries: สำหรับการใช้ key ที่อิงตาม hash ซึ่งมีความเสถียร

กำหนดเวลา cache ให้สอดคล้องกับความเร็วในการเปลี่ยนแปลงของข้อมูล

ควรทำ cache รายการเหล่านี้ไว้เป็นเวลานาน:

  • Product details (รายละเอียดสินค้า)
  • Collections (คอลเลกชัน)
  • Shop settings (การตั้งค่าร้านค้า)

ควรทำ cache รายการเหล่านี้ไว้เพียงช่วงเวลาสั้นๆ:

  • Pricing (ราคา)
  • Inventory availability (จำนวนสินค้าในสต็อก)

ห้ามทำ cache รายการเหล่านี้โดยเด็ดขาด:

  • Carts (ตะกร้าสินค้า)
  • Checkout processes (ขั้นตอนการชำระเงิน)
  • Customer-specific pricing (ราคาเฉพาะบุคคล)

หากคุณให้บริการร้านค้าแบบ B2B คุณต้องรวม company ID ไว้ใน cache key ด้วย มิฉะนั้น ลูกค้า A อาจเห็นราคาตามสัญญาของลูกค้า B

ใช้ 3 วิธีนี้ในการจัดการความสดใหม่ของข้อมูล (freshness):

  1. TTL (Time-based): กำหนดเวลาหมดอายุ วิธีนี้ง่ายแต่คุณมักจะต้องใช้วิธีคาดเดาเอาเอง
  2. Webhooks (Event-based): วิธีนี้แม่นยำที่สุด เมื่อมีการอัปเดตสินค้า Shopify จะส่ง webhook มาให้ ให้ใช้ webhook นั้นในการลบ cache entry เก่าของคุณออก
  3. Stale-while-revalidate: ส่งข้อมูลเก่าออกไปทันทีในขณะที่ทำการรีเฟรช cache ในเบื้องหลัง

สร้าง webhook handler ที่เชื่อถือได้ หาก webhook ทำงานล้มเหลว cache ของคุณจะค้างเป็นข้อมูลเก่า (stale) ควรใช้ระบบ retry เพื่อป้องกันปัญหานี้

ให้ความสำคัญกับตัวชี้วัด (metrics) เหล่านี้เพื่อดูว่ากลยุทธ์ของคุณได้ผลหรือไม่:

  • Hit ratio: ตั้งเป้าหมายให้มีจำนวน hit สูงๆ
  • Latency: เวลาในการตอบสนอง (response time) ควรลดลง
  • API calls avoided: จำนวนการเรียก API ที่ลดลง หมายถึงต้นทุนที่ต่ำลง
  • Stale incidents: เหตุการณ์ข้อมูลไม่อัปเดต เป้าหมายของคุณคือต้องไม่มีการแสดงราคาหรือรายงานสต็อกที่ผิดพลาด

แบ่งเลเยอร์ของ cache กำหนดเวลาหมดอายุให้สอดคล้องกับความผันผวนของข้อมูล ใช้ webhooks เพื่อล้างข้อมูลเก่า และสร้าง key ที่คำนึงถึงการปรับแต่งเฉพาะบุคคล (personalization)

Source: https://dev.to/masadashraf/caching-shopify-graphql-a-practical-guide-for-developers-33k8