Yeniden denemeler ve idempotency
Neler yeniden denenir, neler bilerek denenmez ve yeniden denenen bir gönderim neden kopya oluşturamaz.
Gönderimler
İstemci her gönderime (emails.send, emails.sendBatch ve templates.send) bir Idempotency-Key ekler; bu anahtar **çağrı** başına bir kez üretilir ve o çağrının yeniden denemelerinde yeniden kullanılır. API, herhangi bir şeyi sevk etmeden önce bu anahtarı sahiplenir; böylece bir yeniden deneme ikinci bir ileti göndermek yerine özgün iletiyi yeniden oynatır, buna karşılık bilinçli olarak yapılan iki send() çağrısı yine iki kez gönderir. Bunlar farklı niyetlerdir ve farklı kalırlar.
Bu garantiyi süreçler arasına yaymak için kendi idempotencyKey değerinizi iletin; böylece çöküp yeniden çalışan bir iş, gönderimlerini tekrarlamak yerine yeniden oynatır.
await openemail.emails.send(message, { idempotencyKey: `invoice:${invoice.id}` })Onu, gönderimi gerekli kılan şeyden türetin. Asla bir saatten değil. Bir anahtarın farklı bir gövdeyle yeniden kullanılması sessizce yeniden oynatılmaz, idempotency_key_reuse ile reddedilir.
Diğer her şey
Her okuma yeniden denenir. Bir yazma yalnızca, ikinci bir özdeş isteğin birincisinden farklı bir anlama gelemeyeceği yerlerde yeniden denenir; gönderim de bu koşulu sağlar, çünkü idempotency anahtarı bir tekrarı yeniden oynatmaya dönüştürür.
| Çağrı | Yeniden denenir | Neden |
|---|---|---|
| Her okuma | Evet | Hiçbir şey değişmez. |
| `emails.send`, `emails.sendBatch`, `templates.send` | Evet | Bir idempotency anahtarı, tekrarı yeniden oynatmaya dönüştürür. |
| `emails.cancel`, `emails.reschedule` | Evet | Adlandırılmış bir durumun saf biçimde atanması. |
| `threads.update`, `threads.trash` | Evet | Bir etiket ataması. İki kez uygulamak, bir kez uygulamakla aynıdır. |
| `threads.snooze`, `threads.unsnooze` | Evet | Uyanma anı gövdenin içindedir; varış zamanından türetilmez. |
| `labels.update`, `webhooks.update`, `settings.update`, `roles.update`, `members.update` | Evet | Adlandırılmış alanların saf biçimde atanması. |
| `members.grantAddress`, `rules.reorder` | Evet | Yetki verme bir upsert'tür ve sıralama eksiksiz olarak bildirilir. |
| `templates.publish` | Evet | Zaten yayımlanmış bir head'i yayımlamak, onu değiştirmeden geri verir. |
| `templates.preview`, `rules.test` | Evet | Yalnızca işler ya da değerlendirirler; hiçbir şey yazmazlar. |
| `drafts.create`, `labels.create`, `webhooks.create`, `templates.create`, `rules.create`, `roles.create`, `tempMail.create` | Hayır | Bir yeniden deneme geriye iki nesne bırakır. |
| `drafts.update` | Hayır | Gönderdiğiniz id'yi yeniden kullanmak yerine, her yazmanın sonucundaki id'yi okuyun. |
| `drafts.delete`, `labels.delete`, `webhooks.delete`, `templates.delete`, `rules.delete`, `roles.delete`, `members.remove`, `members.revokeAddress`, `tempMail.delete`, `tempMail.deleteMessage` | Hayır | Kaybolan bir yanıtın ardından yapılan yeniden deneme, başarılı olmuş bir iş için başarısızlık bildirir. |
| `webhooks.rotateSecret` | Hayır | İkinci bir döndürme, ilk denemenin döndürdüğü gizli anahtarı geçersiz kılar. |
| `webhooks.test` | Hayır | İkinci bir yapay teslimat gönderirdi. |
| `emails.translate` | Hayır | Model çağrısı harcar; bu yüzden yanıtsız kalan bir isteğin ardından yapılan yeniden deneme, aynı yanıtı iki kez satın alır. |
| Diğer tüm yazmalar | Hayır | Bir kez gönderilir; başarısızlık tekrarlanmak yerine bildirilir. |
Geri çekilme
- İstemcideki
maxRetriesile sınırlıdır; varsayılanı iki ek denemedir. - Yalnızca bir ağ hatasının ya da
408,500,502,503veya504yanıtının ardından. Bir429yalnızcaRetry-Aftertaşıdığında yeniden denenir; bu API böyle bir başlık göndermediğinden, hız sınırı doğrudan hata fırlatır. Diğer tüm durum kodları anında hata fırlatır. - Yarım saniyeden sekiz saniyeye kadar üstel ve jitter'lı; böylece bir sunucu filosu toparlanma anında yeniden senkronize olmaz.
- Her iki biçimiyle de, delay-seconds ve HTTP-date,
Retry-Aftertarafından ayarlanır. Sunucu bir bekleme süresi belirttiğinde istemci geri çekilme uygulamak yerine tam olarak o kadar bekler. - Bir dakikadan uzun bir süre isteyen sunucunun, istemciye uyumasını değil durmasını söylediği kabul edilir; bu nedenle hata, üzerinde
retryAfterSecondsile fırlatılır. İstenenden daha erken geri dönmek, o isteğe uymak değildir. - Çağıranın
AbortSignaldeğeri asla yeniden denenmez. İptal, isteğin kendisinden ya da bir sonraki denemeden önceki bekleyişten, anında birOpenEmailNetworkErrorfırlatır.