Ugrás a dokumentációra
SDK

Újrapróbálkozások és idempotencia

Mi próbálkozik újra, mi szándékosan nem, és miért nem duplázhat egy újrapróbált küldés.

Küldések

A kliens minden küldéshez (emails.send, emails.sendBatch és templates.send) Idempotency-Key fejlécet csatol, amelyet **hívásonként** egyszer generál, és amelyet az adott hívás újrapróbálkozásai újrahasználnak. Az API lefoglalja ezt a kulcsot, mielőtt bármit kiküldene, így az újrapróbálkozás az eredeti üzenetet játssza vissza, nem pedig egy másodikat küld, míg két szándékos send() hívás továbbra is kétszer küld. Ezek különböző szándékok, és azok is maradnak.

Adj át saját idempotencyKey értéket, hogy ez a garancia folyamatokon átnyúljon: egy összeomlott és újrafutott feladat így visszajátssza a küldéseit ahelyett, hogy megismételné őket.

idempotency.ts
await openemail.emails.send(message, { idempotencyKey: `invoice:${invoice.id}` })

Abból származtasd, ami a küldést szükségessé tette. Soha ne órából. Ugyanannak a kulcsnak más törzzsel való újrahasználata idempotency_key_reuse hibával elutasításra kerül, nem pedig csendben visszajátszódik.

Minden más

Minden olvasás újrapróbálkozik. Írás csak ott, ahol egy második, azonos kérés nem jelenthet mást, mint az első, és a küldés azért felel meg ennek, mert az idempotenciakulcsa az ismétlést visszajátszássá alakítja.

HívásÚjrapróbálvaMiért
Minden olvasásIgenSemmi nem változik.
`emails.send`, `emails.sendBatch`, `templates.send`IgenAz idempotenciakulcs az ismétlést visszajátszássá teszi.
`emails.cancel`, `emails.reschedule`IgenEgy megnevezett állapot tiszta beállítása.
`threads.update`, `threads.trash`IgenCímkebeállítás. Kétszer alkalmazva ugyanaz, mint egyszer.
`threads.snooze`, `threads.unsnooze`IgenAz ébresztés időpontja a törzsben van, nem a beérkezés idejéből származik.
`labels.update`, `webhooks.update`, `settings.update`, `roles.update`, `members.update`IgenMegnevezett mezők tiszta beállítása.
`members.grantAddress`, `rules.reorder`IgenA jogosultságadás upsert, a sorrend pedig teljes egészében meg van adva.
`templates.publish`IgenEgy már publikált fej publikálása változatlanul adja vissza azt.
`templates.preview`, `rules.test`IgenRenderelnek vagy kiértékelnek, és semmit nem írnak.
`drafts.create`, `labels.create`, `webhooks.create`, `templates.create`, `rules.create`, `roles.create`, `tempMail.create`NemAz újrapróbálkozás két objektumot hagy maga után.
`drafts.update`NemMinden írás eredményéből olvasd ki az azonosítót, ahelyett hogy az elküldöttet használnád újra.
`drafts.delete`, `labels.delete`, `webhooks.delete`, `templates.delete`, `rules.delete`, `roles.delete`, `members.remove`, `members.revokeAddress`, `tempMail.delete`, `tempMail.deleteMessage`NemElveszett válasz utáni újrapróbálkozás hibát jelent olyan munkára, amely sikerült.
`webhooks.rotateSecret`NemA második rotáció érvényteleníti azt a titkot, amelyet az első próbálkozás visszaadott.
`webhooks.test`NemEgy második szintetikus kézbesítést küldene.
`emails.translate`NemModellhívásokat költ, így egy megválaszolatlan kérés utáni újrapróbálkozás kétszer fizet meg ugyanazért a válaszért.
Minden más írásNemEgyszer megy el, és a hibát jelenti a rendszer, nem megismétli.

A backoff

  • A kliens maxRetries értéke korlátozza, alapértelmezés szerint két további próbálkozás.
  • Csak hálózati hiba vagy 408, 500, 502, 503 illetve 504 után. A 429 csak akkor kerül újrapróbálásra, ha Retry-After fejlécet hoz magával, és ez az API nem küld ilyet, így a sebességkorlát azonnal hibát dob. Minden más állapotkód azonnal dob.
  • Exponenciális, fél másodperctől nyolcig, szórással, hogy egy gépflotta ne szinkronizálódjon újra a helyreállásra.
  • A Retry-After ütemezi, mindkét alakjában: delay-seconds és HTTP-date. Ha a szerver megnevez egy várakozást, a kliens pontosan annyit vár, ahelyett hogy visszalépegetne.
  • Ha a szerver egy percnél hosszabbat kér, azt a kliens leállásra szóló utasításként értelmezi, nem alvásként, ezért a hiba retryAfterSeconds mezővel kerül dobásra. A kértnél hamarabb visszatérni nem tiszteletben tartás.
  • A hívó AbortSignal jelzése soha nem kerül újrapróbálásra. A megszakítás azonnal OpenEmailNetworkError hibát dob, akár a kérésből, akár a következő próbálkozás előtti várakozásból.