Prowid Photos böyüyür: iki developer əvəzinə artıq altı nəfərdir, planda isə otuz. Zəngdə kimsə deyir: «Gəlin mikroservislərə keçək — Netflix və Amazon belə edir». İnandırıcı səslənir, amma dürüst cavab «asılıdır»dır. Bu dərsdə tətbiqi yığmağın üç üsulunu — monolit, modul monolit və mikroservisləri, hər birinin nə verdiyini və nəyə başa gəldiyini, dayanmadan necə miqrasiya etməyi və Prowid Photos üçün nəyi seçməyi öyrənəcəyik.
Monolit: bütöv tətbiq
Monolit — bütövlükdə yerləşdirilən (deploy) bir tətbiqdir: bir proses, bir repozitori, adətən bir verilənlər bazası. İndi Prowid Photos API-si məhz belədir: users, photos, feed, follows və notifications bölmələri olan bir Express tətbiqi.
Start üçün əla seçimdir:
- İşə salmaq və yerləşdirmək asandır: bir əmr, bir Docker image.
- Çağırış — funksiya çağırışıdır: nanosaniyələr çəkir (birinci dərsdəki gecikmə pilləkəni) və şəbəkədə «itə» bilməz.
- Bir baza — bir tranzaksiya: foto yükləmək və sayğacı artırmaq ya birlikdə baş verir, ya heç baş vermir.
- Debug və test asandır: bir çağırış stek-i, bir log, ucuzdur.
// the monolith: both tables live in one database, so one transaction is enough
const client = await pool.connect();
try {
await client.query('BEGIN');
await client.query(
'INSERT INTO photos (id, user_id, url) VALUES ($1, $2, $3)',
[photoId, userId, url],
);
await client.query(
'UPDATE users SET photos_count = photos_count + 1 WHERE id = $1',
[userId],
);
await client.query('COMMIT'); // both changes happen, or neither
} catch (err) {
await client.query('ROLLBACK');
throw err;
} finally {
client.release();
}Problemlər böyüdükcə gəlir. Kod «böyük çamur topasına» (big ball of mud) çevrilir: hər şey hər şeyi import edir və bildirişlərdə düzəliş lenti sındırır. İstənilən kiçik dəyişiklik bütün tətbiqi yenidən yerləşdirməyi və yenidən test etməyi tələb edir. Yalnız bir hissə yüklənsə də, miqyaslamaq yalnız bütövlükdə mümkündür. Komandalar bir repozitoridə bir-birinin ayağına dolaşır.
Modul monolit: evin içində divarlar
Bir ev təsəvvür edin. Monolitdə hamının birlikdə yaşadığı bir nəhəng otaq var. Modul monolitdə eyni divarlar var, amma içəridə qapılı otaqlar da var. Tətbiq yenə bir proses və bir deploy olaraq qalır, amma kod biznes sahələri üzrə sərt qaydalarla modullara bölünür:
- modulun açıq API-si var — bir neçə funksiya və hadisə ixrac edən bir
index.tsfaylı; qalan hər şey içəridə gizlidir; - digər modullar yalnız açıq API-ni import edir, içindəki fayllara toxunmur;
- modulun öz cədvəlləri (sxemi) var və o, başqasının cədvəllərini
JOINilə oxumur; - modullar funksiya çağırışları və ya proses daxilində hadisələrlə ünsiyyət qurur.
src/modules/
photos/
index.ts <- the public API: the ONLY file others import
photos.service.ts
photos.repository.ts
users/
feed/
notifications/