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ä.