طريقة تخزين الدولة منذ فترة طويلة عملية استدعاء من جانغو?

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

سؤال

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

أستطيع التعامل مع الاقتراع بسهولة بما فيه الكفاية, ولكن أنا لست متأكدا من أين الموقع المناسب لتخزين عملية الدولة.فإنه يجب أن يكون قابل للكتابة من قبل بايرو عملية و قابلة للقراءة من قبل بلدي استطلاعات الرأي.

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

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

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

المحلول

ونحن نفعل ذلك من خلال وجود "طلب" الجدول في قاعدة البيانات.

عند تحميل تصل نخلق الكائن الملف الذي تم تحميله ، وخلق الطلب.

نبدأ في الخلفية دفعة المعالج.

نعود 200 "نحن نعمل على ذلك" الصفحة -- فإنه يدل على طلبات وضعهم.

لدينا دفعة المعالج يستخدم جانغو ORM.عندما ينتهي, تحديث وجوه الطلب.ونحن يمكن (ولكن لا) إرسال إشعار البريد الإلكتروني.في الغالب نحن فقط تحديث الحالة بحيث يمكن للمستخدم تسجيل الدخول مرة أخرى ونرى أن معالجة أكملت.


دفعة الخادم الملاحظات.

انها WSGI الخادم الذي ينتظر على منفذ تجهيز دفعة الطلب.الطلب هو الراحة بعد مع رقم الهوية;دفعة المعالج يبدو هذا الأمر في قاعدة البيانات والعمليات عليها.

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

أيضا لدينا بسيطة crontab للتحقق من أنه قيد التشغيل.في الغالب سيكون من أسفل لمدة 30 دقيقة بين "هل أنت على قيد الحياة ؟" الشيكات.ليس لدينا رسمي النصي لبدء التشغيل (نجري تحت اباتشي مع mod_wsgi) ، ولكن قد خلق "إعادة" السيناريو الذي يمس WSGI الملف ثم يقوم آخر إلى عنوان URL الذي يقوم الصحية الاختيار (ويبدأ المعالج دفعة).

عندما الدفعة تشغيل الملقم, قد يكون هناك المجهزة الطلبات التي لم يحصل على وظيفة.لذا بدء التشغيل الافتراضي هو سحب كل من طلب الانتظار-على افتراض أنه قد غاب عن شيء.

نصائح أخرى

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

يمكنك بالطبع استخدام قاعدة البيانات كقائمة انتظار ولكن هناك حلول تم تطويرها خصيصًا لهذا الغرض.

AMQP مصنوع فقط من أجل ذلك.معا مع كرفس أو جزرة وخادم وسيط مثل RabbitMQ أو ZeroMQ.

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

بالنسبة لمشكلتك، يبدو أن Celery وRabbitMQ هما الأنسب.يوفر RabbitMQ استمرارية رسائلك، ويعرض Celery طرق عرض سهلة للاقتراع للتحقق من حالة العمليات التي يتم تشغيلها بالتوازي.

قد تكون أيضا مهتما ب الأخطبوط.

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

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

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