Hopp til hovedinnhold

Hvorfor kjøpe retries lage duplikat rettighetene og hvordan å teste dem

Opprinnelig Persistium kjøpslederdiagram som viser en intensjon, en holdbar rekord og en replay-sikker rettighetsbeslutning.

Hvordan modellere kjøp intensjon, ukjente forplikte utfall, retries, og rettighet unikhet slik at et kjøp trygt kan forsøkes uten å gi to ganger.

Et forsøk er ikke en andre kjøpsbeslutning

Kjøp strømmer mislykkes i rommet mellom en ekstern betaling hendelse og en in-game bidrag. En mottak kan komme to ganger. En nettverksforespørsel kan time ut etter serveren forpliktet tilstand, men før klienten fikk svaret. En prosess kan krasje etter å ha reservert en transaksjon, men før du gir valutaen. Ved omstart kan den sikreste handlingen være å prøve arbeidet som ble avbrutt. Hvis systemet behandler alle forsøk som tillatelse til å gi, er dupliserte rettighetene en normal konsekvens av gjenoppretting.

Den nyttige forskjellen er intensjon versus tilskudd. Hensikten er å få et bestemt produkt under en bestemt transaksjonsidentitet. Grant er det holdbare spillet-siden utfall: rettighet eierskap, et valutadelta, en lagerpost eller en abonnementsperiode. Den samme hensikten kan leveres, queried, retried eller relevert mange ganger. Det bør fortsatt løse til en tildelingsbeslutning.

Dette er et ingeniørmønster, ikke en plattform-spesifikk garanti. Ulike butikker, betalingsleverandører og spill backends avslører forskjellig mottak, anerkjennelse og refusjonsadferd. Ikke anta en mottak beviser et bidrag, eller at en anerkjennelse viser spilleren så et element. Bygg serversiden-posten slik at spillet kan oppgi hva det vet og gjenopprette trygt når et eksternt resultat er ufullstendig eller forsinket.

Gi hvert kjøp en stabil nøkkel

En idempatens-nøkkel binder gjentatte leveringsforsøk til en beslutning. Den kan stamme fra en pålitelig plattformtransaksjonsidentifikator når den identifikatoren er tilgjengelig og verifisert, eller den kan utstedes av en server før et kjøp begynner og kobles senere til betrodd mottaksinformasjon. Nøkkelen må være stabil på tvers av retries. Opprette en ny tilfeldig nøkkel hver gang klienten trykker på \"gjenopprette\" bare oppretter flere transaksjoner som skjer å ligne.

Lagre nok sammenheng med nøkkelen til å avvise feil: spiller- eller kontoomfang, produktidentitet, forventet mengde eller rettighetsform, kildekanal, mottatt tid, verifiseringsstatus og en tilstand som venter, utført, avvist eller behovsreview. Hold sensitive mottaksmateriale ut av vanlige logger. Hvis råleverandørers nyttelast trenger kort oppbevaring for en verifisert gjenopprettingsstrøm, beskytte dem separat og gjøre deres tilgang bevisst.

Datamodellen trenger også en unik grense. For en ikke-forbrukbar rett kan unikhet være konto pluss produkt-ID. For valuta er unikhet vanligvis lederen oppføring eller gi transaksjonen i stedet for den gjeldende saldoen. For forbrukere kan en pålitelig transaksjonsidentifikator være unik selv når produktet ID gjentar. Definer nøkkelen før koding av gjenforsøkspolicyen; ellers kan to delsystemer dedupliseres mot uforenelige identiteter.

Modeller det ukjente trekkresultatet

Det vanskelige utfallet er ikke en ren suksess eller en ren feil. Det er \"ukjend\": klienten vet ikke om serveren begikk tilskuddet. En tidsavbrudd, tilbakestilling av forbindelse, prosessstart eller tjenesteutbrudd kan produsere denne tilstanden. Den trygge klientadferden er å be om transaksjonsstatus eller forsøke på nytt samme hensikt. Den sikre serveradferden er å slå opp den hensikten og returnere den holdbare avgjørelsen i stedet for å anvende en annen mutasjon.

