System Design - 1chi qism.

Salom. Men dasturchiman va o’zimning loyiham ustida ish olib boryapman. Loyiham hozircha juda ham oddiy va umuman foydalanuvchilarga ega emas. Shuning uchun ham hozircha hamma narsalarni (application va database) bitta serverda saqlayapman. Sistemaning ko’rinishi tahminan quyidagicha:

simple-system.drawio.png

Yani, qadamma qadam tushuntiradigan bo’lsam:

  1. Foydalanuvchi o’z browserida yoki telefonida loyiham adresini kiritadi (masalan, api.mysite.com)
  2. DNS server esa shu domain adresga tegishli IP adresni qaytarib jo’natadi.
  3. Shu IP adresda ishlab turgan Web Serverga request yuboriladi.
  4. U web server esa javob tariqasida HTML (yoki JSON) jo’natadi.

Foydalanuvchilar ko’paya boshladi - Level 1

Foydalanuvchilarning soni ortgan sari ham application ham database uchun bitta server kamlik qilyapti. Ularda bitta umumiy resurs bo’lgani uchun bir biriga halaqit qilishyapti. Shuning uchun databaseni alohida serverga olib chiqib o’tdim:

system-with-separate-db.drawio.png

Database uchun men PostgreSQLni tanladim. Chunki men aqlliman va 40 yildan beri zo’r ishlab kelayotgan relational databaseni tanlayman. Maqtanish uchun MongoDB yoki DynamoDB kabi NoSQL databaselardan foydalanmayman. Chunki ular menga hali kerak bo’ladimi yo’qmi bilmayman. Boshimni og’ritib nima qilaman, to’g’rimi?

Foydalanuvchilar yanada ko’paymoqda - Level 2

Foydalanuvchilar ko’paymoqda va men ishlatayotgan serverlarning kuchi yetmay qolyapti. CPU va RAM deyarli to’laligicha ishlatiladi bazida. Shuning uchun ham nimadir qilishim kerak.

Vertical scaling qilsam bo’ladi. Yani bor serverlarimni kuchaytirishim mumkin - qo’shimcha CPU va RAM qo’shishim mumkin ularga. Bu eng oddiy va qandaydir darajada ish beradigan yo’l.

Lekin bu usulning o’z kamchiliklari bor:

Shuning uchun ham horizontal scaling qilganim yaxshi. Yani web serverlarimning sonini ko’paytirganim yaxshi (masalan 1tadan 3taga). Lekin bunda bir muammo bor. Oldinlari foydalanuvchilar bitta serverga IP address orqali to’g’ridan to’g’ri bog’lanishar edi. Endi, agar web serverlar soni bir nechta bo’ladigan bo’lsa foydalanuvchilar qaysi biriga bog’lanishni qanday bilishadi?