وضع إشارة مرجعية لموضوع كبير يؤدي إلى أوقات تحميل سخيفة

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

بعد أن لاحظتُ شخصاً آخر يؤيد هذه المشكلة في هذا المنشور، قرّرتُ البحث في الأمر: أزلتُ جميع الإشارات المرجعية من الموضوع الذي يحتوي على 4,500 منشور.

تحمّل فوراً كما هو الحال مع أي منشور آخر.

ثم سألْتُ نفسي: ما الطرق الأخرى التي يمكنني من خلالها اختبار هذا؟

  • بغض النظر عما إذا قمتُ بإشارة مرجعية للمنشور الأول أو المنشور الأحدث، لا يزال التحميل يستغرق وقتاً، وإن لم يكن دقائق بل حوالي 10 ثوانٍ.
  • تفاقمت هذه الظاهرة في المواضيع ذات المنشورات الأكثر؛ أشعر بوجود حدّ معين حول 4000 منشور يجعل أوقات التحميل بطيئة بهذا الشكل.
  • اختبرتُ ذلك في مواضيع أخرى تحتوي على أكثر من 4000 منشور.
  • كلما زاد عدد الإشارات المرجعية في موضوع ما، زاد الوقت اللازم لتحميله.

أفترض أن زيادة عدد الإشارات المرجعية في موضوع يحتوي على منشورات كثيرة تؤدي إلى إطالة وقت التحميل.


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

إذا كنت بحاجة إلى تقديم أي معلومات إضافية، فلا تتردد في السؤال.

4 إعجابات

أنا متأكد تقريبًا أنني أبلغتكم بهذا من قبل @مُرتين في موضوع مختلف

إعجابَين (2)

أجل، فعلت ذلك في هذا الموضوع: Topics load slow or not at all when they have many replies and user has bookmark in them. آسف، يبدو أنني أهملت هذه النقطة؛ سأضع هذه المشكلة في مقدمة قائمتي.

إعجابَين (2)

هذا الأمر سيء بما يكفي ليجوز إرجاعه إلى الإصدار المستقر، إذا كان موجودًا فيه..

3 إعجابات

لقد أنشأت حسابًا على منتدى Roblox لرؤية https://devforum.roblox.com/t/what-are-you-working-on-currently-2020/419774/5043، وتمكنت من تكرار المشكلة هناك. بدون إشارة مرجعية، يتم تحميل الموضوع في حوالي 1.3 ثانية، بينما مع إشارة مرجعية يستغرق حوالي 8 ثوانٍ. لقد واجهت حتى خطأ 502 (بوابة خاطئة):

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

والكود الذي يبحث عن إشارة مرجعية لكل مشاركة موجود هنا:

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

لا يوجد شيء مشبوه هناك أيضًا…

إعجابَين (2)

هل يمكن أن يكون خطأً قمنا بإصلاحه في إصدار أقدم؟ :thinking:

إعجابَين (2)

لا أعتقد ذلك، فمنتدى Roblox يعمل على الإصدار Version bump to v2.6.0.beta3 · discourse/discourse@2a268bd · GitHub. منذ ذلك الحين، لم يتم دمج سوى تعديلين يتعلقان بالعلامات المرجعية (bookmarks) قمت بهما أنا، ولا يتعامل أي منهما مع تحميل العلامات المرجعية للمواضيع أو تسلسلها.

يبدو أنه يجب أن يكون هناك بعض التصادم الغريب الآخر في العمل، أليس كذلك؟

إعجاب واحد (1)

يمكنني إعادة إنتاج هذا على BBS

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

تخميني هو أن بعض التغييرات البسيطة جدًا ستقلل الوقت من حوالي 4 ثوانٍ إلى 1 ميلي ثانية.

ملاحظة لجميع القراء: تمكين أداة Mini Profiler أمر أساسي هنا، حيث يمكن أن يساعدك في العثور على الاستعلام المشكلة.

5 إعجابات

شكرًا لنصيحة @sam، اكتشفت أن السبب يعود إلى خطة استعلام ضعيفة يتم تنفيذها في هذا السطر:

topic.posts.with_deleted.where(post_number: 1).first

يحتوي كود SQL المُولَّد على LIMIT 1، مما يمنع استخدام الفهرس index_posts_on_topic_id_and_post_number، ويسبب تأخيرًا كبيرًا. لا أستطيع تكرار هذه المشكلة محليًا لأن قاعدة البيانات المحلية تحتوي على عدد قليل جدًا من المنشورات؛ فكلما زاد عدد المنشورات في منتدى Discourse الخاص بك، زادت حدة هذه المشكلة. سأقوم بتقديم إصلاح قريبًا.

3 إعجابات

إغلاق هذا كتكرار لـ:

@martin يمكنك النشر في الموضوع الأصلي هناك بمجرد حل المشكلة.

4 إعجابات