Integrationer

Del af Integrationer og workflows

Undgå dobbelte handlinger ved genforsøg

Vælg en stabil handlingsnøgle, afklar tabte svar og begræns genforsøg, så samme oprettelse ikke sker to gange.

Et tabt svar betyder ikke nødvendigvis, at en handling mislykkedes. Hvis et oprettelseskald nåede målsystemet, kan et blindt genforsøg skabe endnu en post. Definér derfor den logiske handling, giv den en stabil nøgle, og afklar usikre udfald før et nyt kald.

Vælg nøglen efter den ønskede virkning

En besked og dens virkning er ikke det samme. En kilde kan sende samme besked igen eller udsende en ny besked om samme tilstand. Hvis en ordre skal give én arbejdsopgave, skal nøglen svare til netop den regel. Hvis hver ordrelinje skal give sin egen opgave, skal nøglen også indeholde ordrelinjen.

Et leverings-ID kan genkende en gentaget besked, men genkender ikke nødvendigvis den samme forretningshandling i en ny besked. Gem derfor forbindelsen mellem kildereference, handlingsnøgle og resultat i målsystemet. Hvis flere arbejdere kan behandle samme handling samtidig, skal kontrollen håndhæves samlet, eksempelvis med en atomisk unik registrering eller en dokumenteret idempotensfunktion hos målsystemet.

Skil usikkert udfald fra fejl

Målsystemet opretter måske opgaven, men svaret går tabt. Registrér udfaldet som ukendt, indtil resultatet kan findes via en stabil reference eller afklares på anden sikker måde.

TilstandBetydningNæste skridt
AfventerHandlingen er registreret, men ikke sendt.Start et kontrolleret forsøg.
Under behandlingEt forsøg er startet med den valgte nøgle.Afvent eller undersøg forsøget.
GennemførtResultatets reference er kendt.Undlad ny oprettelse.
Ukendt udfaldSvaret fastslår ikke virkningen.Find eller afstem resultatet først.
AfvistData eller beslutning skal ændres.Ret årsagen før genbehandling.

Hvis målsystemet hverken tilbyder sikkert opslag eller idempotent oprettelse, kan en handling med væsentlig virkning kræve manuel afklaring.

Læs leverandørens idempotensvilkår

Stripe er et produktspecifikt eksempel. Stripe gemmer statuskode og svar for det første udførte POST-kald med en idempotensnøgle og returnerer det samme svar ved gentagelse, også hvis svaret er en 500-fejl.

En gentaget 500-fejl beviser derfor ikke, at et nyt forsøg er udført eller at virkningen er afklaret. Stripe kan fjerne nøgler, når de er mindst 24 timer gamle, og afviser ændrede parametre med samme nøgle. Undersøg dækkede kald, nøglens levetid og samtidige anmodninger i jeres faktiske målsystem.

En beskedkøs dubletkontrol ved afsendelse erstatter heller ikke sikker behandling hos modtageren. Azure Service Bus beskriver, at en besked kan leveres igen, hvis en modtager mister låsen eller genstarter.

Idempotens i praksis: Stripe & Azure Service Bus

Stripe - Nøgletid
Mindst 24 timer
Stripe - Genbrug af nøgle
Funktioner ved gentagelse, også ved 500-fejl
Azure Service Bus - Dubletkontrol
Kun ved afsendelse – modtager må håndtere gentagne beskeder
Azure Service Bus - Genlevering
Mulig, hvis modtager mister låsen eller genstarter

Giv genforsøg en grund og en grænse

Midlertidige fejl kan egne sig til genforsøg med pause. Ugyldige data eller manglende rettigheder kræver normalt en anden handling. Aftal et begrænset antal forsøg, tag højde for genforsøg i eventuelle SDK'er, og følg en Retry-After-anvisning, hvis tjenesten giver en.

Brug fiktive tilfælde med to ens beskeder, et tabt svar og to samtidige forsøg til at kontrollere den konkrete opsætning. Angiv på forhånd, hvor mange resultater hvert tilfælde må skabe.

Mere fra Integrationer

Integrationer

Kontrollér data før de sendes videre

Definér nødvendige felter, kontrollér format og betydning, og ret fejl ved den gældende kilde før videresendelse.