Ikke gjør klientens visningstilstand autoritativ. En spinner forsvinner, en lokal mottaksbuffer eller en optimistisk balanseendring kan forbedre opplevelsen, men det kan ikke bestemme om kontoen eier en rettighet. Servermyndighet betyr serveren verifiserer den godkjente transaksjonen i henhold til produktets tillitsgrense, forplikter den holdbare rekorden en gang, og returnerer den gjeldende tilstanden når den blir spurt igjen.

Opprinnelige kjøpssekvensdiagram som viser gjentatte leveringsforsøk som konvergerer på én ledende rekord og en rettighetsbeslutning.
Retter seg og mottar omleveringsløsning mot samme holdbare kjøpsformål i stedet for å skape nye stipend.

Sekvensen bør gjøre den delvise fullføringspolitikken synlig. For eksempel: motta intensjon, valider betrodde kjøpsbevis, opprette eller laste den holdbare lederposten, forplikte seg til rettigheten eller valutamutasjonen, markere den tildelte rekorden, bekrefte ekstern levering når det er hensiktsmessig, deretter returnere resultatet. Hvis prosessen stopper mellom to trinn, kan en gjenopprettingsarbeider eller senere statusspørsel gjenoppta fra den varige rekorden. Den nøyaktige bestillingen avhenger av den eksterne leverandøren og spillarkitekturen, men den enkelte tilskuddsiden gjør det ikke.

Beskytte rettighetene og valutaen invarianter

En idempatensnøkkel hindrer gjenspilling av en hensikt; den gjør ikke automatisk hver bivirkning riktig. Definere invariantene et bidrag må bevares. En ikke-forbrukbar rett vises på det meste én gang for kontoen og produktet. Et valutatilskudd har en ledgerpost med én transaksjonsnøkkel, en kjent delta, og en resulterende balanse som samsvarer med summen av gyldige oppføringer. Inventarbidrag adlyder stabel, kapasitet og element-definisjonsregler. En abonnementsperiode strekker seg ikke to ganger fordi bekreftelsesendpointet gikk to ganger.

Gjør den invariante sjekke en del av den samme holdbare driften som forplikter seg til å gi. En lesning etterfulgt av en senere skriving kan løpe under samtidig levering. To arbeidere kan både observere \"ikke eid\" og begge tilskudd. Bruk transaksjonslagring, sammenlign-og-sett semantikk, en serialisert konto mutasjonssti, eller en annen eksplisitt konvalens primitivt egnet til databutikken. Den viktige egenskapen er at beslutningen og markøren ikke kan uavhengig vinnes av to forsøk.

For spill med en in- memory løpstid, skille holdbar suksess fra presentasjon. Serveren kan oppdatere en spillers synlige balanse etter den holdbare ledger oppføringen forplikter seg, men den synlige oppdateringen er ikke bevis. Ved å koble eller starte på nytt, gjenoppbygge den presenterte tilstanden fra den holdbare kontoposten. Det gjør en forsinket klientrespons upraktisk i stedet for økonomisk usikre.

Test krasjer, starter på nytt og relevererer bevisst

Start med et deterministisk scenario. Opprett en konto, ett produkt, ett kjent startbalanse eller rettighetssett, og en stabil transaksjonsnøkkel. Kjør flyten, injiser deretter en feil etter hver navngitt grense: etter mottaksaksept, etter å ha opprettet rettslig mutasjon, etter statusmerking, etter ekstern anerkjennelse, og etter at responsen er forberedt. Start på nytt den relevante arbeideren eller prosessen, prøv på nytt den samme nøkkelen og hevde den endelige holdbare tilstanden.

Det forventede utfallet bør være spesifikt. En gjenforsøk kan returnere \"already gitt\" med det opprinnelige resultatet, gjenoppta en ventende operasjon, avvise en feilaktig nyttelast, eller holde en post for gjennomgang. Det bør ikke legge til et andre lagerelement, bruke et andre valutadelta eller skjule den ukjente tilstanden med en fabrikkert suksess. Fang klassifiseringen i testresultatet slik at en senere refaktor ikke kan gjøre et intensjonelt grep til en utilsiktet duplikat.

Bruk omlevering av mottak i det samme scenarioet. Lever den nøyaktige pålitelige transaksjonen to ganger, deretter levere den etter en omstart, deretter levere den sammen med en duplisert klient reprøv. Den resulterende ledger- og kontotilstanden bør være identisk med enkeltleveringstilfellet. Hvis produktet tillater gjentatte kjøp, kjører den samme sekvensen med to virkelig forskjellige transaksjonsidentiteter for å bevise at systemet ikke overdedupliserer med produkt-ID alene.

