هل هناك طريقة أفضل لخدمة نتائج عملية بايثون المكلفة والمحظورة عبر HTTP؟

StackOverflow https://stackoverflow.com/questions/1929681

  •  20-09-2019
  •  | 
  •  

سؤال

لدينا خدمة ويب تخدم شرائح صغيرة عشوائية من مخزون ثابت من ملفات MP3 الأكبر حجمًا.يتم إنشاء ملفات MP3 أثناء التنقل بواسطة تطبيق بايثون.النموذج هو تقديم طلب GET إلى عنوان URL لتحديد المقاطع التي تريدها، والحصول على audio/mpeg تيار ردا على ذلك.هذه عملية مكلفة.

نحن نستخدم Nginx كمعالج للطلبات الأمامية.يعتني Nginx بالتخزين المؤقت للاستجابات للطلبات الشائعة.

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

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

وأخيراً السؤال:هل نفتقد أي شيء؟هل هناك طريقة أفضل لخدمة الموارد باهظة الثمن لوحدة المعالجة المركزية عبر HTTP؟

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

بالنسبة لأولئك الذين سارعوا إلى معالجة المشكلة بشكل أسرع، يتعامل Tornado والقليل من الخيوط المتعددة (على الرغم من مشكلة تكامل البيانات التي قدمتها الخيوط) مع الحمل بشكل مقبول على مثيل Amazon EC2 صغير (أحادي النواة).

هل كانت مفيدة؟

المحلول

هل ترتكب خطأ في استخدام الوضع المضمن لـ Apache/mod_wsgi؟يقرأ:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

تأكد من استخدام الوضع الخفي في حالة استخدام Apache/mod_wsgi.

نصائح أخرى

هل جربت وضع البيض؟إنه خادم WSGI مع مجموعة مرنة من أوضاع الترابط.

قد تفكر في نظام الطابور باستخدام طرق إعلام AJAX.

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

بعد ذلك، عليك كتابة خدمة خلفية تعمل على تدوير سلاسل العمليات.يقوم هؤلاء العمال ببساطة بإلغاء الطلب، وإنشاء البيانات، ثم حفظ موقع البيانات في كائن الطلب.

يمكن لصفحة الويب إجراء مكالمات AJAX إلى الخادم الخاص بك لمعرفة تقدم عملية الإنشاء ولإعطاء رابط للملف بمجرد توفره.

هذه هي الطريقة التي تعمل بها مواقع الوسائط الكبيرة - تلك التي تتعامل مع الفيديو على وجه الخصوص.ومع ذلك، قد يكون الأمر مبالغًا فيه بالنسبة لعمل MP3 الخاص بك.

بدلاً عن ذلك, ، فكر في تشغيل جهازين لتوزيع الحمل.ستظل سلاسل الرسائل الخاصة بك على Apache محظورة، ولكن على الأقل لن تستهلك الموارد الموجودة على خادم الويب.

يرجى تعريف "الحمل المتتالي"، لأنه ليس له معنى شائع.

ستكون مشكلتك على الأرجح إذا كنت تقوم بتشغيل عدد كبير جدًا من عمليات Apache.

بالنسبة لحمل مثل هذا، تأكد من أنك تستخدم prefork mpm، وتأكد من أنك تقتصر على عدد مناسب من العمليات (ما لا يقل عن عملية واحدة لكل وحدة المعالجة المركزية، وليس أكثر من اثنتين).

يبدو أنك تفعل الأشياء بشكل صحيح - فقط تفتقر إلى طاقة وحدة المعالجة المركزية:هل يمكنك تحديد ما هو تحميل وحدة المعالجة المركزية في عملية إنشاء ملفات MP3 هذه؟

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

راجع للشغل، كان التوسع في الويب هو موضوع المحاضرة الرئيسية التي ألقاها جاكوب كابلان موس حول PyCon Brasil هذا العام، وهي أبعد ما تكون عن كونها مشكلة مغلقة.إن مجموعة التقنيات التي يحتاج المرء للتعامل معها رائعة جدًا - (لم أتمكن من العثور على نسخة عبر الإنترنت من العرض التقديمي، رغم ذلك - - آسف لذلك)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top