Registravimo į darželius sistemų iššūkiai
Tie, kurie prisimena registravimo į darželius sistemos startą Vilniuje 2014 ir 2015 metais supras, kad tokia sistema turi veikti stabiliai ir atlaikyti didelius krūvius be jokių kompromisų. Pasitelkėme tinkamiausius technologinius sprendimus ir dirbome pusantrų metų prie Visma Flyt Kindergarten (VFK) sistemos, kad ją galiausiai paleistume kiek galima sklandžiau. 2019 metų sausio pradžioje laukėme starto net 54-iose Norvegijos savivaldybėse, žinojome, kad esame viskam pasiruošę, o paskutiniai jMeter’io našumo testai rodė džiuginančius rezultatus. Tačiau buvo kiek neramu ir galvodami, kad Amazon Web Services (AWS) elastic scaling’as nesuveiks taip greitai – iš anksto paleidome dvigubai daugiau instance’ų ir laukėme registracijos starto savivaldybėse.
Netikėtumai startavus
Nors paraiškų skaičius į Norvegijos darželius augo kaip ant mielių, tačiau mūsų instance’ų procesorių apkrovimas svyruodavo iki 10%. Buvome pasiruošę rimtesniems išbandymams, bet mikroservisų architektūra ir SPA Angular appsai host’inami AWS CloudFront’e (CDN) leido paskirstyti apkrovimą, o .NET Core’as gerokai pagreitino užklausų apdorojimą lyginant su .NET Framework’u. Tuo įsitikinome 2018 metų viduryje migruodami į .NET Core, kuomet našumo testai parodė, kad tos pačios užklausos tapo vidutiniškai 3 kartus greitesnės po migracijos.
Po pirmų 3 savaičių production’e nusprendėme grąžinti instance’ų kiekį į įprastą ir toliau atidžiai stebėjome mūsų sistemos veiklą.
Kabinete realiu laiku stebime įvairius production aplinkos parametrus.
Tiesa, nors sistema ir lengvai susidorojo su krūviu, bet nesklandumų buvo iškilę. Savivaldybių darbuotojai norėjo kur kas daugiau laisvės tvarkant ir koreguojant paraiškas nei mes buvome numatę, todėl reikėjo skubiai tobulinti funkcionalumą ir leisti naujas versijas. Dėl automatizuoto CI pipeline’o ir naudojamo feature toggle sprendimo galime išleisti pakeitimus į production’ą kelis ar net keliolika kartų per dieną, kas tuo metu mums leido greitai reaguoti į savivaldybių darbuotojų poreikius.
Turbūt didžiausia mūsų klaida buvo netobulas user experience (UX) išorinėms sistemoms konfigūruoti. Kadangi mūsų sistema yra pilnai Software as a Service (SaaS), tai savivaldybės pačios gali susikonfigūruoti integracijų prisijungimus. Viena savivaldybė nurodė blogus prisijungimo duomenis su išorine sistema, dėl to integracija neveikė, o tėvai kurį laiką negalėjo pateikti paraiškų į tos savivaldybės darželius. UX patobulinome taip, kad savivaldybės galėtų pačios patikrinti, ar teisingai nurodė prisijungimus integracijoms su išorinėmis sistemomis. Tokiu būdu gerokai sumažinome tikimybę, kad pasikartos panaši klaida ateityje.
Kas visgi slepiasi po Visma Flyt Kindergarten “kapotu” ?
Kaip turbūt supratote, VFK nėra vien tik registravimosi į darželius sistema. Ji apima ir visą darželių veiklos administravimą – t.y. paraiškų apdorojimą, vaikų paskirstymą po darželius, vaikų/tėvų/darbuotojų informacijos tvarkymą, kainų skaičiavimą, sąskaitų išrašymą, darželių grupių sudarymą, ataskaitų siuntimą Norvegijos valstybinėms institucijoms ir kitas įvairias integracijas. Nuo šių metų pradžios taip pat pradėjome kurti mobiliąsias programėles, kurių pagalba tėvai galės komunikuoti su darželio darbuotojais ir matyti kas visą dieną vyko darželyje.
My Kindergarten programėlės skirtos tėvams ir darželių darbuotojams keistis informacija.
VFK infrastruktūros “variklis” – AWS’as, kurio pagalba ir “sukasi” visa mūsų sistema. Išnaudojame nemažai AWS’o galimybių – EC2, RDS, CloudFront, S3, SNS, SQS, Elastic Cache, Application Load Balancer, Lambda, WAF, Route 53 ir t.t.
Front-end’as – naujausias Angular, rašome su TypeScript’u.
Back-end’e – mikroservisus rašome naudojant .NET Core’ą ir Entity Framework’ą. Skirtingi appsai turi atskirus išorinius servisus (Gateways), kurie kviečia vidinius servisus.
Duomenų bazė – Amazon Aurora MySQL. Skirtingų savivaldybių duomenis atskiriame kodo lygyje, t.y. visi duomenys saugomi vienoje duomenų bazėje. Naudojame “read” replikas, dėl didesnio pasiekiamumo ir plečiamumo. Šias replikas galime plėsti horizontaliai, todėl “read” užklausas nukreipiame į jas, taip sumažindami apkrovą master instance’ui. Replikos veikia skirtingose pasiekiamumo zonose (AZ). Esant situacijai, kai master instance’as taptų nepasiekiamas – įvyktų automatinis replikos paaukštinimas į master’į. Tokiu būdu sistema yra visada pasiekiama.
Nuolatiniam diegimui (CI/CD) naudojami Teamcity, Octopus Deploy, Powershell ir Infrastructure as Code.
Stebėjimui – Grafana, Graylog, Cloudwatch.
Kadangi esame ištikimi SaaS idėjoms, tai ir patys naudojame SaaS principu veikiančius įrankius. Crowdin – lengvam vertimų administravimui, LaunchDarkly – feature toggle’inimui, WalkMe – lengvam vartotojų supažindinimui su mūsų nuolat atnaujinamu funkcionalumu, Kindly.ai ChatBot’as – bendravimui su galutiniu vartotoju ir support komandos darbo palengvinimui.
Mobiliąsias programėles kuriame naudodami “native” technologijas – iOS platformai – Swift’ą, o Android – Kotlin’ą.
Negalėtume dirbti nuolatinio diegimo principu be automatinių testų. Smoke testus rašome su Selenium, API testuojam su SpecFlow, našumo testus darome su jMeter. Na ir žinoma funkcionalumą dengiame Unit testais.
Saugumas
Vismoje nemažai produktų vystome sveikatos ir socialinės gerovės srityse. Tiem, kam teko dirbti prie panašių sistemų, žino, kad saugumas turi būti tokio pat aukšto lygio kaip ir bankinių sistemų, o kartais net aukštesnis – ir ne veltui – duomenys dažniausiai būna susiję su žmonių sveikata. Visma Flyt Kindergarten – ne išimtis, kadangi kai kuriais atvejais tenka saugoti duomenis, susijusius su vaikų sveikata – turime užtikrinti aukščiausio lygio saugumą.
Visi duomenys esantys S3 bei duomenų bazėje saugomi užšifruoti. Naudojami tik saugūs komunikacijos kanalai. Taikome griežtas Content Security Policy (CSP) taisykles, Cross Site Request Forgery (CSRF) saugą, bei kitas gerąsias OWASP rekomendacijas.
Kodo analizės įrankis Coverity padeda aptikti ir ištaisyti potencialiai pažeidžiamas vietas.
Bug Bounty – rask saugumo spragą, o mes atsidėkosim
Neseniai su Visma Flyt Kindergarten startavome HackerOne platformoje su Bug Bounty programa. Tokiu būdu mūsų produktas viso pasaulio hakeriams tapo prieinamas testavimo tikslams. Už rastas saugumo spragas Visma skiria atlygį. Išmokos dydis varijuoja nuo 100 iki 3000 dolerių priklausomai nuo spragos sudėtingumo, laikant, kad XSS yra mažiausio sudėtingumo spraga. Mūsų sistema nėra skylėta – turi Platinum – aukščiausio lygio saugumą Visma kontekste, bet tuo pačiu būtų naivu tikėtis, kad hakeriai nieko neras. Lauksime žinių iš hakerių… ☠️
Komanda
Po kiekvienu stipriu produktu slypi ir stipri komanda. Iš viso Visma Flyt Kindergarten programuotojų komandoje dirba 9 programuotojai – 3 prie back-end’o, 3 prie front-end’o, 2 prie mobile’o ir 1 prie automatinio testavimo. Visa AWS infrastruktūra sklandžiai veikia dėka patyrusio DevOps inžinieriaus. Pagal geriausias Scrum praktikas visi sėdime viename kabinete, Vilniuje – tai mums leidžia greitai priimti sprendimus ir lengvai keistis idėjomis. Sprendimus priimame kartu, kaip komanda, todėl kiekvienas esam svarbus ir įtakojam techninius (ir ne tik) sprendimus. Tuo labai džiaugiamės.
Mūsų product owner’iai ir kiti už verslą atsakingi žmonės dirba Norvegijoje, bendravimas su jais vyksta nuotoliniu būdu. Kas mėnesį darome demo su projektu susijusiems žmonėms, kartais susitikime gali būti ir 50 dalyvių – tiek mūsų produktas vienaip ar kitaip paliečia žmonių Vismoje.
Stand-up’as kiek kitaip.
Kas mėnesį, kai turime pakankamai idėjų eksperimentams, organizuojame “Your Developer’s Day” – visą dieną dirbame prie to, kas mums įdomu ir nėra susiję su esamomis užduotimis.
Po svarbių “deliver’ių”.
Kas mūsų laukia ateityje?
Žinoma, augimas ir technologiniai iššūkiai. Šiais metais esame suplanavę klientų skaičių padvigubinti ir metų pabaigoje mūsų sistema turėtų naudotis 130-140 savivaldybių. Žinant, kad Norvegijoje yra daugiau nei 400 savivaldybių, tai dar turime kur augti, o jei to bus negana – pradėsime dairytis į kitas skandinavijos rinkas.
Planuojame visiškai pereiti į Linux konteinerius. Taip galėsime ne tik sumažinti kaštus, bet ir pagreitinti naujos versijos diegimą.
Kitas, kur kas didesnis iššūkis – automatizuoti priėmimo į darželius procesą pasitelkiant AI (artificial intelligence) sprendimą. Šiuo metu savivaldybių darbuotojai rankiniu būdu paskirsto vaikus po darželius. Yra daug parametrų į kuriuos reikia atsižvelgti – pavyzdžiui, ar vaiko broliai/seserys jau lanko darželį, gal vienas iš tėvų dirba tame pačiame darželyje, o gal vaikui reikia specialios priežiūros ir pan. Procesas užtrunka ilgai, nes paskirstymas daromas keliomis iteracijomis. Galutinis rezultatas nebūna optimalus, nes įsivelia žmogiškos klaidos. Visa tai norime gerokai supaprastinti ir paskirstymą padaryti visiškai automatinį pasitelkiant dirbtinį intelektą. Tuomet savivaldybių darbuotojai galės daugiau laiko skirti vaikų ugdymui ir sąlygoms darželiuose gerinti.
Žvelgiant toliau, mūsų kuriama sistema turėtų tapti nepastebima pagrindiniams mūsų vartotojams – vaikų tėvams. Apskritai tėvai neturėtų ateityje sukti galvos dėl registravimosi į darželius, o pasiūlymą apie ateities darželį tėvai gautų vos gimus vaikui. Nors ši idėja ir atrodo kiek utopiška, bet technologijos jau dabar tai leidžia pasiekti, na, o mes, Visma Flyt Kindergarten komanda nuosekliai dirbdami, šią utopiją paversime realybe.