Jokaisessa integraatiosopimuksessa on jossain lause kuten "jokainen tilaus lähetetään täsmälleen kerran." Se ei ole koskaan pitänyt paikkaansa. Verkko katkesi kesken pyynnön ja lähettäjä yritti uudelleen; jono toimitti viestin uudelleen kuluttajan kaaduttua; varastotyöntekijä painoi vientipainiketta kahdesti. Duplikaatit eivät ole vikatila - ne ovat sää.
Idempotenssiavaimet, huolella valittuina
Ratkaisu on vanha ja arkinen: jokainen viesti kantaa avainta, ja käsittely on no-op, kun avain on jo nähty. Mielenkiintoiset päätökset liittyvät kaikki avaimen valintaan.
- Luonnolliset avaimet voittavat generoidut.
order_id + status-avaimeen perustuva tilaussynkronointi selviää siitä, että lähettäjä generoi outboxinsa uudelleen; lähetyshetkellä luotu satunnainen UUID ei selviä. - Rajaa avain vaikutukseen, ei viestiin. Jos yksi viesti luo laskun ja varaa varastosaldon, kyseessä on kaksi vaikutusta kahdella avaimella - muuten osittainen epäonnistuminen jättää sinut kykenemättömäksi yrittämään kumpaakaan turvallisesti uudelleen.
- Vanhenna avaimet harkitusti. Dedup-varasto, joka kasvaa ikuisesti, on aikapommi; sellainen, joka vanhenee liian nopeasti, tuo duplikaatit takaisin. Oletusarvomme on 3× lähettäjän suurin uudelleenyrityshorisontti.
Testi, jolla on väliä
Jokainen toimittamamme integraatio läpäisee sen, mitä kutsumme sisäisesti double-tap-testiksi: toistetaan eilisen koko viestiloki tämän päivän järjestelmää vasten, kahdesti, ja verrataan lopputilaa. Jos toisella ajokerralla mikään muuttui, putki ei ole valmis.
Se on raaka testi, ja se epäonnistuu jatkuvasti kehityksen aikana - aikaleimoissa, "luonut"-audit-kentissä, järjestysnumeroissa. Jokainen epäonnistuminen on kohta, jossa kello kolmen aamuyön uudelleentoimitus olisi hiljaa turmellut dataa. On paljon halvempaa napata virhe kehitysvaiheessa kuin tuotannossa.