عن المؤسس13 أكتوبر 20264 دقائق قراءة

عبدالله سنكر يشرح التخزين المؤقت Caching في المواقع والتطبيقات طبقة طبقة

عبدالله سنكر يشرح التخزين المؤقت Caching في المواقع والتطبيقات طبقة طبقة: المتصفح، وشبكة التوزيع، والخادم، والجوال، ومتى يسرّع موقعك ومتى يعرض بيانات غلط.

عبدالله سنكر — التخزين المؤقت
AZHAL

التخزين المؤقت

عبدالله سنكر

تعدّل سعر منتج في لوحة التحكم، وتفتح الموقع، والسعر القديم باقي. تحدّث الصفحة، باقي. تسأل المطوّر فيقول: «امسح الكاش». وفي يوم ثاني يشتكي لك العميل إن الموقع بطيء، فيقول نفس المطوّر: «نحتاج كاش». الكلمة نفسها حل ومشكلة، والسبب إن التخزين المؤقت مو شي واحد، هو طبقات كثيرة بين الزائر وقاعدة البيانات، لكل وحدة قواعدها. عبدالله سنكر يبني مواقع بـ Next.js وتطبيقات بـ Flutter، وفي هذي المقالة يمشي معك في رحلة طلب واحد من جوال الزائر إلى قاعدة البيانات، ويوقف عند كل طبقة تخزين في الطريق.

الكاش في سطرين

التخزين المؤقت يعني إنك تحفظ نسخة من نتيجة جاهزة قريباً من اللي يحتاجها، عشان ما تعيد حسابها أو تجيبها من بعيد كل مرة. المكسب سرعة وتوفير في تكلفة الخوادم. والثمن إن النسخة المحفوظة ممكن تصير قديمة. فكل قرار تخزين يجاوب سؤالين: وش نحفظ؟ وإلى متى يبقى صحيحاً؟ وفيه مقولة مشهورة في البرمجة منسوبة لفيل كارلتون: أصعب شيئين في علوم الحاسب إبطال الكاش وتسمية الأشياء. الجملة مازحة، لكن نصها الأول جاد جداً.

المحطة الأولى: متصفح الزائر

أقرب كاش للزائر هو متصفحه. والخادم يقول للمتصفح وش يحفظ وكم، عبر ترويسة اسمها Cache-Control. الملفات الثابتة مثل الجافاسكربت والخطوط والصور تُعطى عمراً طويلاً، سنة مثلاً، مع وسم immutable. وهذا آمن بشرط واحد: اسم الملف يتغيّر مع كل تعديل، مثل main.a1b2c3.js، فالنسخة الجديدة لها اسم جديد والمتصفح يجيبها تلقائياً. وأطر مثل Next.js تسوي هذا لملفاتها الثابتة من نفسها. أما صفحة HTML نفسها فعمرها قصير أو يتحقق المتصفح منها كل مرة، لأنها اللي تشير لأسماء الملفات الجديدة.

وهنا خلط شائع يستاهل يتوضح: no-cache ما تعني «لا تخزّن». تعني «خزّن، لكن اسأل الخادم قبل ما تستخدم النسخة». والخادم يرد إما بالنسخة الجديدة، أو برد قصير رقمه 304 معناه «اللي عندك صالح»، بالاعتماد على بصمة النسخة في ترويسة ETag. أما «لا تخزّن أبداً» فهي no-store، ومكانها البيانات الحساسة مثل صفحة كشف الحساب.

المحطة الثانية: شبكة توزيع المحتوى

الشبكة (CDN) خوادم منتشرة في مدن كثيرة، تحفظ نسخاً من موقعك قريباً من الزوار، فزائر في جدة ما يحتاج طلبه يسافر لخادم في قارة ثانية. وهذا الكاش مشترك بين كل الزوار، وهنا الخطورة. ترويسة s-maxage تحدد عمر النسخة في الكاش المشترك بشكل منفصل عن المتصفح، و stale-while-revalidate تسمح بعرض النسخة القديمة لحظياً بينما تُجلب الجديدة في الخلفية، فما ينتظر أحد. أما الصفحات الشخصية، مثل لوحة حساب المستخدم أو سلة مشترياته، فلازم تُعلَّم private أو no-store، لأن تخزينها في الكاش المشترك يعني إن زائراً ممكن يشوف صفحة زائر ثاني. وهذا مو خطأ أداء، هذا تسريب بيانات.

ولما تنشر نسخة جديدة أو تعدّل محتوى مهماً، فيه أداة اسمها المسح (purge): تطلب من الشبكة ترمي النسخ المحفوظة لرابط معيّن أو لمجموعة روابط، فتجيب الجديدة من خادمك. ومنصات الاستضافة الحديثة تسوي هذا تلقائياً مع كل نشر في أغلب الحالات. وانتبه لترويسة Vary: لو الصفحة تختلف حسب لغة الزائر أو نوع جهازه، لازم الكاش يعرف إن هذي نسخ مختلفة، وإلا يطلع للزائر العربي نسخة إنجليزية حفظها الكاش لزائر قبله.

المحطة الثالثة: الخادم والتطبيق

