Kalo te dokumentacioni
PHP

Riprovat dhe idempotenca

Çfarë riprovohet, çfarë nuk riprovohet me qëllim dhe pse një dërgim i riprovuar nuk mund të dyfishohet.

Dërgimet

Klienti i bashkëngjit një Idempotency-Key çdo dërgimi (emails->send, emails->sendBatch, templates->send dhe broadcasts->send), të gjeneruar një herë për çdo thirrje si oe- plus një UUID të rastësishëm, dhe të ripërdorur nga riprovat e asaj thirrjeje. API-ja e rezervon atë çelës përpara se të nisë çfarëdo gjëje, ndaj një riprovë e riluan mesazhin origjinal në vend që të dërgojë një të dytë, ndërsa dy thirrje të qëllimshme send dërgojnë prapëseprapë dy herë. Këto janë qëllime të ndryshme dhe mbeten të ndryshme.

Jepni idempotencyKey: tuajin për ta shtrirë këtë garanci mes proceseve, që një punë në sfond që u rrëzua dhe u ekzekutua sërish t’i riluajë dërgimet e saj në vend që t’i përsërisë. Një riluajtje përgjigjet me replayed true dhe me mesazhin e ruajtur siç është tani.

idempotency.php
$invoiceId = 'inv_2026_09_4192'; $sent = $client->emails->send([    'from' => '[email protected]',    'to' => '[email protected]',    'subject' => 'Your September invoice',    'text' => 'Invoice attached.',], idempotencyKey: 'invoice:' . $invoiceId); echo $sent['id'], ' ', ($sent['replayed'] ?? false) ? 'replayed' : 'sent', PHP_EOL;

Nxirreni nga ajo që e bëri të nevojshëm dërgimin. Kurrë nga një orë. Ripërdorimi i një çelësi me një trup tjetër refuzohet me një 422 idempotency_key_reuse në vend që të riluhet në heshtje. Një çelës ka nga 1 deri në 255 karaktere: shkronja, shifra, _, ., : ose -, dhe çdo gjë tjetër jep një 400 invalid_idempotency_key.

Gjithçka tjetër

Çdo GET riprovohet. Një shkrim riprovohet vetëm aty ku një kërkesë e dytë identike nuk mund të nënkuptojë diçka ndryshe nga e para, dhe një dërgim e plotëson kushtin sepse çelësi i tij i idempotencës e kthen një përsëritje në riluajtje.

