Joonas Lahtinen
Takaisin blogiin
Tuotantovalmius

Idempotenssi automaatiossa: miksi sama operaatio pitää voida ajaa kahdesti

Kuvittele seuraava tilanne: automaatiosi prosessoi yön aikana 500 käyttäjätiliä. Jossain kohtaa verkko katkeaa ja ajo keskeytyy numero 312:een. Mikä tapahtuu, kun ajo käynnistetään uudelleen?

Jos automaatiosi ei ole idempotentti, käyttäjille 1-312 saatetaan luoda kaksoistilit tai heidän tietonsa päivitetään kahdesti. Sama lasku tai tilausvahvistus lähtee kahdesti. Kansioita tai tietoja poistetaan toistamiseen.

Idempotenssi tarkoittaa, että operaatio voidaan ajaa uudelleen ilman, että lopputulos muuttuu. Ajat skriptin kerran tai kymmenen kertaa, tulos on sama.

Miksi tämä tulee vastaan tuotannossa

Koska tuotannossa asiat hajoavat. Verkko katkeaa. Palvelin käynnistyy uudelleen keskellä ajoa. Joku ajaa skriptin vahingossa toisen kerran. Task Scheduler käynnistää jo käynnissä olevan ajon.

Kaikki nämä tapahtuvat jossain vaiheessa. Jos automaatio ei kestä niitä, siitä tulee riskialtis.

Miten idempotenssi toteutetaan käytännössä

Tarkista ennen kuin teet

Sen sijaan, että teet suoraan, tarkista ensin, onko asia jo tehty.

Esimerkki PowerShellissa, käyttäjätilin luonti:

$user = Get-ADUser -Filter {SamAccountName -eq "mvirtanen"} -ErrorAction SilentlyContinue

if (-not $user) {
    New-ADUser -Name "Matti Virtanen" -SamAccountName "mvirtanen" ...
    Write-Output "Käyttäjä luotu: mvirtanen"
} else {
    Write-Output "Käyttäjä on jo olemassa, ohitetaan: mvirtanen"
}

Sama logiikka pätee tiedostoihin, kansioihin, konfiguraatioihin ja API-kutsuihin.

Käytä upsert-operaatioita

Monet tietokannat ja APIt tukevat upsert-operaatioita: päivitä jos olemassa, luo jos ei. Tämä on idempotenssi valmiina paketissa.

Kirjaa mitä on tehty

Checkpoint-malli tarkoittaa, että tallennetaan mihin asti on päästy, jotta uusintaajo voi jatkaa siitä eikä aloita alusta. Yksinkertaisimmillaan tämä on tekstitiedosto, joka sisältää viimeksi onnistuneesti käsitellyn rivin numeron tai tunnisteen.

Rakennepäätös, ei jälkikäteinen korjaus

Idempotenssi ei ole ominaisuus, jonka lisäät myöhemmin. Se on rakennepäätös, joka pitää tehdä suunnitteluvaiheessa.

Jälkikäteen sen lisääminen on huomattavasti työläämpää, koska se vaikuttaa koko automaation logiikkaan. Ja useimmissa tapauksissa se lisätään vasta sitten, kun jokin menee pieleen tuotannossa.

Aloita idempotentisti. Säästät huomattavasti vaivaa myöhemmin.

Haluatko tarkistaa, ovatko automaationne turvallisia uusintaajoja varten? Otetaan yhteyttä.