Post-mortem a 2021. október 21-i üzemzavarhoz

A tegnapi nap (2021. október 21.) folyamán több felhasználó is jelezte, hogy az Utánvét Ellenőr miatt eltűnt az utánvétes fizetési mód a checkout folyamatból. Sikerült a kérdés végére járnom, a vizsgálat folyamatát az alábbiakban részletezem.

Ma reggel láttam meg az éjjeli riasztást, hogy az Utánvét Ellenőr leállt. Elsőre azt gondoltam, hogy ez a szokásos éjjeli újraindulás miatt van, hiszen több másik oldal esetében is kaptam riasztást, néhány perc elteltével mindegyik mellett ott volt a visszatérést jelző értesítés is - az Utánvét Ellenőrt kivéve. Amint tudtam, átnéztem a naplófájlokat, ahol azt láttam, hogy nem elérhető az adatbázis. Gyorsan újraindítottam a rendszert (ez sok mindent meg szokott oldani 😉), viszont továbbra sem állt helyre a kiszolgálás. Átgondolva a hetet eszembe jutott a két nappal ezelőtti délután: töröltem az Utánvét Ellenőr adatbázis szerverének egy fontos rendszerkomponensét, mégpedig azt, amin keresztül az adatbázishoz hozzá lehet férni. 🤦

Az éles környezetet Dockerben futtatjuk, ami arra szolgál, hogy az egyes oldalak és azok alrendszerei önálló egységet képezzenek, a futtatókörnyezet pedig gyorsan reprodukálható legyen bármilyen más eszközön, mert annak csak egy előre összeállított receptet kell "megfőznie". Mivel ezt a változtatást nem a receptben, hanem a futó adatbázis "konténerben" végeztem el ("a jó recept alapján készült levest csak a saját tányéromban sóztam el") ezért innentől kezdve gyorsan helyre tudtam állítani a rendszert: csak újra kellett építtetni a konténert, így 1 perccel később minden a régi mederben folyt.

Azt gondoltam, hogy a mai napra ezzel megvagyunk, minden rendben, amikor többen is jelezték, hogy a shoprenteres shopjukban eltűnt az utánvét, és csak az Utánvét Ellenőr törlésével orvosolható a probléma.

Újra nekiálltam hát a kutakodásnak, ráadásul a hibakeresést nehezítette, hogy az elmúlt néhány napban több változtatást is élesítettünk a rendszeren, ami a fizetőssé válásra való felkészítést célozta. Az egyik ilyen módosítás volt az is, ami ellenőrzi, hogy az adott Forráshoz tartozik-e érvényes előfizetés, és annak havi keretéből van-e még hátra lekérés - ha nincs, akkor hibaüzenettel válaszolunk, ennek mellékhatása lehetett volna az, hogy eltűnik az utánvét akkor is, ha nem kellene (hiszen csak negatív válasz esetén kellene eltűnnie). A reggeli leállás mellékhatását kizárva ebbe az irányba indultam el, de végül, 20 Shoprenteres shopot tesztelve, bebizonyosodott, hogy nem itt kell keresni a hibát: a rendszer megfelelően válaszolt az összes esetben - mint utóbb kiderült, ezekkel a webshopokkal pont beletrafáltam. Hogy miért?

Egy gyors kitérő! A rendszer működési elve az, hogy a korábbi visszajelzéseket összeszámolva készít egy mutatószámot az adott hashről, ami egy -1 és +1 közötti szám lehet: minél magasabb, annál jobb a hash reputációja. Na de mi történik akkor, ha egy hashhez nem találunk adatot? A nagy számok törvénye alapján megpróbálunk átlagot számolni az elmúlt X nap történéseiből, és egy "platformátlagot" visszaadni: vagyis "mindig" lesz válaszunk, de az csak a többi, eltérő hashhez tartozó visszajelzések átlaga lesz, nem az adott hashre vonatkozó - így ha egy teljesen új hash is jelenik meg a rendszerben, tudunk "becsülni" annak megbízhatóságára. Ennek értéke normál esetben 0.96-0.98 körül szokott alakulni.

Mint utóbb kiderült, csak olyan shopokat ellenőriztem, ahol a küszöbérték viszonylag alacsonyra (0.5, vagy az alatti) volt állítva. Ugyanis pont a napokban kezdte el használni a rendszerünket egy olyan shop, aki a regisztrációt követően néhány óra alatt 1700 visszajelzést "borított" ránk. Hogy ez miért okozott problémát? Mert ezek nagy része negatív visszajelzés volt, így nagyon lehúzta a platformátlagot, nagyjából 0.73 körülre, ennek következtében pedig azoknál a shopoknál, ahol ezen érték körül, vagy felett volt beállítva a küszöbérték, azon vásárlók esetében is eltűnt az utánvét, ahol erre nem lett volna szükség. A dolognak pedig az ad egy még szebb csavart, hogy ezt az a változtatás tette lehetővé, amit nagyjából 2 hete végeztem (október 5-én), amikor is a rendszer gyorsítása érdekében a platformátlag számításának alapjául szolgáló időszakot 2 hétről 1 hétre csökkentettem: így kisebb lett a mintavételezési ablak, vagyis ugyanaz a mennyiségű visszajelzés nagyobb súllyal esik latba.

A hasonló hibák elkerülése érdekében a jelen bejegyzés írásával egyidejűleg visszaállítottam a kéthetes időablakot a platformátlag alapjának, mely reményeim szerint ellenállóbbá teszi a rendszert az ilyen jellegű tévedésekkel szemben - a platformátlagot mindenesetre szemmel láthatóan megemelte. Tervben van egy "live" platformátlag megjelenítő kidolgozása is, mely élőben mutatná annak aktuális értékét (egyfajta barométerként), így segítve a webshop tulajdonosokat a helyes érték beállításában és a tájékozódásban.

A vizsgálat során ellenőriztem azt is, hogy ezen hiba következtében mennyi lekérés esetében küldhetett "fals pozitív" jelzést a rendszer, ennek értéke valahol 4% körül lehet.

Őszintén sajnálom, hogy egy ilyen hiba előfordulhatott - magam is meglepődtem a véletlenek ilyen összjátékán.

Remélem, hogy idővel sikerül visszanyernem azok bizalmát is, akik most úgy érzik, csalódottak. Amennyiben bármilyen kérdésed felmerült, ne habozz felvenni velem a kapcsolatot, igyekezni fogok segíteni.