شعار أوراباسي
aurabaseمستندات
مستندات›Edge Functions›Jobs, cron and the DLQ

الوظائف والكرون وقائمة انتظار الرسائل الميتة

كيفية تشغيل العمل خارج الطلب: ما هي الوظيفة، وكيف تتم إعادة تجربتها، وكيف يقوم cron بإنشاء الوظائف، وماذا تفعل بالوظائف التي تنتهي في النهاية بالموت.

9 د قراءة·المستوى وسيطة·تمت المراجعة في 12‏/10‏/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>
الجسمالوظيفة payload، كـ JSON
رؤوس الهويةلا شيء: 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()
  // ...قم بإنشاء التقرير وإرساله باستخدام jobId كمفتاح للعجز
  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 في 3 ثوانٍ مع Fonction 'ghost' introuvable، وفشلت المحاولة 2 في حوالي 9 ثوانٍ، وأصبحت المهمة dead مع attempts تساوي max_attempts.

#
التعافي

4. قائمة انتظار الرسائل الميتة

تبقى المهام الميتة في قائمة الانتظار ويمكن إدراجها وإعادة المحاولة. لا تحتوي هذه المسارات على طريقة SDK حتى الآن: استخدم HTTP مع مفتاح service_role.

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"
# → {"بيانات":{"requeued":1},"meta":null}

تؤدي إعادة المحاولة إلى إعادة المهمة إلى pending دون إعادة تعيين عداد المحاولات، لذلك تحصل على محاولة أخرى بالضبط وتعود إلى dead إذا فشلت مرة أخرى. قم بإصلاح السبب (نشر الوظيفة المفقودة، على سبيل المثال) قبل إعادة المحاولة.

#
الجدول الزمني

5. الجدول الزمني مع كرون

لا يستدعي إدخال cron الوظيفة نفسها: في كل مرة يتم تشغيلها، فإنها تقوم بإدراج وظيفة في قائمة الانتظار.

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. يؤدي حذف إدخال cron أيضًا إلى منعه من الإطلاق.
  • لا يحتوي SDK على getCronJob أو updateCronJob: احذف الإدخال وأنشئه مرة أخرى.

بالنسبة إلى عمل قاعدة البيانات البحتة، يتجنب الامتداد Postgres pg_cron الرحلة ذهابًا وإيابًا إلى إحدى الوظائف: راجع صفحة Cron.