Siz Prowid Photos tətbiqini yazmısınız — insanların foto yerləşdirdiyi və bir-birini izlədiyi tətbiq. Noutbukda və on tanışla hər şey «uçur». Bəs hər gün bir milyon nəfər gələndə nə olacaq? Bir server kifayət edəcəkmi və cümə günü axşam sıradan çıxsa nə baş verəcək? Sistem dizaynı belə suallara onlar qəzaya çevrilməmişdən əvvəl cavab vermək bacarığıdır. Bu dərsdə tələbləri rəqəmlərlə yazmağı öyrənəcək, gecikmə, ötürmə qabiliyyəti və əlçatanlığın «doqquzları» ilə tanış olacaq və «salfetin üzərində» hesablamağı mənimsəyəcəyik.
Sistem dizaynı nədir
Sistem dizaynı — sistemin hissələrini (müştəri, API, verilənlər bazası, keş, növbə, fayl yaddaşı), onların bir-biri ilə necə ünsiyyət quracağını seçmək və bir suala cavab verməkdir: yük artanda əvvəlcə nə sıradan çıxacaq. Burada ideal həllər yoxdur, güzəştlər (trade-offs) var: daha sürətli, yoxsa daha ucuz; daha sadə, yoxsa daha etibarlı.
Bənzətmə — mətbəx. Dörd nəfərlik ailənin mətbəxi ilə 500 yerlik restoranın mətbəxi fərqli layihələndirilir, amma əvvəlcə neçə qonağın gələcəyini və nə yeyəcəklərini bilmək lazımdır. Buna görə istənilən sistemin təhlili dörd addımda gedir:
- Tələblər — sistem nə etməlidir və nə dərəcədə yaxşı.
- Qiymətləndirmələr — neçə sorğu, nə qədər verilənlər və trafik gözləyirik.
- Komponentlər — sistemi nədən yığırıq və hissələr necə bağlıdır.
- Darboğazlar — əvvəlcə nə «tavana dirənəcək» və bunu necə miqyaslamaq olar.
Bu dərs 1-ci və 2-ci addımlara, modulun qalan hissəsi isə 3-cü və 4-cü addımlara həsr olunub.
Addım 1. Tələblər: nə edirik və nə dərəcədə yaxşı
Funksional tələblər sistemin nə edə biləcəyini təsvir edir: foto yükləmək, istifadəçini izləmək, bəyənmək, lentə baxmaq. Qeyri-funksional tələblər isə bunu nə dərəcədə yaxşı etdiyini göstərir: lent nə qədər tez açılır, servis ildə neçə saat əlçatmaz ola bilər, neçə istifadəçiyə tab gətirir, şəkillər itə bilərmi. Arxitekturanı məhz onlar müəyyən edir: «foto yüklə» funksiyasını həftə sonu yazmaq olar, amma «fotonu itməyəcək şəkildə, bir milyon istifadəçi və 99,9% əlçatanlıqla yüklə» aylarla işdir.
Yeni başlayanların tipik səhvi qeyri-funksional tələbləri sözlərlə ifadə etməkdir: «sürətli», «etibarlı», «çox istifadəçi üçün». Belə tələbi nə yoxlamaq, nə də ona görə layihələndirmək olar. Hər sözü rəqəmə çevirin:
// Prowid Photos: requirements as numbers, not wishes
const functional = [
'upload a photo',
'follow other users',
'like and comment',
'open a feed of the people I follow',
];
const nonFunctional = {
feedLatencyP95Ms: 300, // 95% of feed requests are faster than this
availabilityPercent: 99.9, // about 8.8 hours of downtime per year
dau: 1_000_000, // daily active users
peakRps: 350, // the busiest second of the day
feedFreshnessSeconds: 10, // a new photo shows up within 10 s
photosAreNeverLost: true, // durability matters more than speed
};İlk kod sətrindən əvvəl sifarişçiyə (və ya özünüzə) verməli olduğunuz suallar: