Skaitiklių paveikslėlių podėlis atmintyje
Šiame straipsnyje
Beveik penktadalis šios paslaugos piešiamų skaitiklių paveikslėlių daugiau nieko nekeičia. Ankstesnės kartos pelės sekimo scenarijus paveikslėlį įkelia per kiekvieną judesį, o nuo tada, kai tos užklausos nebedidina skaičių, dvi iš eilės sukuria tą patį paveikslėlį, baitas į baitą.
Akivaizdus podėlio kandidatas. Įdomūs sprendimai buvo kur jį laikyti ir kuo grįsti jo raktą.
Ne diske
Tai veikia mažame serveryje, o diskas yra SD kortelė. Piešiamų paveikslėlių podėlis joje būtų reiškęs maždaug 70 MB įrašymų per dieną, mainais už išmatuotą sutaupymą – 1,6 minutės procesoriaus laiko per dieną.
Tai blogas kompromisas. SD kortelės genda nuo įrašymo, o už tai gaunama tik apvalinimo paklaida kompiuteryje, kurio neriboja procesorius. Todėl podėlis yra /dev/shm, kuris yra tmpfs, tai yra RAM. Ten išmatuota: 0,027 ms skaitymui, 0,036 ms įrašymui, 1,9 GB laisvos vietos.
Paleidus iš naujo viskas dingsta. Podėliui tai ne praradimas, o įprastas atvejis.
Redis veikia tame pačiame kompiuteryje. Jis nenaudotas dėl su technologijomis nesusijusios priežasties: priklauso kitai programai ir jai apsaugotas slaptažodžiu. Bendra instancija susietų dvi nesusijusias paslaugas, todėl bloga diena vienai taptų bloga diena kitai.
Rakte yra skaičiai
Įprastas podėlio raktas yra tapatybė ir galiojimo pabaiga, o galiojimo pabaiga – lažybos: per pastarąsias penkias minutes nepasikeitė nieko svarbaus. Skaitiklyje keičiasi būtent tai, kas rodoma.
Todėl rodomos reikšmės patenka į raktą. Pasikeitus skaičiui, raktas jau kitas ir paveikslėlis piešiamas iš naujo. Lažybų atsisakoma, užuot jas darius atsargiai. Kiekvienas užskaitytas apsilankymas padidina bent viso laikotarpio sumą, todėl jokiam užskaitytam apsilankymui negali būti pateiktas pasenęs paveikslėlis. Likusi galiojimo pabaiga tėra viršutinė riba reikšmėms, kurių nėra rakte — savaitės, mėnesio ir metų skaičiams.
Ką reikėjo patikrinti pirmiausia
Podėlis saugus tik tada, jei jame laikomas dalykas yra jo rakto funkcija. Tai teiginys apie kiekvieną dizainą, ir jis patikrintas, o ne numanytas:
- joks dizainas nenaudoja
rand(),mt_rand(),shuffle()aruniqid() - joks dizainas neskaito laiko tiksliau nei valandomis
- sekimo parametrai iš seno scenarijaus niekur kodo medyje neskaitomi
Paskutinis punktas sukėlė geriausią viso bandymo nesėkmę. Kol tie parametrai dar buvo rakto dalis, kiekviena užklausa turėjo kiek kitokias pelės koordinates, todėl kiekvienas raktas buvo unikalus. Podėlis veikė visą dieną ir užregistravo 13 pataikymų. Jis veikė tobulai ir nieko nedarė – sunkiausiai pastebimas gedimo tipas.
O jei čia kas nors nepavyksta — neperskaitomas katalogas, pilnas diskas, sugadintas įrašas, — paveikslėlis tiesiog piešiamas įprastai. Podėlis niekada neturi būti priežastis, dėl kurios skaitiklis nepasirodo.