Belgelere geç
Ruby

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 oe- ve rastgele bir UUID olarak ü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 asıl iletiyi yeniden oynatır, bilerek yapılan iki send çağrısı ise 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 geçirin; böylece çöküp yeniden çalışan bir iş, gönderimlerini tekrarlamak yerine yeniden oynatır. Bir yeniden oynatma, replayed değeri true olarak ve saklanan iletinin şu anki hâliyle yanıt verir.

idempotency.rb
invoice_id = "inv_2026_09_4192" sent = client.emails.send(  from: "[email protected]",  to: "[email protected]",  subject: "Your September invoice",  text: "Invoice attached.",  idempotency_key: "invoice:#{invoice_id}") puts sent[:id], sent[:replayed]

Anahtarı, gönderimi gerekli kılan şeyden türetin. Asla bir saatten değil. Bir anahtarı farklı bir gövdeyle yeniden kullanmak sessizce yeniden oynatılmaz, 422 idempotency_key_reuse ile reddedilir. Bir anahtar harf, rakam, _, ., : ya da - karakterlerinden oluşan 1 ile 255 karakter arasındadır; başka her şey 400 invalid_idempotency_key verir.

Diğer her şey

Her GET yeniden denenir. Bir yazma işlemi yalnızca ikinci bir özdeş isteğin ilkinden farklı bir anlam taşıyamayacağı durumlarda yeniden denenir; bir 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 GETEvetHiçbir şey değişmez.
emails.send, emails.send_batch, templates.send, broadcasts.sendEvetBir idempotency anahtarı, tekrarı yeniden oynatmaya dönüştürür.
emails.cancel, emails.reschedule, broadcasts.cancel, forms.pause, forms.resume, threads.restoreEvetAdlandırılmış bir durumun saf biçimde atanması.
threads.update, threads.trashEvetBir 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.
emails.update, labels.update, webhooks.update, settings.update, roles.update, members.update, domains.update, domains.update_address, domains.update_address_forward, contacts.update, audiences.update, keys.update, forms.update, branding.update, threads.update_note, chats.rename, account.set_email_notification, account.set_push_muted, app_host.set, workspaces.set_activeEvetAdlandırılmış alanların saf biçimde atanması.
members.grant_address, members.grant_domain, rules.reorder, threads.reorder_notesEvetBir yetki verme işlemi upsert'tür ve bir sıralama her zaman eksiksiz belirtilir.
templates.publish, forms.publish, imports.startEvetZaten yayımlanmış olanı yayımlamak ya da zaten başlamış bir içe aktarmayı başlatmak onu değiştirmeden döndürür.
templates.preview, templates.render, broadcasts.preview, rules.testEvetYalnızca işler, sayar ya da değerlendirirler; hiçbir şey yazmazlar.
domains.verify, app_host.verify, senders.researchEvetTekrarlanan bir denetim, yapıldığı 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, files.revoke_link, files.revoke_all_links, app_host.delete, account.remove_photo, branding.remove_image, domains.remove_logo, domains.remove_logo_certificate, domains.remove_address_photo, account.accept_invitation, account.decline_invitation, forms.approve_submission, 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_addressEvetBir tekrar, ilk çağrının işini zaten yapılmış bulur ve iki kez yapmak yerine bunu bildirir.
contacts.set_photo, account.set_photo, branding.upload_image, domains.set_logo, domains.set_logo_certificate, domains.set_address_photo, imports.upload_chunkEvetYeniden 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.uploadHayı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, 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.translate, emails.compose, emails.rewrite, emails.suggest_subjectHayırHer biri model çağrıları harcar; bu yüzden yanıtlanmamış bir istekten sonraki yeniden deneme aynı yanıt için iki kez ödeme yapar.
security.begin_step_up, security.verify_step_upHayırBir yeniden deneme ikinci bir e-posta gönderebilir ya da kod için ikinci bir denemeyi harcayabilir.
GET olmayan diğer her çağrıHayırBir kez gönderilir; başarısızlık tekrarlanmak yerine bildirilir.

Geri çekilme

  • İstemcideki max_retries: ile sınırlıdır; varsayılan olarak iki ek denemedir. max_retries: 0 yeniden denemeleri kapatır.
  • Yalnızca bir ağ hatasından ya da 408, 500, 502, 503 veya 504 durumundan sonra. Bir 429 yalnızca Retry-After taşıdığında yeniden denenir ve bu API bunu göndermez; bu yüzden hız sınırı aşımı hemen hata fırlatır. Diğer her durum anında hata fırlatır.
  • Yarım saniyeden sekiz saniyeye kadar üstel, rastgele sapma (jitter) ile: her bekleme, o üst sınırın yarısı ile tamamı arasında rastgele bir noktadır; böylece bir istemci 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 bekleme isteyen bir sunucu, istemciye beklemesini değil durmasını söylüyor kabul edilir; bu yüzden hata, üzerinde retry_after_seconds ile fırlatılır. Sunucunun istediğinden daha erken geri dönmek bu isteğe uymamak olurdu.
  • Zaman aşımı da diğerleri gibi bir ağ hatasıdır; bu yüzden tekrarlanması güvenli bir çağrı bir zaman aşımından sonra yeniden denenir ve timeout: her denemeye baştan uygulanır.
  • Beklemeler çağrının içindeki sleep çağrılarıdır; bu yüzden çağıran iş parçacığı da bekler ve çağrı yalnızca son denemesi bittiğinde döner ya da hata fırlatır.