नौकरियाँ, क्रॉन और मृत-पत्र कतार
अनुरोध के बाहर काम कैसे चलाएं: नौकरी क्या है, इसका पुन: प्रयास कैसे किया जाता है, क्रॉन नौकरियां कैसे बनाता है, और उन नौकरियों के साथ क्या करना है जो समाप्त हो जाती हैं।
1. एक कार्य कतारबद्ध करें
एक कार्य किसी फ़ंक्शन के लिए एक पृष्ठभूमि कॉल है। इसे service_role कुंजी वाले सर्वर से सूचीबद्ध करें।
| विकल्प | गलती करना | अर्थ |
|---|---|---|
payload | null | फ़ंक्शन को अनुरोध निकाय के रूप में JSON दिया गया है |
delaySecs | 0 | पहले प्रयास से पहले प्रतीक्षा करने के लिए सेकंड। तब तक कार्य pending रहता है। |
maxAttempts | 3 | प्रयासों की कुल संख्या, जिसमें पहला भी शामिल है |
आप getJob(id) या listJobs({ status, limit }) (limit 1 और 500 के बीच है, डिफ़ॉल्ट 50) के साथ एक नौकरी पढ़ते हैं। कार्य में status, attempts, max_attempts, error और दिनांक scheduled_at, started_at, completed_at हैं।
enqueueJob, getJob और listJobs को service_role कुंजी की आवश्यकता होती है। एक सार्वजनिक कुंजी 403 प्राप्त करती है।
2. आपका फ़ंक्शन क्या प्राप्त करता है
एक नौकरी आपके फ़ंक्शन को किसी अन्य अनुरोध की तरह कॉल करती है, तीन अंतरों के साथ जिन्हें आपको संभालना होगा:
| भाग | कीमत |
|---|---|
| तरीका | JOB (नहीं POST) |
| पथ | /jobs/<job id> |
| शरीर | JSON के रूप में कार्य payload है |
| पहचान शीर्षलेख | कोई नहीं: x-aura-role और x-aura-user-id अनुपस्थित हैं |
एक वास्तविक कॉल लॉग हुआ {"method":"JOB","path":"/jobs/d443d541-…","role":null,"userId":null,"body":"{\"items\":[\"a\",\"b\"],\"order\":42}"}।
कोई कार्य उपयोगकर्ता के बिना चलता है: x-aura-user-id पर भरोसा न करें। यदि कार्य किसी उपयोगकर्ता का है तो पेलोड में उपयोगकर्ता की आईडी डालें।
3. जीवनचक्र और पुनः प्रयास
- एक नौकरी कम से कम एक बार चलती है। यदि कोई कर्मचारी चलते समय रुक जाए तो यह दो बार चल सकता है, इसलिए फ़ंक्शन को निष्क्रिय बनाएं।
- एक असफल प्रयास को 5 सेकंड की निश्चित देरी के बाद पुनः प्रयास किया जाता है, जब तक कि
maxAttemptsतक नहीं पहुंच जाता। तब कार्यdeadहै। विलंब और डिफ़ॉल्ट प्रयास गणना सेवा सेटिंग्स हैं (JOB_RETRY_DELAY_SECS,JOB_MAX_RETRIES)। - एक कार्य जो पट्टे के बाद भी
runningहै (डिफ़ॉल्ट रूप से 450 सेकंड) सेवा द्वारा पुनः प्राप्त किया जाता है। - तैयार कार्य डिफ़ॉल्ट रूप से 14 दिनों के लिए रखे जाते हैं।
जैसे ही आपका फ़ंक्शन उत्तर देता है, कोई कार्य completed हो जाता है, चाहे स्थिति कोड कुछ भी हो। वास्तविक दौर में, 500 लौटाने वाला फ़ंक्शन एक प्रयास के बाद completed कार्य उत्पन्न करता था और कभी भी पुनः प्रयास नहीं किया गया था।
कोई कार्य विफल हो जाता है और कॉल विफल होने पर ही पुनः प्रयास किया जाता है: फ़ंक्शन मौजूद नहीं है या निष्क्रिय है, रनटाइम पहुंच योग्य नहीं है, या कॉल का समय समाप्त हो गया है। यदि आप अपने स्वयं के कोड में त्रुटि का पता चलने पर पुनः प्रयास करना चाहते हैं, तो स्थिति कोड पर भरोसा करने के बजाय हैंडलर से एक नया कार्य एनक्यू करें (बैक-ऑफ के लिए delaySecs के साथ)।
उसी वास्तविक दौर में, एक फ़ंक्शन के लिए एक कार्य जो अस्तित्व में नहीं है, इस क्रम से गुजरा: प्रयास 1 Fonction 'ghost' introuvable के साथ 3 सेकंड में विफल रहा, प्रयास 2 लगभग 9 सेकंड में विफल रहा, और कार्य dead बन गया जिसमें attempts max_attempts के बराबर था।
4. मृत-अक्षर कतार
मृत नौकरियाँ कतार में रहती हैं और उन्हें सूचीबद्ध किया जा सकता है और पुनः प्रयास किया जा सकता है। इन मार्गों में अभी तक कोई SDK विधि नहीं है: service_role कुंजी के साथ HTTP का उपयोग करें।
पुनः प्रयास करने से कार्य अपने प्रयास काउंटर को रीसेट किए बिना pending पर वापस आ जाता है, इसलिए इसे एक और प्रयास मिलता है और यदि यह फिर से विफल हो जाता है तो यह dead पर वापस आ जाता है। पुनः प्रयास करने से पहले कारण को ठीक करें (उदाहरण के लिए, लापता फ़ंक्शन को तैनात करें)।
5. क्रॉन के साथ शेड्यूल करें
क्रॉन प्रविष्टि स्वयं फ़ंक्शन को कॉल नहीं करती है: हर बार जब यह सक्रिय होती है, तो यह एक कार्य को सूचीबद्ध करती है।
- शेड्यूल में 5 फ़ील्ड (
min hour day month weekday) या 6 फ़ील्ड (sec min hour day month weekday) हैं। 5-फ़ील्ड शेड्यूल को0सेकंड आगे मिलता है:*/1 * * * *को0 */1 * * * *के रूप में संग्रहीत किया जाता है। @dailyजैसे उपनामों को400के साथ अस्वीकार कर दिया जाता है जो अपेक्षित प्रारूप बताता है।- समय यूटीसी में है.
- पहली फायरिंग तक
last_runऔरnext_runnullहैं। वास्तव में, 15:40 पर बनाया गया शेड्यूल 15:41:00 पर सक्रिय हुआ और फिरnext_run15:42:00 दिखाया गया। - जब आप प्रविष्टि बनाते हैं तो पेलोड फ़्रीज़ हो जाता है।
- किसी अज्ञात नाम को हटाने पर
404वापस आता है। क्रॉन प्रविष्टि को हटाने से उसे सक्रिय होने से भी रोका जा सकता है। - SDK में कोई
getCronJobयाupdateCronJobनहीं है: प्रविष्टि हटाएं और इसे दोबारा बनाएं।
विशुद्ध रूप से डेटाबेस कार्य के लिए, Postgres pg_cron एक्सटेंशन किसी फ़ंक्शन की राउंड ट्रिप से बचाता है: Cron पृष्ठ देखें।