ThirrjaRiprovohetPse
Çdo GETPoNuk ndryshon asgjë.
emails->send, emails->sendBatch, templates->send, broadcasts->sendPoNjë çelës idempotence e kthen përsëritjen në riluajtje.
emails->cancel, emails->reschedule, broadcasts->cancel, forms->pause, forms->resume, threads->restorePoNjë vendosje e pastër e një gjendjeje të emërtuar.
threads->update, threads->trashPoNjë vendosje etiketash. Ta zbatosh dy herë është njësoj si ta zbatosh një herë.
threads->snooze, threads->unsnoozePoÇasti i zgjimit ndodhet në trup, nuk nxirret nga koha e mbërritjes.
emails->update, labels->update, webhooks->update, settings->update, roles->update, members->update, domains->update, domains->updateAddress, domains->updateAddressForward, contacts->update, audiences->update, keys->update, forms->update, branding->update, threads->updateNote, chats->rename, account->setEmailNotification, account->setPushMuted, appHost->set, workspaces->setActivePoNjë vendosje e pastër e fushave të emërtuara.
members->grantAddress, members->grantDomain, rules->reorder, threads->reorderNotesPoNjë dhënie qasjeje është një upsert, dhe një renditje deklarohet gjithmonë e plotë.
templates->publish, forms->publish, imports->startPoPublikimi i asaj që është publikuar tashmë, ose nisja e një importi që ka nisur tashmë, e kthen atë të pandryshuar.
templates->preview, templates->render, broadcasts->preview, rules->testPoAto renderojnë, numërojnë ose vlerësojnë dhe nuk shkruajnë asgjë.
domains->verify, appHost->verify, senders->researchPoNjë kontroll i përsëritur nuk ndryshon asgjë përveç kohës kur u bë.
contacts->save, contacts->setAudiences, contacts->removePhoto, contacts->block, contacts->unblock, contacts->deleteMany, keys->revoke, files->revokeLink, files->revokeAllLinks, appHost->delete, account->removePhoto, branding->removeImage, domains->removeLogo, domains->removeLogoCertificate, domains->removeAddressPhoto, account->acceptInvitation, account->declineInvitation, forms->approveSubmission, subscriptions->movePoSecila deklaron rezultatin përfundimtar, ndaj një thirrje e dytë lë atë që la e para.
audiences->addContact, audiences->addContacts, audiences->removeContacts, audiences->importContacts, suppressions->add, domains->createAddressPoNjë përsëritje e gjen punën e thirrjes së parë të kryer tashmë dhe e raporton atë në vend që ta bëjë dy herë.
contacts->setPhoto, account->setPhoto, branding->uploadImage, domains->setLogo, domains->setLogoCertificate, domains->setAddressPhoto, imports->uploadChunkPoBajtet e dërguara sërish zëvendësojnë atë që ruajti përpjekja e parë.
drafts->create, labels->create, webhooks->create, templates->create, rules->create, roles->create, tempMail->create, files->uploadJoNjë riprovë lë dy objekte.
drafts->updateJoLexojeni id-në nga rezultati i çdo shkrimi, në vend që të ripërdorni atë që dërguat.
drafts->delete, labels->delete, webhooks->delete, templates->delete, rules->delete, roles->delete, members->remove, members->revokeAddress, tempMail->delete, tempMail->deleteMessageJoNjë riprovë pas një përgjigjeje të humbur raporton dështim për punë që pati sukses.
webhooks->rotateSecretJoNjë rrotullim i dytë e bën të pavlefshëm sekretin që ktheu përpjekja e parë.
webhooks->testJoDo të dërgonte një dërgesë të dytë sintetike.
webhooks->replayDeliveryJoDo ta dërgonte ngjarjen te marrësi juaj për herë të dytë.
emails->translate, emails->compose, emails->rewrite, emails->suggestSubjectJoSecila harxhon thirrje modeli, ndaj një riprovim pas një kërkese pa përgjigje e paguan të njëjtën përgjigje dy herë.
security->beginStepUp, security->verifyStepUpJoNjë riprovim mund të dërgonte një email të dytë ose të harxhonte një përpjekje të dytë për kodin.
Çdo thirrje tjetër që nuk është GETJoDërgohet një herë, dhe një dështim raportohet në vend që të përsëritet.

Backoff-i

  • E kufizuar nga maxRetries: te klienti, me dy përpjekje shtesë si parazgjedhje. maxRetries: 0 i çaktivizon riprovat.
  • Vetëm pas një dështimi rrjeti ose një 408, 500, 502, 503 a 504. Një 429 riprovohet vetëm kur mbart një Retry-After, dhe kjo API nuk dërgon të tillë, ndaj një kufi shpejtësie hedh gabim menjëherë. Çdo status tjetër hedh gabim në çast.
  • Eksponenciale nga gjysmë sekonde deri në tetë, me luhatje (jitter): çdo pritje është një pikë e rastësishme midis gjysmës së atij tavani dhe tavanit të plotë, që një flotë klientësh të mos sinkronizohet sërish gjatë rimëkëmbjes.
  • E ritmuar nga Retry-After në secilën prej formave të tij, delay-seconds dhe HTTP-date. Kur serveri cakton një pritje, klienti pret pikërisht aq, në vend që të bëjë backoff.
  • Një server që kërkon më shumë se një minutë trajtohet sikur i thotë klientit të ndalojë, jo të flerë, ndaj përjashtimi hidhet me retryAfterSeconds mbi të. Të kthehesh më herët se sa kërkoi ai nuk do të thotë ta respektosh.
  • Skadimi i afatit është një dështim rrjeti si çdo tjetër, ndaj një thirrje që mund të përsëritet pa rrezik provohet sërish pas tij, dhe timeout: zbatohet nga e para për çdo përpjekje.
  • Pritjet janë thirrje sleep dhe usleep brenda thirrjes, ndaj pret edhe skripti, dhe thirrja kthehet ose hedh përjashtim vetëm pasi të ketë përfunduar përpjekja e saj e fundit. Në një kërkesë web për të cilën pret një person, mbajini timeout: dhe maxRetries: të ulëta.