کش کردن Shopify GraphQL: یک راهنمای کاربردی

GraphQL مانند REST عمل نمی‌کند. شما نمی‌توانید بر اساس URL کش کنید. در REST، هر نقطه اتصال (endpoint) معادل یک ورودی کش است. در GraphQL، یک نقطه اتصال همه کارها را انجام می‌دهد. دو درخواست به یک URL یکسان، داده‌های متفاوتی را برمی‌گردانند.

برای کش کردن صحیح GraphQL، کلید کش (cache key) شما باید شامل موارد زیر باشد:

  • کوئری (Query)
  • متغیرها (Variables)
  • بافت کاربر (locale یا بخش خریدار)

برای ساخت یک سیستم سریع، از لایه‌ها استفاده کنید:

  • کش کلاینت (Client cache): برای استفاده مجدد از نشست (session) در مرورگر.
  • کش لبه (Edge cache): برای صفحات عمومی فروشگاه.
  • کش اپلیکیشن (App cache): برای داده‌های مشترک در سرور شما.
  • کوئری‌های ذخیره‌شده (Persisted queries): برای کلیدهای پایدار و مبتنی بر هش (hash).

زمان کش خود را با سرعت تغییر داده‌ها هماهنگ کنید.

این موارد را برای مدت طولانی کش کنید:

  • جزئیات محصول
  • مجموعه‌ها (Collections)
  • تنظیمات فروشگاه

این موارد را برای مدت کوتاهی کش کنید:

  • قیمت‌گذاری
  • موجودی کالا

هرگز این موارد را کش نکنید:

  • سبد خریدها
  • فرآیندهای پرداخت (Checkout)
  • قیمت‌گذاری مخصوص هر مشتری

اگر به فروشگاه‌های B2B خدمات می‌دهید، باید شناسه شرکت (company ID) را در کلید کش خود بگنجانید. در غیر این صورت، ممکن است مشتری A قیمت قراردادی مشتری B را مشاهده کند.

از این سه روش برای مدیریت تازگی داده‌ها (freshness) استفاده کنید:

  1. TTL (مبتنی بر زمان): یک زمان انقضا تعیین کنید. این روش ساده است اما اغلب بر پایه حدس و گمان است.
  2. وب‌هوک‌ها (مبتنی بر رویداد): این دقیق‌ترین روش است. وقتی محصولی به‌روزرسانی می‌شود، Shopify یک وب‌هوک ارسال می‌کند. از آن وب‌هوک برای حذف ورودی قدیمی کش خود استفاده کنید.
  3. Stale-while-revalidate: داده‌های قدیمی را بلافاصله ارائه دهید، در حالی که کش را در پس‌زمینه به‌روزرسانی می‌کنید.

هندلرهای وب‌هوک (webhook handlers) قابل اعتمادی بسازید. اگر یک وب‌هوک با شکست مواجه شود، کش شما قدیمی (stale) باقی می‌ماند. برای جلوگیری از این مشکل از قابلیت تلاش مجدد (retries) استفاده کنید.

برای بررسی اثربخشی استراتژی خود، بر این معیارها تمرکز کنید:

  • نسبت برخورد (Hit ratio): هدف شما رسیدن به تعداد بالای برخوردها (hits) است.
  • تأخیر (Latency): زمان پاسخگویی شما باید کاهش یابد.
  • کاهش فراخوانی‌های API: برخورد بیشتر به معنای هزینه‌های کمتر است.
  • موارد داده‌های قدیمی (Stale incidents): هدف شما صفر بودن گزارش‌های اشتباه قیمت یا موجودی است.

کش‌های خود را لایه‌بندی کنید. زمان‌های انقضا را با میزان تغییرپذیری داده‌ها هماهنگ کنید. از وب‌هوک‌ها برای پاکسازی داده‌های قدیمی استفاده کنید. کلیدهایی بسازید که شخصی‌سازی را رعایت کنند.

منبع: https://dev.to/masadashraf/caching-shopify-graphql-a-practical-guide-for-developers-33k8