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