Igas integratsioonilepingus on kusagil lause stiilis "iga tellimus edastatakse täpselt üks kord." See pole kunagi tõsi olnud. Võrk katkes päringu keskel ja saatja proovis uuesti; järjekord edastas uuesti pärast tarbija krahhi; laotöötaja vajutas eksportimisnuppu kaks korda. Duplikaadid ei ole rikke režiim - need on ilm.
Idempotentsusvõtmed, hoolikalt valitud
Lahendus on vana ja ilma säramata: iga sõnum kannab võtit ja töötlemine ei tee midagi, kui võti on juba nähtud. Huvitavad otsused peituvad kõik võtme valimises.
- Loomulikud võtmed on paremad kui genereeritud võtmed. Tellimuse sünkroonimine, mis kasutab võtmena
order_id + status, jääb ellu, kui saatja genereerib oma väljundpostkasti uuesti; saatmise ajal loodud juhuslik UUID seda ei tee. - Piiritlege võti mõju, mitte sõnumi järgi. Kui üks sõnum loob arve ja broneerib laoseisu, on need kaks mõju kahe võtmega - vastasel juhul jätab osaline ebaõnnestumine teid võimetuks kumbagi ohutult uuesti proovida.
- Laske võtmetel teadlikult aeguda. Dedupe-hoidla, mis kasvab lõputult, on ajapomm; see, mis aegub liiga kiiresti, toob duplikaadid tagasi. Vaikimisi kasutame me saatja maksimaalse uuestisaatmise ajahorisondi 3-kordset väärtust.
Test, mis loeb
Iga integratsioon, mida me tarnime, läbib selle, mida me sisemiselt nimetame topeltklõpsu testiks: mängige eilne kogu sõnumilogi tänase süsteemi vastu läbi kaks korda ja võrrelge tekkinud olekut. Kui teisel läbimisel midagi muutus, ei ole andmevoog valmis.
See on julm test ning see ebaõnnestub arenduse ajal pidevalt - ajatemplite, "loonud" auditiväljade, järjestusloendurite tõttu. Iga ebaõnnestumine on koht, kus kella kolme ajal öösel toimuv uuestisaatmine oleks vaikselt andmeid rikkunud. Palju odavam on see tabada arenduses kui tootmises.