Ú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.
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álva | Miért |
|---|---|---|
| Minden olvasás | Igen | Semmi nem változik. |
| `emails.send`, `emails.sendBatch`, `templates.send` | Igen | Az idempotenciakulcs az ismétlést visszajátszássá teszi. |
| `emails.cancel`, `emails.reschedule` | Igen | Egy megnevezett állapot tiszta beállítása. |
| `threads.update`, `threads.trash` | Igen | Címkebeállítás. Kétszer alkalmazva ugyanaz, mint egyszer. |
| `threads.snooze`, `threads.unsnooze` | Igen | Az é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` | Igen | Megnevezett mezők tiszta beállítása. |
| `members.grantAddress`, `rules.reorder` | Igen | A jogosultságadás upsert, a sorrend pedig teljes egészében meg van adva. |
| `templates.publish` | Igen | Egy már publikált fej publikálása változatlanul adja vissza azt. |
| `templates.preview`, `rules.test` | Igen | Renderelnek vagy kiértékelnek, és semmit nem írnak. |
| `drafts.create`, `labels.create`, `webhooks.create`, `templates.create`, `rules.create`, `roles.create`, `tempMail.create` | Nem | Az újrapróbálkozás két objektumot hagy maga után. |
| `drafts.update` | Nem | Minden í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` | Nem | Elveszett válasz utáni újrapróbálkozás hibát jelent olyan munkára, amely sikerült. |
| `webhooks.rotateSecret` | Nem | A második rotáció érvényteleníti azt a titkot, amelyet az első próbálkozás visszaadott. |
| `webhooks.test` | Nem | Egy második szintetikus kézbesítést küldene. |
| `emails.translate` | Nem | Modellhí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ás | Nem | Egyszer 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,503illetve504után. A429csak akkor kerül újrapróbálásra, haRetry-Afterfejlé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
retryAfterSecondsmezővel kerül dobásra. A kértnél hamarabb visszatérni nem tiszteletben tartás. - A hívó
AbortSignaljelzése soha nem kerül újrapróbálásra. A megszakítás azonnalOpenEmailNetworkErrorhibát dob, akár a kérésből, akár a következő próbálkozás előtti várakozásból.