الوظائف والكرون وقائمة انتظار الرسائل الميتة
كيفية تشغيل العمل خارج الطلب: ما هي الوظيفة، وكيف تتم إعادة تجربتها، وكيف يقوم cron بإنشاء الوظائف، وماذا تفعل بالوظائف التي تنتهي في النهاية بالموت.
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> |
| الجسم | الوظيفة payload، كـ JSON |
| رؤوس الهوية | لا شيء: 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 في 3 ثوانٍ مع Fonction 'ghost' introuvable، وفشلت المحاولة 2 في حوالي 9 ثوانٍ، وأصبحت المهمة dead مع attempts تساوي max_attempts.
4. قائمة انتظار الرسائل الميتة
تبقى المهام الميتة في قائمة الانتظار ويمكن إدراجها وإعادة المحاولة. لا تحتوي هذه المسارات على طريقة SDK حتى الآن: استخدم HTTP مع مفتاح service_role.
تؤدي إعادة المحاولة إلى إعادة المهمة إلى pending دون إعادة تعيين عداد المحاولات، لذلك تحصل على محاولة أخرى بالضبط وتعود إلى dead إذا فشلت مرة أخرى. قم بإصلاح السبب (نشر الوظيفة المفقودة، على سبيل المثال) قبل إعادة المحاولة.
5. الجدول الزمني مع كرون
لا يستدعي إدخال cron الوظيفة نفسها: في كل مرة يتم تشغيلها، فإنها تقوم بإدراج وظيفة في قائمة الانتظار.
- يحتوي الجدول على 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_run15:42:00.- يتم تجميد الحمولة عند إنشاء الإدخال.
- يؤدي حذف اسم غير معروف إلى إرجاع
404. يؤدي حذف إدخال cron أيضًا إلى منعه من الإطلاق. - لا يحتوي SDK على
getCronJobأوupdateCronJob: احذف الإدخال وأنشئه مرة أخرى.
بالنسبة إلى عمل قاعدة البيانات البحتة، يتجنب الامتداد Postgres pg_cron الرحلة ذهابًا وإيابًا إلى إحدى الوظائف: راجع صفحة Cron.