2009-05-12 5 views
5

मैं एक Django एप्लिकेशन पर काम कर रहा हूं जो उपयोगकर्ता को फ़ाइलों को अपलोड करने की अनुमति देता है। मुझे Amazon S3 पर भेजने से पहले इन फ़ाइलों पर कुछ सर्वर-साइड प्रसंस्करण करने की आवश्यकता है। this question और this blog post पर प्रतिक्रियाओं को पढ़ने के बाद मैंने फैसला किया कि इसे संभालने का सबसे अच्छा तरीका यह है कि मेरा व्यू हैंडलर Pyro रिमोट ऑब्जेक्ट पर एक विधि को अतुल्यकालिक रूप से प्रोसेस करने के लिए एक विधि का आह्वान करता है और फिर तुरंत क्लाइंट को एचटीपी 200 लौटाता है। मेरे पास यह प्रोटोटाइप है और ऐसा लगता है कि यह अच्छी तरह से काम करता है, हालांकि, मैं प्रसंस्करण की स्थिति को भी स्टोर करना चाहता हूं ताकि ग्राहक यह देखने के लिए आवेदन कर सके कि फ़ाइल संसाधित हो गई है और एस 3 पर अपलोड की गई है।मैं Django से एक लंबी चल रही प्रक्रिया के लिए राज्य को कैसे स्टोर करना चाहिए?

मैं आसानी से मतदान को संभाल सकता हूं, लेकिन मुझे यकीन नहीं है कि प्रक्रिया स्थिति को संग्रहीत करने के लिए उचित स्थान कहां है। इसे पाइरो प्रक्रिया द्वारा लिखने योग्य और मेरे मतदान दृश्य द्वारा पठनीय होने की आवश्यकता है।

  • मुझे डेटा के लिए डेटाबेस में कॉलम जोड़ने में संकोच नहीं है जो वास्तव में केवल 30 से 60 सेकंड तक जारी रहना चाहिए।
  • मैंने Django के low-level cache API का उपयोग करने और कुंजी आईडी के रूप में फ़ाइल आईडी का उपयोग करने पर विचार किया है, हालांकि, मुझे विश्वास नहीं है कि यह वास्तव में कैश फ्रेमवर्क के लिए डिज़ाइन किया गया है और मुझे यकीन नहीं है कि यह जाने के साथ क्या अप्रत्याशित समस्याएं हो सकती हैं मार्ग।
  • आखिरकार, मैंने प्रसंस्करण करने वाले पाइरो ऑब्जेक्ट में राज्य को संग्रहीत करने पर विचार किया है, लेकिन फिर भी ऐसा लगता है कि मुझे एक बूलियन "प्रोसेसिंग_कंपलेट" डेटाबेस कॉलम जोड़ने की आवश्यकता होगी ताकि दृश्य जानता हो कि पाइरो से राज्य से पूछताछ हो या नहीं वस्तु।

बेशक, डेटाबेस से decoupling स्थिति के साथ कुछ डेटा अखंडता चिंताओं भी हैं (क्या होता है यदि सर्वर नीचे चला जाता है और यह सब डेटा स्मृति में है?)। मुझे यह सुनना है कि अधिक अनुभवी वेब एप्लिकेशन डेवलपर्स इस तरह के राज्यव्यापी प्रसंस्करण को कैसे संभालेंगे।

उत्तर

6

हम डेटाबेस में "अनुरोध" तालिका रखते हुए ऐसा करते हैं।

जब अपलोड आता है, तो हम अपलोड की गई फ़ाइल ऑब्जेक्ट बनाते हैं, और एक अनुरोध बनाते हैं।

हम पृष्ठभूमि बैच प्रोसेसर शुरू करते हैं।

हम 200 "हम इस पर काम कर रहे हैं" पृष्ठ लौटाते हैं - यह अनुरोध और उनकी स्थिति दिखाता है।

हमारे बैच प्रोसेसर Django ORM का उपयोग करता है। जब यह समाप्त होता है, तो यह अनुरोध ऑब्जेक्ट को अपडेट करता है। हम एक ईमेल अधिसूचना भेज सकते हैं (लेकिन नहीं)। अधिकतर, हम केवल स्थिति अपडेट करते हैं ताकि उपयोगकर्ता फिर से लॉग इन कर सके और देख सके कि प्रसंस्करण पूरा हो गया है।


बैच सर्वर आर्किटेक्चर नोट्स।

यह एक डब्लूएसजीआई सर्वर है जो बैच प्रोसेसिंग अनुरोध के लिए बंदरगाह पर इंतजार कर रहा है। अनुरोध आईडी नंबर के साथ एक पोस्ट पोस्ट है; बैच प्रोसेसर इसे डेटाबेस में देखता है और इसे संसाधित करता है।

