Presne raz je lož: navrhovanie integrácií pre duplicity

Tri kópie tej istej dlaždice správy zbiehajúce sa do jednej spracovanej dlaždice

Niekde v každej integračnej zmluve je veta typu „každá objednávka bude odoslaná presne raz". Nebola pravdivá ani raz. Sieť sa rozdelila uprostred požiadavky a odosielateľ to skúsil znova; fronta doručila správu znova po páde konzumenta; skladový pracovník stlačil tlačidlo exportu dvakrát. Duplicity nie sú zlyhanie - sú počasie.

Idempotenčné kľúče, starostlivo vybrané

Riešenie je staré a nevzhľadné: každá správa nesie kľúč a spracovanie je no-op, keď už bol kľúč videný. Všetky zaujímavé rozhodnutia sú vo výbere kľúča.

  • Prirodzené kľúče porážajú generované. Synchronizácia objednávok s kľúčom order_id + status prežije, keď odosielateľ znova vygeneruje svoj outbox; náhodné UUID vytvorené v čase odoslania nie.
  • Rozsah kľúča viažte na efekt, nie na správu. Ak jedna správa vytvorí faktúru a zároveň zaúčtuje sklad, sú to dva efekty s dvomi kľúčmi - inak vás čiastočné zlyhanie ponechá v stave, keď bezpečne nemôžete zopakovať ani jeden z nich.
  • Nechajte kľúče vypršať zámerne. Úložisko na deduplikáciu, ktoré rastie donekonečna, je časovaná bomba; také, ktoré vyprší príliš skoro, opäť zavedie duplicity. Predvolene používame 3-násobok maximálneho horizontu opakovania odosielateľa.

Test, na ktorom záleží

Každá integrácia, ktorú dodáme, prejde tým, čo interne nazývame test dvojitého ťuknutia: prehráme celý včerajší log správ voči dnešnému systému, dvakrát, a porovnáme výsledný stav. Ak sa pri druhom priechode čokoľvek zmenilo, pipeline nie je hotová.

Je to brutálny test a počas vývoja neustále zlyháva - na časových pečiatkach, na audit poliach typu „vytvoril", na sekvenčných počítadlách. Každé zlyhanie je miesto, kde by opätovné doručenie o 3:00 ráno potichu poškodilo dáta. Odhaliť to počas vývoja je oveľa lacnejšie než v produkcii.