سؤال

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

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

أما بالنسبة للأشياء التي جربتها: بدأت مع قاعدة بيانات SQLite بسيطة وطاولة واحدة فيها لتخزين عناصر قائمة الانتظار. في اختبار الحمل، عند زيادة مستوى التزامن، بدأت في الحصول على أخطاء "قفل قاعدة البيانات"، كما هو متوقع. كان إصلاح Quick'N'Dirty ليحل محل SQLite with MySQL - إنه يتعامل مع مشكلات التزامن بشكل جيد ولكنه يشعر وكأنه مبالغ فيه بالنسبة للأشياء البسيطة التي أحتاج إليها. تظهر عمليات DB المرتبطة الانتظار أيضا بشكل بارز في تقارير التنميط الخاصة بي.

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

المحلول

رسالة سمسار مثل أباتشي activemq. هو حل مثالي هنا.

يمكن أن يتبع خط الأنابيب:

  • تقوم عملية التطبيق المسؤولة عن معالجة طلبات HTTP بإنشاء الردود بسرعة ويرسل أولوية منخفضة، المهام الثقيلة إلى قائمة انتظار AMQ.
  • يتم الاشتراك في عمليات أخرى أو أكثر لاستهلاك قائمة انتظار AMQ وتفعل ما يهدف إلى القيام بهذه المهام الثقيلة.

يتم الوفاء بمتطلبات استمرار قائمة الانتظار خارج المربع لأن ActiveMQ يخزن الرسائل التي لم يتم استهلاكها بعد في التخزين المستمر. علاوة على ذلك، فإن المقاييس جيدا منذ أن كنت حرية نشر تطبيقات HTTP متعددة، وتطبيقات مستهلك متعددة وإمقة نفسها على أجهزة مختلفة لكل منها.

نستخدم شيئا مثل هذا في مشروعنا مكتوب في Python باستخدام سام كما بروتوكول الاتصال الأساسي.

نصائح أخرى

خادم ويب (أي خادم ويب) هو متعدد المنتجين، عملية المستهلك واحد.

الحل البسيط هو بناء Wsgiref. أو Werkzeug. خادم Backend لمعالجة طلباتك الخلفي.

نظرا لأن خادم "Backend" هو بناء باستخدام تقنية WSGI، فهذا مشابها للغاية لخادم الويب الأمامي. إلا. لا ينتج استجابات HTML (JSON عادة ما تكون أبسط). بخلاف ذلك، فإنه واضح للغاية.

يمكنك تصميم المعاملات المريحة لهذه الخلفية. يمكنك استخدام جميع ميزات WSGI المختلفة لتخليص URI، والترخيص، والمصادقة، وما إلى ذلك - عموما - لا تحتاج إلى إدارة الجلسة، لأن الخوادم المريحة لا تقدم عادة جلسات.

إذا كنت تدخل في مشكلات شديدة قابلية التوسع، فأنت ببساطة لف خادم الخلفية الخاص بك في LightTPD أو بعض محرك الويب الآخر لإنشاء الخلفية متعددة الخيوط.

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