تدافع المخبأ

يُعدّ اندفاع التخزين المؤقت نوعًا من أنواع الأعطال المتتالية التي قد تحدث عندما تتعرض أنظمة الحوسبة المتوازية الضخمة المزودة بآليات التخزين المؤقت لحملٍ عالٍ جدًا. ويُطلق على هذا السلوك أحيانًا اسم "التكدس" . [ 1 ] [ 2 ]

لفهم كيفية حدوث ازدحام ذاكرة التخزين المؤقت، تخيل خادم ويب يستخدم memcached لتخزين الصفحات المعروضة مؤقتًا لفترة من الزمن، لتخفيف الحمل على النظام. عند تعرض عنوان URL واحد لحمل عالٍ بشكل خاص، يظل النظام متجاوبًا طالما بقي المورد مخزنًا مؤقتًا، حيث تتم معالجة الطلبات من خلال الوصول إلى النسخة المخزنة. هذا يقلل من عملية العرض المكلفة.

في ظل الأحمال المنخفضة، تؤدي حالات عدم العثور على البيانات في ذاكرة التخزين المؤقت إلى إعادة حساب عملية العرض مرة واحدة. سيستمر النظام في العمل كالمعتاد، مع الحفاظ على متوسط ​​الحمل منخفضًا جدًا نظرًا لارتفاع معدل نجاح الوصول إلى البيانات في ذاكرة التخزين المؤقت.

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

على سبيل المثال، لنفترض أن الصفحة المعنية تستغرق 3 ثوانٍ للتحميل، وأن معدل الزيارات يبلغ 10 طلبات في الثانية. عندئذٍ، عندما تنتهي صلاحية الصفحة المخزنة مؤقتًا، يكون لدينا 30 عملية تعمل في وقت واحد على إعادة حساب تحميل الصفحة وتحديث ذاكرة التخزين المؤقت بالصفحة المعروضة.

الاستخدام النموذجي لذاكرة التخزين المؤقت

فيما يلي نمط استخدام نموذجي لذاكرة التخزين المؤقت لعنصر يحتاج إلى التحديث كل وحدات زمنية ttl :

دالة جلب ( المفتاح ، مدة الصلاحية ) { القيمة ← قراءة_ذاكرة_التخزين_المؤقتة( المفتاح ) إذا (! القيمة ) { القيمة ← إعادة_حساب_القيمة() cache_write( key , value , ttl ) } القيمة المُعادة }

إذا استغرقت الدالة recompute_value() وقتًا طويلاً وتم الوصول إلى المفتاح بشكل متكرر، فستقوم العديد من العمليات باستدعاء recompute_value() في وقت واحد عند انتهاء صلاحية قيمة ذاكرة التخزين المؤقت.

في تطبيقات الويب النموذجية، قد تستعلم الدالة recompute_value() عن قاعدة بيانات، أو تصل إلى خدمات أخرى، أو تُجري عملية حسابية معقدة (وهذا هو سبب تخزين هذه العملية الحسابية تحديدًا مؤقتًا). عندما يرتفع معدل الطلبات، ستعاني قاعدة البيانات (أو أي مورد مشترك آخر ) من ضغط هائل على الطلبات/الاستعلامات، مما قد يؤدي بدوره إلى انهيار النظام.

تخفيف آثار التدافع على مخابئ الطعام

تم اقتراح عدة مناهج للتخفيف من حدة التدافع على مخابئ الكنوز (المعروف أيضًا باسم منع التدافع الجماعي). ويمكن تصنيفها تقريبًا إلى 3 فئات رئيسية.

قفل

لمنع عمليات إعادة الحساب المتعددة والمتزامنة لنفس القيمة، عند حدوث خطأ في ذاكرة التخزين المؤقت، ستحاول العملية الحصول على قفل مفتاح ذاكرة التخزين المؤقت هذا وإعادة حسابه فقط إذا حصلت عليه.

توجد خيارات تنفيذ مختلفة في حالة عدم الحصول على القفل:

  • انتظر حتى يتم إعادة حساب القيمة.
  • أعد قيمة "غير موجود" واجعل العميل يتعامل مع غياب القيمة بشكل صحيح.
  • احتفظ بنسخة قديمة من العنصر في ذاكرة التخزين المؤقت لاستخدامها أثناء إعادة حساب القيمة الجديدة.

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

