Belgelere geç
SDK

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.

idempotency.ts
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 denenirNeden
Her okumaEvetHiçbir şey değişmez.
`emails.send`, `emails.sendBatch`, `templates.send`EvetBir idempotency anahtarı, tekrarı yeniden oynatmaya dönüştürür.
`emails.cancel`, `emails.reschedule`EvetAdlandırılmış bir durumun saf biçimde atanması.
`threads.update`, `threads.trash`EvetBir etiket ataması. İki kez uygulamak, bir kez uygulamakla aynıdır.
`threads.snooze`, `threads.unsnooze`EvetUyanma anı gövdenin içindedir; varış zamanından türetilmez.
`labels.update`, `webhooks.update`, `settings.update`, `roles.update`, `members.update`EvetAdlandırılmış alanların saf biçimde atanması.
`members.grantAddress`, `rules.reorder`EvetYetki verme bir upsert'tür ve sıralama eksiksiz olarak bildirilir.
`templates.publish`EvetZaten yayımlanmış bir head'i yayımlamak, onu değiştirmeden geri verir.
`templates.preview`, `rules.test`EvetYalnı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ırBir yeniden deneme geriye iki nesne bırakır.
`drafts.update`HayırGö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ırKaybolan 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ırModel ç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 yazmalarHayırBir kez gönderilir; başarısızlık tekrarlanmak yerine bildirilir.

Geri çekilme

  • İstemcideki maxRetries ile sınırlıdır; varsayılanı iki ek denemedir.
  • Yalnızca bir ağ hatasının ya da 408, 500, 502, 503 veya 504 yanıtının ardından. Bir 429 yalnızca Retry-After taşı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-After tarafı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 retryAfterSeconds ile fırlatılır. İstenenden daha erken geri dönmek, o isteğe uymak değildir.
  • Çağıranın AbortSignal değeri asla yeniden denenmez. İptal, isteğin kendisinden ya da bir sonraki denemeden önceki bekleyişten, anında bir OpenEmailNetworkError fırlatır.