أخطاء قاعدة البيانات مخبأة لمدة 30 دقيقة في client_settings_json - فشل تحميل الموقع

الأولوية/الخطورة: نادر ولكنه حرج
يصبح الموقع غير قابل للاستخدام لمدة تصل إلى 30 دقيقة بعد أخطاء قاعدة البيانات العابرة. تفشل الصفحات في التحميل بشكل صحيح بسبب إعدادات العميل المفقودة التي تسبب أخطاء JavaScript.

المنصة:

  • يؤثر على: جميع تثبيتات Discourse
  • تمت ملاحظته في: بيئات الإنتاج التي تواجه مشكلات اتصال بقاعدة البيانات العابرة

الوصف

النتيجة الفعلية
عند حدوث خطأ عابر في قاعدة البيانات (انتهاء مهلة الاتصال، استنفاد المجموعة، خلل في الشبكة)، يتم تخزين الخطأ مؤقتًا لمدة 30 دقيقة. خلال هذا الوقت:

  • يفشل الموقع في التحميل بشكل صحيح - تظهر الصفحات معطلة أو غير وظيفية
  • تحدث أخطاء JavaScript من جانب العميل بسبب الإعدادات المفقودة/غير الصالحة
  • يسجل كل طلب “Nil client_settings_json from the cache for ‘client_settings_json[git_version]’”
  • يتم إرجاع إعدادات عميل فارغة إلى المتصفح
  • يستمر هذا حتى بعد استعادة قاعدة البيانات بالكامل

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

خطوات التكرار

  1. ابدأ تشغيل مثيل Discourse مع تكوين إعدادات العميل
  2. قم بمحاكاة مشكلة في اتصال قاعدة البيانات (على سبيل المثال، استنفاد مجموعة الاتصال، إدخال تأخير في الشبكة، أو حظر المنفذ 5432 مؤقتًا)
  3. قم بإجراء طلب يؤدي إلى تشغيل SiteSetting.client_settings_json (سيؤدي أي تحميل للصفحة إلى ذلك)
  4. لاحظ الخطأ: “Error while generating client_settings_json_uncached: [database error]”
  5. تفشل الصفحات في العرض بشكل صحيح، وتظهر وحدة تحكم JavaScript أخطاء متعلقة بالإعدادات المفقودة
  6. استعادة اتصال قاعدة البيانات
  7. قم بإجراء طلبات إضافية على مدار الـ 30 دقيقة التالية. استمر في رؤية أخطاء “Nil client_settings_json from the cache” على الرغم من صحة قاعدة البيانات
  8. بعد 30 دقيقة، تنتهي صلاحية ذاكرة التخزين المؤقت ويستعيد الموقع أخيرًا

تأثير المستخدم

الموقع معطل فعليًا خلال هذه الفترة:

  • لا يتم عرض الصفحات بشكل صحيح
  • تفشل تطبيقات JavaScript في التهيئة بسبب نقص التكوين

هذا يحول خللًا في قاعدة البيانات مدته ثانية واحدة إلى انقطاع لمدة 30 دقيقة.

السبب الجذري

في lib/site_setting_extension.rb، تلتقط الطريقة client_settings_json_uncached الاستثناءات وترجع nil. يتم تخزين هذا الـ nil مؤقتًا لمدة 30 دقيقة، مما يؤدي إلى تعطل الموقع.

الإصلاح المقترح

تم تقديم طلب سحب لإصلاح هذه المشكلة. يتطلب الإصلاح تغييرًا بسيطًا لإعادة طرح الاستثناء بدلاً من إرجاع nil.

لماذا يعمل:

  1. إعادة طرح الاستثناء يمنع Discourse.cache.fetch من تخزين الخطأ مؤقتًا
  2. الطريقة الخارجية client_settings_json لديها بالفعل معالجة استثناءات مناسبة ترجع “” (سلسلة فارغة) دون تخزينها مؤقتًا
  3. يمكن للموقع الاستمرار في العمل أثناء مشكلات قاعدة البيانات (وإن كان متدهورًا)
  4. يستعيد الموقع تلقائيًا في الطلب التالي بمجرد أن تكون قاعدة البيانات سليمة
  5. يضمن الإصلاح عدم تسبب أخطاء قاعدة البيانات العابرة في انقطاع لمدة 30 دقيقة.

التأثير

تؤثر هذه المشكلة على جميع تثبيتات Discourse التي تواجه مشكلات قاعدة بيانات عابرة:

  • استنفاد مجموعة الاتصال أثناء ذروة حركة المرور
  • أعطال الشبكة بين التطبيق وقاعدة البيانات
  • سيناريوهات فشل قاعدة البيانات (على سبيل المثال، التبديل بين الأساسي/النسخ المتماثل)
  • تنازع القفل على جدول site_settings
  • انتهاء مهلة الاستعلام بسبب الاستعلامات البطيئة

الخطورة: أي من هذه المشكلات الشائعة والعابرة تتسبب في أن يصبح الموقع بأكمله غير قابل للاستخدام لمدة 30 دقيقة، حتى لو تم حل المشكلة الأساسية في ثوانٍ.

الحل البديل

إذا كنت تواجه هذه المشكلة الآن، يمكنك مسح ذاكرة التخزين المؤقت يدويًا لاستعادة الخدمة:

في وحدة تحكم Rails

Discourse.cache.delete(SiteSettingExtension.client_settings_cache_key)
إعجابَين (2)

صيد رائع، سأعمل على إصلاح هذا.

5 إعجابات

يبدو أنه تم دمجه، شكراً جزيلاً.

إعجابَين (2)