सर्वर हमारे आरईएसटी इंटरफेस द्वारा स्वचालित रूप से शुरू किया गया है। यदि यह नहीं चल रहा है, तो हम इसे फेंक देते हैं। यह उपयोगकर्ता लेनदेन धीमा दिखाई देता है, लेकिन, ओह ठीक है। यह दुर्घटनाग्रस्त नहीं है।

इसके अलावा, हमारे पास यह जांचने के लिए एक सरल क्रॉन्टाब है कि यह चल रहा है। सबसे अधिक, यह "आप जीवित हैं" के बीच 30 मिनट के लिए नीचे हो जाएगा? जाँच करता है।हमारे पास औपचारिक स्टार्टअप स्क्रिप्ट नहीं है (हम apache के तहत mod_wsgi के साथ चलते हैं), लेकिन हम एक "पुनरारंभ" स्क्रिप्ट बना सकते हैं जो डब्लूएसजीआई फ़ाइल को छूता है और फिर एक यूआरएल पर एक पोस्ट करता है जो स्वास्थ्य जांच करता है (और शुरू होता है बैच प्रोसेसर)।

जब बैच सर्वर शुरू होता है, तो अप्रतिबंधित अनुरोध हो सकते हैं जिसके लिए इसे कभी भी पोस्ट नहीं मिला है। इसलिए, डिफॉल्ट स्टार्टअप अनुरोध कतार से सभी काम खींचना है - मान लीजिए कि यह कुछ याद कर सकता है।

+0

इस रात के बारे में सोचने के बाद मैंने फैसला किया है कि आप बिल्कुल सही हैं। यह समझ में नहीं आता है कि डेटाबेस का उपयोग न करें। मैंने यह भी तय किया है कि पाइरो यहां एक खराब फिट है और मुझे केवल सामान्य लोगों को करना चाहिए और लॉक फ़ाइल के साथ क्रॉन जॉब का उपयोग करना चाहिए। – bouvard

+0

हम क्रॉन का उपयोग नहीं करते हैं। हमारे पास एक छोटी डब्लूएसजीआई सर्वर के रूप में हमारी बैच प्रणाली है और हम इसे उठाने के लिए urllib2 के साथ एक HTTP अनुरोध करते हैं। यह डब्लूएसजीआई अनुरोध से अनुरोध आईडी प्राप्त करता है; सामान्य Django ORM के साथ विवरण प्राप्त करता है। –

+0

यह है कि मैंने पाइरो के साथ क्या करने की योजना बनाई है, लेकिन मुझे जिस समस्या का पता चलता है वह यह है कि अचानक सर्वर आउटेज दस्तावेजों को आधा संसाधित कर सकता है और प्रसंस्करण को फिर से शुरू करने के लिए कोई नया अनुरोध संदेश नहीं होगा। अगर मैं क्रॉन नौकरी का उपयोग करता हूं तो मुझे पता है कि मैं अनुरोध तालिका से पुरानी 10 अधूरा नौकरियां चुन सकता हूं और मैं किसी भी ऐसे पिकअप को उठाऊंगा जो आउटेज के दौरान कटऑफ हो। – bouvard

1

तो, यह एक नौकरी कतार है जिसकी आपको आवश्यकता है। आपके मामले के लिए, मैं पूरी तरह से राज्य को बचाने के लिए डीबी के साथ जाऊंगा, भले ही वे राज्य अल्पकालिक हों। ऐसा लगता है कि आपकी सभी आवश्यकताओं को पूरा करेगा, और इसे लागू करने में बहुत मुश्किल नहीं है क्योंकि आपके पास पहले से ही सभी चल रहे हिस्सों हैं, जो आपके लिए उपलब्ध हैं। इसे तब तक सरल रखें जब तक आप को कुछ और जटिल की आवश्यकता न हो।

यदि आपको कुछ अधिक शक्तिशाली या अधिक परिष्कृत की आवश्यकता है, तो मुझे Gearman जैसे कुछ दिखाई देगा।

5

मुझे पता है कि यह एक पुराना सवाल है लेकिन किसी को भी इस समय के बाद भी मेरा उत्तर उपयोगी हो सकता है, इसलिए यहां जाता है।

आप निश्चित रूप से डेटाबेस का उपयोग कतार के रूप में कर सकते हैं लेकिन उस उद्देश्य के लिए बिल्कुल समाधान विकसित किए गए हैं।

AMQP बस इसके लिए बनाया गया है। Celery या Carrot और RabbitMQ या ZeroMQ जैसे ब्रोकर सर्वर के साथ।

यही वह है जो हम अपने नवीनतम प्रोजेक्ट में उपयोग कर रहे हैं और यह बहुत अच्छा काम कर रहा है।

आपकी समस्या के लिए Celery और RabbitMQ एक बेहतरीन फिट जैसा लगता है। RabbitMQ आपके संदेशों की दृढ़ता प्रदान करता है, और सेलेरी समानांतर में चल रही प्रक्रियाओं की स्थिति की जांच करने के लिए मतदान के लिए आसान विचारों का खुलासा करता है।

आपको octopy में रुचि भी हो सकती है।