5

मैं लोचदार बीनस्टॉक पर अपने डीजेगो एप्लिकेशन के लिए दैनिक कार्य स्थापित करने की कोशिश कर रहा हूं। इसे स्थापित करने के लिए एक स्वीकार्य तरीका प्रतीत नहीं होता है, क्योंकि सेलेरी बीट Django में आवधिक कार्यों के लिए जाने-माने समाधान है, लेकिन लोड-संतुलित वातावरण के लिए यह बहुत अच्छा नहीं है।एलैस्टिक बीनस्टॉक पर संभवतः डैंजो में आवधिक कार्य (संभवतः सेलेरी बीट के साथ)

मैंने कुछ समाधानों को नेता_ऑनली = ट्रू के साथ सेलेरी बीट स्थापित करने जैसी चीजों को देखा है, केवल एक उदाहरण चलाने के लिए, लेकिन यह विफलता का एक बिंदु छोड़ देता है। मैंने अन्य समाधानों को देखा है जो सेलेरी बीट के कई उदाहरणों को अनुमति देते हैं और यह सुनिश्चित करने के लिए ताले का उपयोग करते हैं कि केवल एक ही कार्य पूरा हो जाए, लेकिन क्या यह तब भी विफल नहीं होगा जब तक असफल उदाहरण पुनरारंभ नहीं किए जाते? एक और सुझाव मैंने देखा है कि सेलेरी बीट चलाने के लिए एक अलग उदाहरण है, लेकिन यह तब तक एक समस्या होगी जब तक कि यह असफल होने पर स्वयं को पुन: प्रारंभ करने का कोई तरीका न हो।

क्या इस समस्या के लिए कोई सभ्य समाधान है? मुझे शेड्यूलर को बेबीसिट करने की ज़रूरत नहीं है, क्योंकि यह ध्यान में रखना बहुत आसान होगा कि मेरा काम कुछ समय बाद तक नहीं चल रहा था।

+0

नेता उदाहरण पर इसे चलाने के साथ समस्या क्या है? यदि वह उदाहरण स्वास्थ्य जांच में विफल रहता है तो एक और उदाहरण प्रचारित किया जाएगा। – Gustaf

+0

सेलेरीबीट विफल होने पर स्वास्थ्य जांच विफल होने के बारे में मैं कैसे जाउंगा? –

+0

यदि आप विफलता के बिंदुओं के बारे में चिंतित हैं और आप बहु-आवृत्ति भार संतुलन कर रहे हैं, तो शायद समर्पित लॉगिंग/निगरानी मशीन स्थापित करने या सेवा में खरीदारी करने पर विचार करने का समय हो सकता है। अमेज़ॅन एक प्रदान करता है। मुझे सेंट्री पसंद है। –

उत्तर

0

मैं management command बनाने का सुझाव दूंगा जो क्रॉन के साथ चलता है।

इस विधि का उपयोग करके, आपके पास काम करने के लिए आपका पूरा Django ORM, सभी विधियां इत्यादि हैं। कोशिश/छोड़कर अपनी स्क्रिप्ट को लपेटकर, आपके पास विफलताओं को लॉग इन करने का विकल्प है - ईमेल अधिसूचनाएं, बाहरी लॉगिंग सिस्टम जैसे सेंट्री, सीधे डीबी आदि।

मैं उपयोगकर्ता पर्यवेक्षक क्रॉन चलाने के लिए और यह अच्छा काम करता है। यह समय-परीक्षण उपकरण पर निर्भर करता है जो आपको नीचे नहीं जाने देगा।

अंत में, बैच नौकरी चलाने के लिए या वर्तमान में ऐसे वातावरण में चलने के लिए डेटाबेस सिंगलटन का उपयोग करके जहां आपके पास Django लोड लोड-संतुलित चलने के कई उदाहरण खराब अभ्यास नहीं हैं, भले ही आपको लगता है इसके बारे में थोड़ा अजीब। डीबी संसाधित होने पर आपको यह बताने का एक बहुत ही विश्वसनीय माध्यम है।

क्रॉन के बारे में एक कष्टप्रद बात यह है कि यह Django के लिए आवश्यक पर्यावरण चर आयात नहीं करता है। मैंने इसे एक साधारण पायथन लिपि के साथ हल किया।

यह आवश्यक पर्यावरण चर आदि के साथ स्टार्टअप पर क्रोंटैब लिखता है। यह उदाहरण उबंटू के लिए ईबीएस पर है लेकिन प्रासंगिक होना चाहिए।

#!/usr/bin/env python 

# run-cron.py 
# sets environment variable crontab fragments and runs cron 

import os 
from subprocess import call 
from master.settings import IS_AWS 

# read django's needed environment variables and set them in the appropriate crontab fragment 
eRDS_HOSTNAME = os.environ["RDS_HOSTNAME"] 
eRDS_DB_NAME = os.environ["RDS_DB_NAME"] 
eRDS_PASSWORD = os.environ["RDS_PASSWORD"] 
eRDS_USERNAME = os.environ["RDS_USERNAME"] 

try: 
    eAWS_STAGING = os.environ["AWS_STAGING"] 
except KeyError: 
    eAWS_STAGING = None 

try: 
    eAWS_PRODUCTION = os.environ["AWS_PRODUCTION"] 
except KeyError: 
    eAWS_PRODUCTION = None 

eRDS_PORT = os.environ["RDS_PORT"] 

if IS_AWS: 
    fto = '/etc/cron.d/stortrac-cron' 
else: 
    fto = 'test_cron_file' 

with open(fto,'w+') as file: 
    file.write('# Auto-generated cron tab that imports needed variables and runs a python script') 

    file.write('\nRDS_HOSTNAME=') 
    file.write(eRDS_HOSTNAME) 
    file.write('\nRDS_DB_NAME=') 
    file.write(eRDS_DB_NAME) 
    file.write('\nRDS_PASSWORD=') 
    file.write(eRDS_PASSWORD) 
    file.write('\nRDS_USERNAME=') 
    file.write(eRDS_USERNAME) 
    file.write('\nRDS_PORT=') 
    file.write(eRDS_PORT) 
    if eAWS_STAGING is not None: 
     file.write('\nAWS_STAGING=') 
     file.write(eAWS_STAGING) 
    if eAWS_PRODUCTION is not None: 
     file.write('\nAWS_PRODUCTION=') 
     file.write(eAWS_PRODUCTION) 

    file.write('\n') 

    # Process queue of gobs 
    file.write('\n*/8 * * * * root python /code/app/manage.py queue --process-queue') 
    # Every 5 minutes, double-check thing is done 
    file.write('\n*/5 * * * * root python /code/app/manage.py thing --done') 
    # Every 4 hours, do this 
    file.write('\n8 */4 * * * root python /code/app/manage.py process_this') 
    # etc. 
    file.write('\n3 */4 * * * root python /ode/app/manage.py etc --silent') 
    file.write('\n\n') 

if IS_AWS: 
    args = ["cron","-f"] 
    call(args) 

और supervisord.conf में:

[program:cron] 
command = python /my/directory/runcron.py 
autostart = true 
autorestart = false 
संबंधित मुद्दे