2010-11-22 16 views
5

सेलेरी में निष्पादित कार्यों को संभालने का सबसे अच्छा तरीका क्या है जहां परिणाम बड़ा है? मैं टेबल डंप और जैसे चीजों की सोच रहा हूं, जहां मैं सैकड़ों मेगाबाइट्स में डेटा लौटा सकता हूं।जब कार्य परिणाम बड़े होते हैं तो मुझे सेलरी का उपयोग कैसे करना चाहिए?

मुझे लगता है कि परिणाम डेटाबेस में संदेश को क्रैम करने का निष्पक्ष दृष्टिकोण यहां मेरी सेवा नहीं करेगा, अगर मैं अपने परिणाम बैकएंड के लिए एएमक्यूपी का उपयोग करता हूं तो बहुत कम। हालांकि, मेरे पास इनमें से कुछ हैं जहां विलंबता एक मुद्दा है; निर्यात के विशेष उदाहरण के आधार पर, कभी-कभी मुझे तब तक अवरुद्ध करना पड़ता है जब तक यह कार्य क्लाइंट से निर्यात डेटा को वापस नहीं लौटाता और सीधे निर्यात डेटा को छोड़ देता है (निर्यात सामग्री के लिए एक HTTP अनुरोध आया है, यह अस्तित्व में नहीं है, लेकिन प्रदान किया जाना चाहिए उस अनुरोध के जवाब में ... कोई फर्क नहीं पड़ता कि कितना समय लगता है)

तो, इसके लिए कार्यों को लिखने का सबसे अच्छा तरीका क्या है?

उत्तर

4

एक विकल्प आपके सभी कार्यकर्ता मशीनों पर एक स्थिर HTTP सर्वर चलाना होगा। आपका कार्य तब स्थिर परिणाम को एक मूल फ़ाइल में स्थिर रूट में डंप कर सकता है और फ़ाइल के लिए एक यूआरएल संदर्भ वापस कर सकता है। रिसीवर परिणाम को इसके अवकाश पर ला सकता है।

उदाहरण के लिए। थोड़ा कुछ इस तरह:

@task 
def dump_db(db): 
    # Some code to dump the DB to /srv/http/static/db.sql 
    return 'http://%s/%s.sql' % (socket.gethostname(), db) 

आप निश्चित रूप से पुरानी फ़ाइलों उठा, साथ ही विशिष्टता की गारंटी है, और शायद अन्य मुद्दों में से कुछ का मतलब है की आवश्यकता होगी, लेकिन आप सामान्य विचार मिलता है।

0

मैं बहु-मेगाबाइट परिणामों को फाइलों में लिखने के लिए अपने ऐप को संरचित करके इसे संभालता हूं, जिसे मैं स्मृति में याद करता हूं ताकि उन्हें उस डेटा का उपयोग करने वाली सभी प्रक्रियाओं में साझा किया जा सके ... यह पूरी तरह से सवाल उठाने के सवाल को पूरा करता है कि कैसे प्राप्त करें परिणाम किसी अन्य मशीन पर होते हैं, लेकिन यदि परिणाम बड़े होते हैं, तो ऐसा लगता है कि ये कार्य आंतरिक प्रक्रियाओं को सर्वर प्रक्रियाओं के बीच समन्वयित करते हैं।