Hatalar, zaman aşımları ve yeniden denemeler
Bir şeyler ters gittiğinde ve güvenli bir şekilde tekrar arayabileceğiniz zaman invoke'nin ne döndürdüğünü nasıl okuyabilirsiniz?
1. Hata nesnesi
invoke, { data, error } değerini döndürür ve asla fırlatmaz. error bir AuraError olduğundan isAuraError(error) doğrudur. İki alt sınıf size kimin başarısız olduğunu söyler:
| Alan | Anlamı |
|---|---|
error.status | HTTP durumu. 0 hatanın istemcide meydana geldiği (yanıt yok) anlamına gelir. |
error.code | Kararlı tanımlayıcı, örneğin NOT_FOUND, QUOTA_EXCEEDED, timeout, invalid_body. |
error.message | İşlevinizin döndürdüğü metin veya platformun açıklaması. |
error.context | FunctionsHttpError üzerinde: işlevinizin döndürdüğü gövde (ayrıştırılmış JSON veya metin). |
error.details | Ham hata gövdesi. Bir platform hatası için error.request_id içerir. |
2. Hangi hatadır?
Çalışan bir yığına karşı gözlemlenen davranışlar. Kota satırı, arka ucun hata eşlemesini takip eder ve testlerimizde tetiklenmemiştir.
| Ne oldu? | Sınıf | status | code | message |
|---|---|---|---|---|
| İşlev mevcut değil | FunctionsHttpError | 404 | NOT_FOUND | "…'hayır' işlevi kaçınılmaz" |
İşleviniz metinle birlikte 500 değerini döndürür | FunctionsHttpError | 500 | http_500 | o metin |
İşleviniz 503 öğesinin kendisini döndürür | FunctionsHttpError | 503 | http_503 | neyi geri verdin |
| İşleviniz fırlatır | FunctionsHttpError | 500 | http_500 | "Dahili Sunucu Hatası" |
İşleviniz timeout_secs değerini aşıyor | FunctionsHttpError | 500 veya 503 | http_500 / http_503 | "İşlev yürütme başarısız oldu" veya "İşlev HTTP 503 döndürdü" |
| Çalışma zamanına erişilemiyor | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | fonksiyonun çalıştırılmadığını açıklıyor |
| Ağ herhangi bir yanıt vermeden önce başarısız oluyor | FunctionsRelayError | 0 | network_error | ağ hatası |
| Plan kotası doldu | FunctionsHttpError | 403 | QUOTA_EXCEEDED | kota mesajı |
| Bir müşteriden çok fazla çağrı | FunctionsHttpError | 429 | rate_limit_exceeded | mesajı bekleyin |
| İstek gövdesi çok büyük | FunctionsRelayError | 503 | SERVICE_UNAVAILABLE | "maksimum yük boyutu aşıldı" |
İptal ettiniz veya timeout süreniz doldu | AuraError | 0 | timeout | "İşlev çağrısı iptal edildi veya zaman aşımına uğradı" |
| Gövde JSON olarak gönderilemiyor | AuraError | 0 | invalid_body | kaçınılması gereken türü adlandırır |
Kendi kodunuz 502, 503 veya 504 değerini döndürürse, bir FunctionsHttpError alırsınız: sınıf size durum numarasının ne olduğunu değil kimin yanıt verdiğini söyler.
Yaklaşık 256 KiB'nin üzerindeki bir istek gövdesi 503 SERVICE_UNAVAILABLE ile reddedilir ve yaklaşık 300 KB veya daha büyük bir yanıtı 50 saniyelik testimiz içinde geri dönmedi. sınırlarına bakın. Yeniden denemek yardımcı olmuyor; daha az veri gönderin veya Depolamayı kullanın.
3. Yeniden deneyip deneymeyeceğinize karar verin
SDK hiçbir zaman sizin için bir çağrıyı yeniden denemez: işlevinizin yan etkileri olabilir ve tekrarlanan POST varsayılan olarak güvenli değildir. Aşağıdaki tabloyu kullanarak siz karar verin.
| Başarısızlık | Fonksiyon çalıştı mı? | Yeniden denemek güvenli mi? |
|---|---|---|
503 platformdan (FunctionsRelayError) | Hayır, çalışma zamanına ulaşılamadı | Evet, kısa bir arayla |
429 | Hayır | Evet, error.retryAfter gecikmesinden sonra |
403 QUOTA_EXCEEDED | Hayır | Hayır, kota sıfırlanana veya siz planı değiştirene kadar |
status 0 (network_error) | Bilinmiyor | Yalnızca işleviniz idempotent ise |
İstemcide timeout | Bilinmiyor | Yalnızca işleviniz idempotent ise |
FunctionsHttpError 5xx | Evet, kısmen veya tamamen | Yalnızca işleviniz idempotent ise |
FunctionsHttpError 4xx | Evet | Hayır: isteği düzelt |
Platform çağrıları tekilleştirmez ve Idempotency-Key öğesini yok sayar. Ödemeler veya e-posta için, ilettiğiniz anahtarı body içinde saklayın ve işlevin başlangıcında kontrol edin.
4. Zaman Aşımları
Üç saat aynı anda çalışır:
| Saat | Varsayılan | Nereden değiştirilmeli |
|---|---|---|
| Müşteriniz | Her responseType için 30 saniye | İstemci seçeneklerinde invoke(…, { timeout }), { signal } veya requestTimeoutMs |
| fonksiyon | 30 sn, 1 ile 300 arasında | permissions.timeout_secs işlevde |
| Ağ geçidi | 380 s | projelere göre yapılandırılamaz |
İşlev timeout_secs değerini aştığında, çalışma zamanı onu iptal eder ve yukarıda gösterilen 500 veya 503 ile yaklaşık bu gecikmeden sonra çağrınız başarısız olur. Nedeni ham modda error.context.detail (WorkerRequestCancelled: request has been cancelled by supervisor) içinde görünüyor. Bu hatayı görmek için timeout istemcisi yerine istemcinizi timeout işlevin timeout_secs biraz üstüne ayarlayın.
Birkaç saniyeden uzun bir çalışma için, bağlantıyı açık tutmak yerine işini kuyruğa alın.
5. Sebebini bulun
- Platform hataları bir istek kimliği taşır:
error.details.error.request_id. Destek ekibiyle iletişime geçtiğinizde bunu alıntılayın. aura functions logs <name>en son HTTP isteklerini yöntem, yol, durum, süre ve istek kimliğiyle birlikte listeler. işlevinizinconsole.logveyaconsole.errorile ne yazdığını göstermez: çıktı, yalnızca platform operatörünün okuyabileceği çalışma zamanının kendi günlüklerinde kalır. Bu ve diğer mevcut boşluklar için sınırlarına bakın.- Çağrının tanımlayıcısı işlevinize iletilmez. Kendi kimliğinizi
headersiçine iletin ve günlüğe kaydedin.