ऑराबेस लोगो
aurabaseडॉक्स
डॉक्स›Edge Functions›Jobs, cron and the DLQ

नौकरियाँ, क्रॉन और मृत-पत्र कतार

अनुरोध के बाहर काम कैसे चलाएं: नौकरी क्या है, इसका पुन: प्रयास कैसे किया जाता है, क्रॉन नौकरियां कैसे बनाता है, और उन नौकरियों के साथ क्या करना है जो समाप्त हो जाती हैं।

9 मि॰ पढ़ें·स्तर मध्यवर्ती·12 अक्टू॰ 2026 पर संशोधित
यह अंग्रेजी पाठ फ़्रेंच मूल से स्वचालित रूप से उत्पन्न हुआ था और अभी तक इसकी समीक्षा नहीं की गई है।
यह पृष्ठ स्वचालित रूप से अनुवादित किया गया था. अंग्रेजी संस्करण प्रामाणिक है.
#
कतारबद्ध करें

1. एक कार्य कतारबद्ध करें

एक कार्य किसी फ़ंक्शन के लिए एक पृष्ठभूमि कॉल है। इसे service_role कुंजी वाले सर्वर से सूचीबद्ध करें।

server/enqueue.tstypescript
import { createClient } from '@aurabase/aurabase-js'

const admin = createClient(process.env.AURA_URL!, process.env.AURA_SERVICE_ROLE_KEY!)

const { data: job, error } = await admin.functions.enqueueJob('send-report', {
  payload: { month: '2026-10' },
  delaySecs: 60,   // पहले प्रयास से पहले 60 सेकंड प्रतीक्षा करें
  maxAttempts: 3,  // डिफ़ॉल्ट
})
विकल्पगलती करनाअर्थ
payloadnullफ़ंक्शन को अनुरोध निकाय के रूप में JSON दिया गया है
delaySecs0पहले प्रयास से पहले प्रतीक्षा करने के लिए सेकंड। तब तक कार्य pending रहता है।
maxAttempts3प्रयासों की कुल संख्या, जिसमें पहला भी शामिल है

आप 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 अनुपस्थित हैं
aurabase/functions/send-report/index.tstypescript
Deno.serve(async (req) => {
  const jobId = new URL(req.url).pathname.split('/').pop()
  const { month } = await req.json()
  // ...कर्मचारी कुंजी के रूप में जॉबआईडी का उपयोग करके रिपोर्ट बनाएं और भेजें
  return new Response('ok')
})

एक वास्तविक कॉल लॉग हुआ {"method":"JOB","path":"/jobs/d443d541-…","role":null,"userId":null,"body":"{\"items\":[\"a\",\"b\"],\"order\":42}"}।

कोई कार्य उपयोगकर्ता के बिना चलता है: x-aura-user-id पर भरोसा न करें। यदि कार्य किसी उपयोगकर्ता का है तो पेलोड में उपयोगकर्ता की आईडी डालें।

#
पुनर्प्रयास

3. जीवनचक्र और पुनः प्रयास

statusestext
pending ──claimed──▶ running ──▶ completed
   ▲                    │
   └── after 5 s ◀── failed (attempts left)
                        └──▶ dead (no attempts left)
  • एक नौकरी कम से कम एक बार चलती है। यदि कोई कर्मचारी चलते समय रुक जाए तो यह दो बार चल सकता है, इसलिए फ़ंक्शन को निष्क्रिय बनाएं।
  • एक असफल प्रयास को 5 सेकंड की निश्चित देरी के बाद पुनः प्रयास किया जाता है, जब तक कि maxAttempts तक नहीं पहुंच जाता। तब कार्य dead है। विलंब और डिफ़ॉल्ट प्रयास गणना सेवा सेटिंग्स हैं (JOB_RETRY_DELAY_SECS, JOB_MAX_RETRIES)।
  • एक कार्य जो पट्टे के बाद भी running है (डिफ़ॉल्ट रूप से 450 सेकंड) सेवा द्वारा पुनः प्राप्त किया जाता है।
  • तैयार कार्य डिफ़ॉल्ट रूप से 14 दिनों के लिए रखे जाते हैं।
आपके फ़ंक्शन की HTTP त्रुटि विफलता नहीं है

जैसे ही आपका फ़ंक्शन उत्तर देता है, कोई कार्य completed हो जाता है, चाहे स्थिति कोड कुछ भी हो। वास्तविक दौर में, 500 लौटाने वाला फ़ंक्शन एक प्रयास के बाद completed कार्य उत्पन्न करता था और कभी भी पुनः प्रयास नहीं किया गया था।

