Belgelere geç
Python

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.

idempotency.py
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 denenirNeden
Her okumaEvetHiçbir şey değişmez.
emails.send, emails.send_batch, templates.send ve broadcasts.sendEvetBir 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_invitationEvetAdlandırılmış bir durumun saf biçimde atanması.
threads.update, threads.trash ve threads.restoreEvetBir etiket ataması. İki kez uygulamak, bir kez uygulamakla aynıdır.
threads.snooze, threads.unsnoozeEvetUyanma 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_activeEvetAdlandırılmış alanların saf biçimde atanması.
members.grant_address, members.grant_domain, rules.reorder ve threads.reorder_notesEvetYetki verme bir upsert'tür ve sıralama eksiksiz olarak bildirilir.
templates.publish, imports.startEvetZaten 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.testEvetYalnızca işler, sayar ya da değerlendirirler; hiçbir şey yazmazlar.
domains.verify, app_host.verifyEvetTekrarlanan 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.moveEvetHer 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.researchEvetBir 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_photoEvetYeniden 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.designHayırBir yeniden deneme geriye iki nesne bırakır.
drafts.updateHayı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.revoke_address, temp_mail.delete ve temp_mail.delete_messageHayı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.rotate_secretHayırİkinci bir döndürme, ilk denemenin döndürdüğü gizli anahtarı geçersiz kılar.
webhooks.testHayırİkinci bir yapay teslimat gönderirdi.
webhooks.replay_deliveryHayırOlayı alıcınıza ikinci kez gönderirdi.
emails.translateHayı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.
emails.compose, emails.rewrite ve emails.suggest_subjectHayırHer deneme bir yapay zekâ işlemi daha harcar ve farklı bir yanıtla döner.
Diğer tüm çağrılarHayırBir 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_retries 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 retry_after_seconds ile fırlatılır. İstenenden daha erken geri dönmek, o isteğe uymak değildir.
  • timeout her 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.