Prowid Photos məşhur bloqun seçkisinə düşdü. Cümə günü axşam yük on dəfə artdı: adət etdiyimiz pikdə 350 RPS əvəzinə — 3 500. Yeganə server 100% CPU-ya dirəndi, səhifələr səkkiz saniyəyə açılır, sonra isə 502 xətaları başlayır. Nə etməli? İki yol var: serveri gücləndirmək və ya daha çox server əlavə etmək. Seçim təkcə hostinq hesabına yox, həm də tətbiqi necə yazmaq lazım olduğuna təsir edir. Bu dərsdə bir serverin hədlərini, vertikal və horizontal miqyaslamanı, koda əsas tələbi — stateless — və avtomatik miqyaslamanı araşdıracağıq.
Bir server və onun hədləri
İstənilən server resurslardan birinə dirənir: CPU, yaddaş, disk, şəbəkə və ya verilənlər bazası ilə bağlantıların sayı. Node.js prosesi JavaScript-i bir axında icra edir, buna görə bir proses prosessorun bir nüvəsindən istifadə edir (bütün nüvələrdən necə istifadə etmək «Miqyaslanma: cluster modulu və stateless tətbiqlər» dərsindədir).
Təhlükə ondadır ki, server tədricən sınmır. Növbənin sadələşdirilmiş modeli deyir: cavab müddəti ≈ emal müddəti ÷ (1 − yüklənmə). 50% yüklənmədə sorğu boş serverdəkindən iki dəfə uzun çəkir, 80%-də 5 dəfə, 90%-də 10 dəfə, 95%-də 20 dəfə. Real rəqəmlər fərqlənir, amma «xokkey çubuğu» həqiqidir — buna görə serverləri 60–70%-dən çox yükləmirlər.
💡 Miqyaslamazdan əvvəl ölçün və darboğazı tapın (
top,docker stats, metriklər). Çox vaxt verilənlər bazasına indeks və ya keş əlavə etmək server almaqdan ucuz başa gəlir.
Vertikal və horizontal miqyaslama
Vertikal miqyaslama (scale up) — bir serveri gücləndirmək deməkdir: daha çox nüvə, yaddaş, daha sürətli disk. Sadədir və kodu dəyişmək lazım deyil. Amma metodun tavanı var: buludun verdiyi ən böyük maşın məhduddur (yüzlərlə nüvə və terabaytlarla yaddaş), qiymət isə gücdən daha sürətli artır. Üstəlik server yenə tək qalır — o çökərsə, bütün sayt çökür — maşının ölçüsü dəyişəndə isə adətən onu yenidən işə salırlar.
Horizontal miqyaslama (scale out) — yanına daha çox server qoyub sorğuları onların arasında bölmək deməkdir (balanslaşdırıcıya növbəti dərs həsr olunub). Tavan demək olar ki, yoxdur, bir serveri itirmək fəlakət deyil, yükü tədricən artırmaq olar. Qiyməti mürəkkəblikdir: balanslaşdırıcı, diqqətli deploy, monitorinq lazımdır, tətbiq isə stateless olmalıdır.
| Vertikal (scale up) | Horizontal (scale out) | |
|---|---|---|
| Nə edirik | bir server daha güclü | daha çox server |
| Tavan | var: ən böyük maşın | demək olar ki, yoxdur |
| Server sıradan çıxır | hər şey dayanır | digərləri işləməyə davam edir |
| Tətbiq kodu | dəyişmir | stateless olmalıdır |
| Mürəkkəblik | aşağı | yuxarı: balanslaşdırıcı, deploy, vəziyyət |