لو الطلب وصل للخادم، فيه طبقات تخزين هنا بعد. في Next.js تقدر تبني الصفحة مسبقاً وتعيد توليدها كل فترة، أو عند الطلب لما يتغيّر المحتوى، بأسلوب يسمّى ISR. فصفحة المقال تنبني مرة وتُخدم لآلاف الزوار، وتتجدد لحالها لما تعدّلها من لوحة التحكم. وتحتها كاش البيانات: نتيجة استعلام ثقيل، أو رد خدمة خارجية بطيئة، تنحفظ في ذاكرة سريعة مثل Redis بعمر محدد. والنمط الأشهر اسمه cache-aside: التطبيق يدوّر في الكاش أولاً، ولو ما لقى، يجيب من القاعدة ويحفظ النتيجة للمرة الجاية.

وانتبه لمشكلة لها اسم: تدافع الكاش (cache stampede). لما تنتهي صلاحية مفتاح عليه ضغط عالٍ، مئات الطلبات تلقاه فاضياً في نفس اللحظة، وكلها تروح للقاعدة مع بعض. الحلول المعروفة: طلب واحد يعيد البناء والباقي ينتظرون أو ياخذون النسخة القديمة، أو أعمار متفاوتة شوي بين المفاتيح عشان ما تنتهي كلها في نفس الثانية.

وفي تطبيق الجوال

التطبيق عنده كاش خاص فيه: صور تنحفظ على الجهاز بعد أول تحميل، وفي Flutter حزمة مثل cached_network_image تتولى هذا، وبيانات تنحفظ محلياً عشان الشاشة تفتح فوراً بآخر نسخة معروفة، ثم تتحدّث من الخادم. هذا الأسلوب يخلّي التطبيق يحس سريعاً حتى على شبكة ضعيفة. بس قرر لكل نوع بيانات: هل يصح أعرضه قديماً لثواني؟ قائمة المقالات نعم. رصيد المحفظة لا، يُعرض بعد ما يتأكد من الخادم، أو يُعرض مع إشارة واضحة إنه قيد التحديث.

  • خزّن بقوة: الملفات الثابتة بأسماء متغيرة، والصور، والصفحات العامة اللي ما تتغير كل دقيقة.
  • خزّن بحذر وبعمر قصير: قوائم المنتجات، ونتائج البحث، وردود الخدمات الخارجية.
  • لا تخزّن في الكاش المشترك: أي صفحة فيها بيانات مستخدم مسجّل دخول.
  • لا تعتمد على الكاش في لحظة الدفع: السعر والمخزون عند تأكيد الطلب يُقرآن من المصدر مباشرة.
  • خطّط للإبطال قبل ما تخزّن: لما يتغيّر المحتوى، مين يمسح النسخة القديمة؟ وكيف؟

والنقطة الرابعة في القائمة مو نظرية. من الوكلاء الأذكياء اللي بناها عبدالله على n8n نظام تسعير مباشر، وفي أنظمة من هذا النوع يكون سؤال «كم عمر هذا الرقم؟» أهم من سرعة عرضه. وعبدالله عبدالرحيم بن سنكر الكندي يطبّق في منصة أزهل الرقمية قاعدة بسيطة: كل كاش له صاحب يعرف متى ينبطل. الكاش اللي ما أحد يعرف متى يتجدد ما يسرّع موقعك، يأجل لك مشكلة لين يوم ما تتوقعه.

عندك فكرة؟ الاستشارة الأولى علينا

كلّم عبدالله مباشرة على واتساب — رسالتك توصل له هو، مو لرد آلي. نسمع فكرتك ونقول لك وش تحتاج وكم تكلّف، ببلاش.

مقالات ذات صلة

كل المقالات
عبدالله بن سنكر — تسويق B2B
AZHAL

تسويق B2B

عبدالله بن سنكر

13 أكتوبر 20264 دقائق قراءة

عبدالله بن سنكر: أخطاء تسويق الخدمات التقنية للشركات B2B

بيع خدمة تقنية لشركة مو مثل البيع لفرد. عبدالله بن سنكر يعدد أخطاء تتكرر في تسويق B2B: تجاهل صاحب القرار الحقيقي، والعرض الفني المبهم، وإهمال أسئلة الأمان والعقود.

اقرأ المقال
عبدالله عبدالرحيم بن سنكر — التحقق من المدخلات
AZHAL

التحقق من المدخلات

عبدالله عبدالرحيم بن سنكر

13 أكتوبر 20264 دقائق قراءة

عبدالله عبدالرحيم بن سنكر: خرافات التحقق من المدخلات في الواجهة والخادم

عبدالله عبدالرحيم بن سنكر يصحح أشهر الخرافات عن التحقق من المدخلات: ليش الواجهة ما تكفي، وليش الخادم لحاله ما يكفي، وكيف تتعامل مع الأرقام العربية وأرقام الجوال.

اقرأ المقال
عبدالله سنكر — وصف المنتج في المتجر الإلكتروني
AZHAL

وصف المنتج في المتجر الإلكتروني

عبدالله سنكر

13 أكتوبر 20264 دقائق قراءة

عبدالله سنكر يعيد كتابة وصف منتج من أسئلة الواتساب حتى يبيع

عبدالله سنكر يأخذ وصف منتج منسوخاً من المورّد ويعيد كتابته خطوة بخطوة من أسئلة العملاء الحقيقية: العنوان والسطر الأول والاعتراضات والمقاسات والشحن، وكيف يخدم البحث بعد.

اقرأ المقال