Hajussüsteemid: skaleerimise märkmed
Allikas: Lambda
Meditsiinisüsteemi näide ------------------------- 1) koormus liiga suur hommikul ja õhtul: peakid 2) rakendusserver aeglane, panime kaks rakendusserveri kasti, dns-l on kaks ip-d taga, praktikas võeti randomiga üks või teine ip NB! * Liiga palju parallelismi ühes masinas ei ole hea * 3) andmebaas hiljem aeglaseks: a) leidsite aeglased queryd ja optimeerisite andmebaasi (indekseid ja queryde parandamine) b) kettakoormus ab-l läks ikkagi suureks, panite raid-10 kettad raid-5 asemel c) lisandus palju analüütilisi querisid, tegite ab replikatsiooni teise serverisse ja jooksutasite analüütilisi querisid teises serveris Kalastuspileti näide pilet.ee ------------------------------ - oracle - connection pool sai täis (rakendusserveri ühendus andmebaasiga), esialgu suurendasid tulemus läks veel halvemaks - lahendus 1: - piirasin connection pooli, andsin varem jalaga, värk läks paremaks - aeglased queryd: optimeerisime (lisad lisapiiranguid a la aegadele (indekseeritud)), katsetad Id kaardi uuendamise näide -------------------------- id-kaardi teema connection pooliga kaartide uuendamisel: - kogu aeg aeglane; algul oli piiratud hulk kasutajaid, siis kasutajate arv plahvatas - teemaks rakendusserver, mis suhtles mitme asjaga omakorda, tegi mujale api calle - ühe ülesande teenindamise protsess oli pikk / nõudis palju calle väljapoole - konkreetne suur probleem oli logianalüsaatorile saatmise call: teine pool ei võtnud vastu - riik pani tulemüüril piirangud peale: piiras connectionite arvu minutis kaartide tühistamist aeglustati kasutus ka hajutus Vaktsineerimise regamise näide ------------------------------- vaktsineerimise regamise aegluse case: - pandi peale ootejärjekord (uus süsteem: regati sind ootejärjekorda? tehik?) Tähelepanekuid ja soovitusi ---------------------------- * Terminoloogia NB! Mis tähendab "skaleerimine" ja "skaleeritavus": * Praktikas tähendab ta "optimeerimist" * Rangemas tähendus on "skaleeritavus": "võime lisada kergesti ressursse, mis tõstavad võimekust" * Hea point: ** Vertical scaling "skaleerimine": paneme parema / kiirema masina / rohkem mälu ** Horizontal scaling: hajutame mitme masina peale * Ära optimeeri, kui pole vaja: enamasti ei teki süsteemile eriti suurt koormust * Ole valmis, et võivad tekkida ootamatud peakid või takistused * Rakendusserver ei pruugi olla süüdi: vbl ta ootab andmebaasi või väliste päringute taga * Rakendusserveri reaalse probleemi korral tuleb püüda tuvastada, mis osad tal aeglaselt käivad * Sisuliselt on pea alati probleem kas andmebaasis või välistes päringutes, mis on aeglased: st tüüpiliselt saab rakendusserveri koodi enda kiireks optimeerida * Väga suurte koormuste ja keerulise süsteemi puhul on mõtet kaaluda hoopis queuedega a la Kafka või Rabbit MQ arhitektuuri kasutamist: selles siin hiljem * Andmebaasi teema: * Leia aeglused ja mõõda * Hea on, kui saad katsetada live süsteemi kõrval arendussüsteemis (aga seal ei pruugi olla sama data / samad välised päringud / samad kõrval-tegevused) * Optimeeri kriitilisi päringuid (mis on aeglased) * Pane päringule lisapiiranguid (et suudaks kiiresti leida olulise dataseti) * Arhiveeri osa datat välja suurt tabelitest, mis paistavad olema kriitilised päringus * Ab serveri eraldada analüütilistest päringutest (kaks serverit, üks analüütika jaoks, teine olap-ks kiirpäringud) * Ab shardimine : tabelite jagamine tükkidena eraldi serveritesse * Ab replikeerimist: ab üldse paljudesse serveritesse * Kõik ab hajutamise asjad küsivad konsistentsuse järel: et igal pool oleks sama data (analüütika jaoks võib olla viivitusega!) * Ketta failisüsteem võib ka väga fragmenteeruda (isegi ssd puhul on see probleem) * 10.000 päringut sekundis on see, mida sa optimistlikult võid oletada (http teeb, ab samuti) Kafka ja teenuse-põhine arhitektuur (ei pea olema mikroteenused) ------------------------------------- Message queued a la rabbit mq: saadad sõnumeid ja teiselt poolt tarbid. Erinevad teenused kirjutavad sõnumeid (ülesandeid) ja teine pool tarbib neid: * Kui "tava-api" pärib ja saab kohe vastuse, siis * "queue" süsteem saadab päringu, see salvestatakse sõnumite/ülesannete baasi (a la queue) eraldi datastruktuuris (mis võib olla andmebaasis a ei pea olema) * Sõnumi "vastuvõtja ja töötleja", kes peaks vastama, võtab sõnumeid sealt sõnumite/ülesannete baasist NB! * Tekib väike delay. * Saad pidevalt jälgida, kui palju sõnumeid ootel on * Saad panna piiranguid sõnumite hoidmise mahtudele * Saad panna juurde lisa-teenindajaid, kui ei jaksa teenindada * Kubernetes maailmas on näiteks auto-scaler, mis suudab ajutiselt automaatselt teenuseid lisada * Webhooks? Kasutaja saaks notificationi, kui toimub sündmus? A la githubi callbackid. * Panna soovi korral mitu tarbijat sõnumile * Võib tekkida oht (rabbitiga olnud) et rabbiti sõnumimasin ise ei jaksa (kafka paistab efektiivsem) Kõik tegevused toimuvad läbi queuede. Näited: * push notification: kasutaja teeb aplikatsioonis tegevuse, me paneme sõnumi queuesse (mälus a la stackis) * kui teenus saab sõnumi, teeb requesti väljapoole maailma * kui sõnumeid tuleb rohkem, kui tarbitakse, tuleb suurendada teenuste kogust, mis neid tarbivad