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.send_batch, templates.send ve broadcasts.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 idempotency_key değerinizi iletin; böylece çöküp yeniden çalışan bir iş, gönderimlerini tekrarlamak yerine yeniden oynatır.
invoice_id = 'inv_4192' client.emails.send( {'from': sender, 'to': recipient, 'subject': subject, 'text': text}, idempotency_key=f'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.send_batch, templates.send ve broadcasts.send | Evet | Bir idempotency anahtarı, tekrarı yeniden oynatmaya dönüştürür. |
| emails.cancel, emails.reschedule, broadcasts.cancel, forms.publish, forms.pause, forms.resume, forms.approve_submission, account.accept_invitation ve account.decline_invitation | Evet | Adlandırılmış bir durumun saf biçimde atanması. |
| threads.update, threads.trash ve threads.restore | 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, domains.update, contacts.update, audiences.update, keys.update, emails.update, forms.update, branding.update, chats.rename, threads.update_note, domains.update_address, domains.update_address_forward, account.set_email_notification, account.set_push_muted, app_host.set ve workspaces.set_active | Evet | Adlandırılmış alanların saf biçimde atanması. |
| members.grant_address, members.grant_domain, rules.reorder ve threads.reorder_notes | Evet | Yetki verme bir upsert'tür ve sıralama eksiksiz olarak bildirilir. |
| templates.publish, imports.start | Evet | Zaten yayımlanmış bir head'i yayımlamak ya da zaten başlamış bir içe aktarmayı başlatmak, onu değiştirmeden geri verir. |
| templates.preview, templates.render, broadcasts.preview ve rules.test | Evet | Yalnızca işler, sayar ya da değerlendirirler; hiçbir şey yazmazlar. |
| domains.verify, app_host.verify | Evet | Tekrarlanan bir denetim, denetimin zamanı dışında hiçbir şeyi değiştirmez. |
| contacts.save, contacts.set_audiences, contacts.remove_photo, contacts.block, contacts.unblock, contacts.delete_many, keys.revoke, account.remove_photo, branding.remove_image, domains.remove_logo, domains.remove_logo_certificate, domains.remove_address_photo, app_host.delete, files.revoke_link, files.revoke_all_links ve subscriptions.move | Evet | Her biri nihai sonucu belirtir; bu yüzden ikinci bir çağrı, ilkinin bıraktığını bırakır. |
| audiences.add_contact, audiences.add_contacts, audiences.remove_contacts, audiences.import_contacts, suppressions.add, domains.create_address ve senders.research | Evet | Bir tekrar, ilk çağrının işini zaten yapılmış bulur ve iki kez yapmak yerine bunu bildirir. |
| contacts.set_photo, imports.upload_chunk, account.set_photo, branding.upload_image, domains.set_logo, domains.set_logo_certificate ve domains.set_address_photo | Evet | Yeniden gönderilen baytlar, ilk denemenin sakladığının yerini alır. |
| drafts.create, labels.create, webhooks.create, templates.create, rules.create, roles.create, temp_mail.create, files.upload, templates.design ve forms.design | 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.revoke_address, temp_mail.delete ve temp_mail.delete_message | 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.rotate_secret | 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. |
| webhooks.replay_delivery | Hayır | Olayı alıcınıza ikinci kez 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. |
| emails.compose, emails.rewrite ve emails.suggest_subject | Hayır | Her deneme bir yapay zekâ işlemi daha harcar ve farklı bir yanıtla döner. |
| Diğer tüm çağrılar | Hayır | Bir kez gönderilir; başarısızlık tekrarlanmak yerine bildirilir. |
forms.update, expectedUpdatedAt ile bile yeniden denenir; bu yüzden kaybolan bir yanıtın ardından yapılan yeniden deneme, ilk deneme gerçekleştiği için 409 version_conflict ile dönebilir. Yeniden denemeden önce formu okuyun.
client.raw.request bir GET isteğini yeniden dener, geri kalan her şeyi ise repeatable=True geçirmediğiniz sürece bir kez gönderir.
Geri çekilme
- İstemcideki
max_retriesile 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
retry_after_secondsile fırlatılır. İstenenden daha erken geri dönmek, o isteğe uymak değildir. timeouther denemeyi sınırlar; bu yüzden iki yeniden deneme hakkını da kullanan bir çağrı, üç zaman aşımı süresi artı aralarındaki beklemeler kadar sürebilir.- Bir
AsyncOpenEmailçağrısının iptali asla yeniden denenmez. İptal, istekten ya da bir sonraki denemeden önceki bekleyişten anında yayılır.