عند تحرير وحفظ المنشورات الطويلة جدًا (حوالي 100,000 حرف)، واجهنا مشكلة في انتهاء مهلة الخادم الخلفي. يصبح الخادم غير مستجيب أثناء عملية الحفظ، مما يؤدي إلى حدوث أخطاء 502/504. يعرض وحدة تحكم الواجهة الأمامية مجموعة الأخطاء التالية:
ajax-error.js:36:15
l ajax-error.js:36
u ajax-error.js:75
d ajax-error.js:84
Ember 41
update rest.js:72
update rest.js:72
save rest.js:115
editPost composer.js:1147
Ember 6
أجريت بعض الاختبارات المقارنة التي تشير إلى أن الاختناق البرمجي يكمن في حساب الفرق بين الإصدارات القديمة والجديدة:
يؤدي تحرير منشور طويل A وتحويله مباشرة إلى منشور طويل B وحفظه باستمرار إلى حدوث مهلة 502/504.
يؤدي مسح المنشور الطويل أولاً، وحفظ عنصر نصاب قصير (مثل 5 أحرف)، ثم لصق المحتوى الجديد الكامل B والحفظ، إلى إكمال العملية بسرعة.
يبدو أن محرك الاختلاف الحالي يواجه صعوبات في الحالات القصوى التي تتضمن نصوصًا طويلة جدًا مع نسبة تغيير عالية. هل من الممكن إضافة آلية احتياطية للأداء؟ على سبيل المثال، عندما يكون النص طويلاً للغاية ونسبة التعديل عالية، يمكن للنظام معاملته على أنه “إعادة كتابة كاملة” بدلاً من إجراء مقارنة تفصيلية سطرًا بسطر.
هل لدى الفريق أي خطط لتحسين التعامل مع الاختلافات في المنشورات الكبيرة، أو إدخال نوع من التدهور التدريجي / الحماية لمثل هذه السيناريوهات؟ فكرة أخرى هي السماح بإتمام الحفظ أولاً، ثم حساب الاختلاف بشكل غير متزامن لاحقًا.
في هذه الأثناء، سجلات يونيكورن على جانب الخادم التقطت نقطة انتهاء المهلة بالضبط، مؤكدةً أن العملية قُتلت أثناء معالجة اختلاف الماركداون:
تلقت عملية يونيكورن إشارة USR2 تشير إلى أنها على وشك انتهاء مهلتها، جاري طباعة تتبع المكدس (backtrace) للخيال الرئيسي
config/unicorn.conf.rb:204:in `backtrace'
config/unicorn.conf.rb:204:in `block (2 levels) in reload'
/var/www/discourse/lib/discourse_diff.rb:172:in `[]'
/var/www/discourse/lib/discourse_diff.rb:172:in `tokenize_markdown'
/var/www/discourse/lib/discourse_diff.rb:115:in `side_by_side_markdown'
/var/www/discourse/app/serializers/post_revision_serializer.rb:128:in `body_changes'
...
في فبراير، أضفت `diff_too_complex: “التباين معقد جدًا لعرضه. يرجى محاولة عرض التعديلات الأصغر حجمًا بشكل فردي.”`. سيتوقف خوارزمية التباين لدينا إذا أصبحت الأمور معقدة للغاية.
هل تقوم بتشغيل أحدث إصدار هنا؟ يجب أن يتعامل مع هذه الحالات، ما لم يكن لديك خادم ضعيف للغاية.
كنتُ أستخدم النسخة المبكرة من هذا العام سابقاً، لكنني قمت للتو بالترقية إلى أحدث إصدار على الإطلاق!
بعد الترقية، تمكنتُ بنجاح من رؤية رسالة «الاختلاف معقد جداً لعرضه»، وبصراحة، هذا أمر رائع. على الأقل لا يتعطل البرنامج بشكل كامل ولا يزال يسمح لي بالمضي قدماً وحذف سجلات التعديلات.
كما يبدو أن مشكلة التجميد/التعثر أثناء تحرير المنشورات الضخمة قد تم إصلاحها الآن. لستُ متأكداً تماماً بعد، ولكن خلال آخر اختبار لي، حدث تعثر بسيط ثم تمت معالجة النسخة المعدلة بنجاح، ولله الحمد.
سأقوم بإجراء المزيد من الاختبارات على هذا. شكراً جزيلاً!
أعتقد أنه يمكن تعديل حد “الفرق معقد للغاية”، لذا إذا شعرت أن هناك حاجة لذلك، يمكننا البحث عن حل مناسب (هناك العديد من العوامل التي يجب أخذها في الاعتبار، لذا قد لا يكون هناك حل واحد يناسب الجميع)