कोई कार्य विफल हो जाता है और कॉल विफल होने पर ही पुनः प्रयास किया जाता है: फ़ंक्शन मौजूद नहीं है या निष्क्रिय है, रनटाइम पहुंच योग्य नहीं है, या कॉल का समय समाप्त हो गया है। यदि आप अपने स्वयं के कोड में त्रुटि का पता चलने पर पुनः प्रयास करना चाहते हैं, तो स्थिति कोड पर भरोसा करने के बजाय हैंडलर से एक नया कार्य एनक्यू करें (बैक-ऑफ के लिए delaySecs के साथ)।

उसी वास्तविक दौर में, एक फ़ंक्शन के लिए एक कार्य जो अस्तित्व में नहीं है, इस क्रम से गुजरा: प्रयास 1 Fonction 'ghost' introuvable के साथ 3 सेकंड में विफल रहा, प्रयास 2 लगभग 9 सेकंड में विफल रहा, और कार्य dead बन गया जिसमें attempts max_attempts के बराबर था।

#
वसूली

4. मृत-अक्षर कतार

मृत नौकरियाँ कतार में रहती हैं और उन्हें सूचीबद्ध किया जा सकता है और पुनः प्रयास किया जा सकता है। इन मार्गों में अभी तक कोई SDK विधि नहीं है: service_role कुंजी के साथ HTTP का उपयोग करें।

terminalbash
# मृत नौकरियों की सूची बनाएं
curl "$AURA_URL/v1/functions/jobs/dlq" -H "apikey: $AURA_SERVICE_ROLE_KEY"

# एक कार्य पुनः प्रयास करें
curl -X POST "$AURA_URL/v1/functions/jobs/$JOB_ID/retry" -H "apikey: $AURA_SERVICE_ROLE_KEY"

# प्रत्येक मृत कार्य को पुनः प्रयास करें (1000 तक)
curl -X POST "$AURA_URL/v1/functions/jobs/dlq/requeue" -H "apikey: $AURA_SERVICE_ROLE_KEY"
# → {"डेटा":{"आवश्यक":1},"मेटा":null}

पुनः प्रयास करने से कार्य अपने प्रयास काउंटर को रीसेट किए बिना pending पर वापस आ जाता है, इसलिए इसे एक और प्रयास मिलता है और यदि यह फिर से विफल हो जाता है तो यह dead पर वापस आ जाता है। पुनः प्रयास करने से पहले कारण को ठीक करें (उदाहरण के लिए, लापता फ़ंक्शन को तैनात करें)।

#
अनुसूची

5. क्रॉन के साथ शेड्यूल करें

क्रॉन प्रविष्टि स्वयं फ़ंक्शन को कॉल नहीं करती है: हर बार जब यह सक्रिय होती है, तो यह एक कार्य को सूचीबद्ध करती है।

server/cron.tstypescript
await admin.functions.createCronJob('nightly-cleanup', '0 3 * * *', 'cleanup', {
  payload: { dryRun: false },
})

const { data: crons } = await admin.functions.listCronJobs()
await admin.functions.deleteCronJob('nightly-cleanup') // नाम से, आईडी से नहीं
  • शेड्यूल में 5 फ़ील्ड (min hour day month weekday) या 6 फ़ील्ड (sec min hour day month weekday) हैं। 5-फ़ील्ड शेड्यूल को 0 सेकंड आगे मिलता है: */1 * * * * को 0 */1 * * * * के रूप में संग्रहीत किया जाता है।
  • @daily जैसे उपनामों को 400 के साथ अस्वीकार कर दिया जाता है जो अपेक्षित प्रारूप बताता है।
  • समय यूटीसी में है.
  • पहली फायरिंग तक last_run और next_run null हैं। वास्तव में, 15:40 पर बनाया गया शेड्यूल 15:41:00 पर सक्रिय हुआ और फिर next_run 15:42:00 दिखाया गया।
  • जब आप प्रविष्टि बनाते हैं तो पेलोड फ़्रीज़ हो जाता है।
  • किसी अज्ञात नाम को हटाने पर 404 वापस आता है। क्रॉन प्रविष्टि को हटाने से उसे सक्रिय होने से भी रोका जा सकता है।
  • SDK में कोई getCronJob या updateCronJob नहीं है: प्रविष्टि हटाएं और इसे दोबारा बनाएं।

विशुद्ध रूप से डेटाबेस कार्य के लिए, Postgres pg_cron एक्सटेंशन किसी फ़ंक्शन की राउंड ट्रिप से बचाता है: Cron पृष्ठ देखें।