İşler, cron ve teslim edilmeyecek mektup kuyruğu
Bir isteğin dışında iş nasıl yürütülür: iş nedir, nasıl yeniden denenir, cron işleri nasıl yaratır ve sonu biten işlerle ne yapılır.
1. Bir işi kuyruğa alın
İş, bir işleve yapılan bir arka plan çağrısıdır. service_role anahtarıyla bir sunucudan kuyruğa alın.
| Seçenek | Varsayılan | Anlamı |
|---|---|---|
payload | null | İstek gövdesi olarak işleve verilen JSON |
delaySecs | 0 | İlk denemeden önce saniyeler beklenmelidir. İş o zamana kadar pending kalacak. |
maxAttempts | 3 | Toplam deneme sayısı, ilk dahil |
Bir işi getJob(id) veya listJobs({ status, limit }) ile okursunuz (limit 1 ile 500 arasındadır, varsayılan 50'dir). İşin bir status, attempts, max_attempts, error ve tarihleri scheduled_at, started_at, completed_at var.
enqueueJob, getJob ve listJobs bir service_role anahtarına ihtiyaç duyar. Ortak anahtar 403 alır.
2. İşleviniz ne alır?
Bir iş, fonksiyonunuzu diğer herhangi bir istek gibi çağırır; halletmeniz gereken üç fark vardır:
| Parça | Değer |
|---|---|
| Yöntem | JOB (POST değil) |
| Yol | /jobs/<job id> |
| Vücut | İş payload, JSON olarak |
| Kimlik başlıkları | Yok: x-aura-role ve x-aura-user-id yok |
Gerçek bir çağrı günlüğe kaydedildi {"method":"JOB","path":"/jobs/d443d541-…","role":null,"userId":null,"body":"{\"items\":[\"a\",\"b\"],\"order\":42}"}.
Bir iş, kullanıcı olmadan çalışır: x-aura-user-id öğesine güvenmeyin. Çalışma bir kullanıcıya aitse kullanıcının kimliğini veri yüküne ekleyin.
3. Yaşam döngüsü ve yeniden denemeler
- Bir iş en az bir kez çalıştırılır. Bir işçi çalışırken durursa iki kez çalışabilir, bu nedenle işlevi bağımsız yapın.
- Başarısız bir girişim,
maxAttemptsdeğerine ulaşılana kadar 5 saniyelik sabit bir gecikmeden sonra yeniden denenir. O zaman işdeadolur. Gecikme ve varsayılan deneme sayısı hizmet ayarlarıdır (JOB_RETRY_DELAY_SECS,JOB_MAX_RETRIES). - Kiralandıktan sonra hala
runningolan bir iş (varsayılan olarak 450 saniye) hizmet tarafından geri alınır. - Biten işler varsayılan olarak 14 gün süreyle tutulur.
Durum kodu ne olursa olsun, işleviniz yanıtını verir vermez bir iş completed olur. Gerçek bir çalıştırmada, 500 değerini döndüren bir işlev, bir denemeden sonra bir completed işi üretti ve bir daha asla denenmedi.
Bir iş başarısız olur ve yalnızca çağrının kendisi başarısız olduğunda yeniden denenir: işlev mevcut olmadığında veya etkin olmadığında, çalışma zamanına ulaşılamadığında veya çağrı zaman aşımına uğradığında. Kendi kodunuz bir hata algıladığında yeniden denemek istiyorsanız, durum koduna güvenmek yerine işleyiciden yeni bir işi (geri çekilme için delaySecs ile) sıraya alın.
Aynı gerçek çalıştırmada, var olmayan bir işleve yönelik bir iş şu sırayı izledi: 1. deneme Fonction 'ghost' introuvable ile 3 saniyede başarısız oldu, 2. deneme yaklaşık 9 saniyede başarısız oldu ve iş attempts ile max_attempts değerine eşit olarak dead oldu.
4. Teslim edilmeyen mektuplar kuyruğu
Ölü işler kuyrukta kalır ve listelenip yeniden denenebilir. Bu rotaların henüz bir SDK yöntemi yok: HTTP'yi service_role anahtarıyla kullanın.
Yeniden deneme, deneme sayacını sıfırlamadan işi pending konumuna geri koyar, böylece tam olarak bir deneme daha alır ve tekrar başarısız olursa dead durumuna geri döner. Yeniden denemeden önce nedeni düzeltin (örneğin, eksik işlevi dağıtın).
5. Cron ile zamanlama
Bir cron girişi işlevin kendisini çağırmaz: her tetiklendiğinde bir işi kuyruğa alır.
- Zamanlamada 5 alan (
min hour day month weekday) veya 6 alan (sec min hour day month weekday) bulunur. 5 alanlı bir program0saniyenin önüne geçer:*/1 * * * *0 */1 * * * *olarak depolanır. @dailygibi takma adlar, beklenen biçimi belirten400ile reddedilir.- Zamanlar UTC'dedir.
last_runvenext_runilk ateşlemeye kadarnull'dir. Gerçek bir çalışmada, 15:40'ta oluşturulan bir program 15:41:00'de tetiklendi ve ardındannext_run15:42:00'i gösterdi.- Girişi oluşturduğunuzda yük dondurulur.
- Bilinmeyen bir adın silinmesi
404değerini döndürür. Bir cron girişinin silinmesi aynı zamanda tetiklenmesini de durdurur. - SDK'da
getCronJobveyaupdateCronJobyok: girişi silin ve yeniden oluşturun.
Tamamen veritabanı çalışması için, Postgres pg_cron uzantısı bir işleve gidiş-dönüş yolculuğunu önler: Cron sayfasına bakın.