Hold grensene ærlige

Testing kan bevise bare de interaksjonene du kjører. En simulert leverandørrespons kan validere tilstandsmaskinen din, men det er ikke bevis på at hver produksjonsleverandørs kant oppfører seg nøyaktig på samme måte. En kjørbar test mot en sandkasse kan legge til tillit for den integrasjonen, men likevel har forskjellige driftsbetingelser fra en livebutikk. Ta opp om et scenario bruker en simulering, lokal adapter, sandkasse eller verifisert leverandørmiljø.

En klient bør ikke sende en vilkårlig mengde, produkt-ID eller \"verifisert\" flagg og motta et bidrag. Innganger er upålitelige til serveren validerer dem mot den relevante konfigurasjonen og kjøpe bevis. Hvis valideringen ikke kan fullføre, hold intensjonen i vente eller avvise den med en gjenopprettbar kategori. Ikke la en prøvekø bli et omgrep rundt verifisering.

Personvern gjelder denne test disiplinen. Fixturer bør bruke syntetiske transaksjonsdata. Logger bør referere til en sikker testidentifikator, ikke en rå kvittering eller kontonavn. En produksjonshendelse kan kreve begrenset bevis, men rutinetestsuiten bør aldri bli en annen betalingsdatabutikk.

Praktisk sjekkliste

  • Separat en stabil kjøp intensjon fra senere spill-side gevinst.
  • Bruk en idempatiens-nøkkel på tvers av tidsgrenser, retries, omstarter og mottar omlevering.
  • Bind nøkkelen til kontoen, produktet eller rettighetsformen, og pålitelig kildekontekst.
  • Definere holdbare tilstander som venter, forpliktet, avvist og behov-review.
  • Styrke retten unikitet og valuta-ledede invarianter inne i samme konovalutagrense som tilskuddet.
  • Injiser feil etter hver tilstandsovergang, og prøv deretter på nytt den samme hensikten.
  • Test duplikat levering og legitime gjenta kjøp separat.
  • Rapporter ukjente resultater ærlig; ikke forvandle en tidsavbrudd til en oppfunnet suksess.
  • Hold kvitteringslignende fixturer og testlogger syntetisk og omdøpt.

Vanlige spørsmål

Er et unikt mottaks-ID nok for idemppotens?

Det kan være en nyttig komponent når serveren kan verifisere at mottaksidentiteten er pålitelig og omfang det riktig. Det er fortsatt viktig å lagre den resulterende tildelingsbeslutningen, feilretningslinjen og gjenopprettingstilstanden. Et system kan motta den samme identifikatoren gjentatte ganger, motta den sent eller motta den med en nyttelast som ikke samsvarer med den lagrede produktkonteksten. Den holdbare rekorden er det som gjør disse tilfellene inspekterbare.

Bør en klient prøve seg automatisk etter en tidsavbrudd?

Vanligvis bør det forsøke statusoppløsning ved å bruke den samme hensiktsidentiteten, med avgrenset backoff og klar brukerfeedback. Om det skal sende eksterne kjøpsbeviser avhenger av leverandøren og verifiseringsdesignen. Den usikre oppførselen skaper stille en ny kjøpsforespørsel eller pålegger et lokalt stipend fordi den opprinnelige responsen var tapt.

Hvordan skiller forbrukerne seg fra permanente retter?

Permanente retter kan vanligvis dedupliseres etter konto og produkt. Forbrukere kan tillate det samme produktet å kjøpes mange ganger, så unikhetsgrensen må inneholde en transaksjonsidentitet eller ledgersekvens i stedet for produkt-ID alene. Begge trenger fortsatt et enkelt bærekraftig bidrag for hver akseptert hensikt.

Hva hevder Persistium her?

Persistium er i utvikling. Denne noten forklarer bredt gjeldende integritets- og testdesignmønstre; det hevder ikke et offentlig kjøpsprodukt, plattformsertifisering, kundehendelseshistorie eller en verts tjeneste. Kontinuitetsretningen er interessert i den samme typen av avgrensede bevis og replay-sikre recovery disiplin.

Relatert systemUtforsk Persistium