إعادة الحساب الخارجي

ينقل هذا الحل عملية إعادة حساب قيمة ذاكرة التخزين المؤقت من العمليات التي تحتاجها إلى عملية خارجية. ويمكن تفعيل إعادة حساب هذه العملية الخارجية بطرق مختلفة:

  • عندما تقترب قيمة ذاكرة التخزين المؤقت من تاريخ انتهاء صلاحيتها
  • بشكل دوري
  • عندما تواجه عملية تحتاج إلى القيمة خطأ في ذاكرة التخزين المؤقت

يتطلب هذا النهج عنصرًا إضافيًا - العملية الخارجية - التي تحتاج إلى صيانة ومراقبة. إضافةً إلى ذلك، يتطلب هذا الحل فصلًا/تكرارًا غير طبيعي للشيفرة، وهو مناسب في الغالب لمفاتيح التخزين المؤقت الثابتة (أي غير المُولَّدة ديناميكيًا، كما هو الحال مع المفاتيح المفهرسة بواسطة مُعرِّف).

انتهاء الصلاحية المبكر الاحتمالي

باستخدام هذا النهج، يمكن لكل عملية إعادة حساب قيمة الذاكرة المؤقتة قبل انتهاء صلاحيتها من خلال اتخاذ قرار احتمالي مستقل، حيث تزداد احتمالية إجراء إعادة الحساب المبكر كلما اقتربنا من تاريخ انتهاء صلاحية القيمة. وبما أن القرار الاحتمالي يُتخذ بشكل مستقل من قِبل كل عملية، فإن تأثير التدافع يقلّ لأن عددًا أقل من العمليات ستنتهي صلاحيتها في الوقت نفسه.

لقد ثبت أن التنفيذ التالي القائم على التوزيع الأسي هو الأمثل من حيث فعاليته في منع التدافع وكيفية حدوث عمليات إعادة الحساب المبكرة. [ 3 ]

دالة x-fetch( المفتاح ، ttl ، بيتا = 1) { القيمة ، دلتا ، انتهاء الصلاحية ← cache_read( المفتاح ) إذا (! القيمة || (الوقت() - دلتا * بيتا * لوغاريتم(rand(0,1))) ≥ انتهاء الصلاحية ) { البداية ← الوقت() القيمة ← recompute_value() دلتا ← الوقت() – البداية cache_write( key , ( value , delta ), ttl ) } القيمة المُعادة }

يمكن ضبط قيمة المعامل بيتا على قيمة أكبر من 1 لتفضيل إعادة الحسابات المبكرة وتقليل حالات التدافع، لكن المؤلفين أظهروا أن ضبط بيتا على 1 يُجدي نفعًا عمليًا. يُمثل المتغير دلتا الوقت اللازم لإعادة حساب القيمة، ويُستخدم لضبط توزيع الاحتمالية بشكل مناسب.

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

مراجع

  1. غالبريث، باتريك (2009)، تطوير تطبيقات الويب باستخدام أباتشي، ماي إس كيو إل، ميمكاش، وبيرل ، جون وايلي وأولاده، ص  353، رقم ISBN 9780470538326.
  2. ألسباو، جون؛ روبنز، جيسي (2010)، عمليات الويب: الحفاظ على البيانات في الوقت المناسب ، أورايلي ميديا، ص 128-132 ، ISBN  9781449394158.
  3. فاتاني، أ.؛ تشيريكيتي، ف.؛ لوينشتاين، ك. (2015)، "الوقاية المثلى الاحتمالية من تدافع المخازن المؤقتة" (ملف PDF) ، وقائع مؤسسة VLDB ، 8 (8)، VLDB: 886-897 ، doi : 10.14778/2757807.2757813 ، ISSN 2150-8097 .
  • التقليل من حالات التدافع ، جوشوا ثيجسن، 2010
  • مشاكل وحلول الاستخدام النموذجي لذاكرة التخزين المؤقت في لغة بيرل ، جوناثان شوارتز، 2008