![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Bizning muhandislik kareramiz davomida har kuni, har lahzada biz turli xil murakkablikdagi turli xil muammolarga duch kelamiz va ma'lumotlar etishmasligi tufayli qaror qabul qilishimiz yoki uni kechiktirishimiz kerak bo'lgan vaziyatlarga duch kelamiz. Biz har doim yangi xizmatlarni qurganimizda, infratuzilmani qurganimizda yoki hatto rivojlanish jarayonlarini shakllantirganimizda, biz turli xil muammolardan iborat ulkan dunyoga duch kelamiz.
Barcha muammolarni sanab o'tish juda qiyin va hatto imkonsizdir. Agar siz ma'lum bir joyda ishlasangiz, ushbu muammolarning ba'zilariga duch kelasiz. Boshqa tomondan, biz qanday hal qilishni hammamiz tushunishimiz kerak bo'lgan ko'p narsalar mavjud, chunki ular IT tizimlarini yaratish uchun juda muhimdir. Yuqori ehtimollik bilan siz ularni barcha loyihalarda uchratasiz.
Ushbu maqolada men dasturiy ta'minot dasturlarini yaratishda duch kelgan ba'zi muammolar haqida o'z tajribam bilan o'rtoqlashaman.
Agar biz Vikipediyaga qarasak, quyidagi ta'rifni topamiz
Aspektga yo'naltirilgan dasturiy ta'minotni ishlab chiqishda, o'zaro bog'liqlik - bu bir nechta modullarga ta'sir qiladigan dasturning aspektlari bo'lib, ularning hech birida qamrab olish imkoniyati mavjud emas. Ushbu tashvishlarni ko'pincha loyihalashda ham, amalga oshirishda ham tizimning qolgan qismidan aniq ajratib bo'lmaydi va tarqalish (kodning takrorlanishi), chalkashlik (tizimlar orasidagi sezilarli bog'liqlik) yoki ikkalasiga olib kelishi mumkin.
Bu nima ekanligini juda yaxshi tasvirlaydi, lekin men uni biroz kengaytirmoqchiman va soddalashtirmoqchiman:
O'zaro bog'liqlik ko'plab boshqa qismlarga ta'sir qiladigan (yoki "kesadigan") tizim/tashkilotning kontseptsiyasi yoki tarkibiy qismidir.
Bunday tashvishlarning eng yaxshi namunalari - tizim arxitekturasi, jurnallar, xavfsizlik, tranzaktsiyalarni boshqarish, telemetriya, ma'lumotlar bazasi dizayni va boshqalar. Biz ularning ko'plari haqida keyinroq ushbu maqolada batafsil to'xtalamiz.
Kod darajasida o'zaro bog'liq muammolar ko'pincha Aspektga Yo'naltirilgan Dasturlash (AOP) kabi usullardan foydalangan holda amalga oshiriladi, bunda bu tashvishlar dastur davomida qo'llanilishi mumkin bo'lgan alohida komponentlarga modullashtirilgan. Bu biznes mantig'ini ushbu tashvishlardan ajratib turadi, bu esa kodni o'qilishi va barqarorligini ta'minlaydi.
Aspektlarni doira, o'lcham, funksionallik, ahamiyat, maqsad va boshqalar kabi turli xil xususiyatlarga ega bo'lish orqali tasniflashning ko'plab mumkin bo'lgan usullari mavjud, ammo bu maqolada men oddiy qamrov tasnifidan foydalanmoqchiman. Bu bilan men ushbu o'ziga xos jihat qayerga yo'naltirilganligini nazarda tutyapman, xoh u butun tashkilotmi, ma'lum bir tizimmi yoki ushbu tizimning o'ziga xos elementi.
Shunday qilib, men aspektlarni Makro va Mikro ga ajratmoqchiman.
Ibratli jihat deganda men asosan butun tizim uchun biz kuzatadigan fikrlarni nazarda tutyapman, masalan, tanlangan tizim arxitekturasi va uning dizayni (monolitik, mikroservislar, xizmatga yo'naltirilgan arxitektura), texnologiya stacki, tashkiliy tuzilma va boshqalar. Makro jihatlar asosan strategik va yuqori darajaga bog'liq. qarorlar.
Ayni paytda, Mikro jihat kod darajasi va rivojlanishiga ancha yaqinroq. Masalan, ma'lumotlar bazasi bilan o'zaro ishlash uchun qaysi ramka ishlatiladi, papkalar va sinflarning loyiha tuzilishi yoki hatto ob'ektni loyihalashning aniq naqshlari.
Ushbu tasnif ideal bo'lmasa-da, u mumkin bo'lgan muammolar va biz ularga qo'llaniladigan yechimlarning ahamiyati va ta'sirini tushunishga yordam beradi.
Ushbu maqolada mening asosiy e'tiborim makro jihatlarga qaratiladi.
Men dasturiy ta'minot arxitekturasini o'rganishni boshlaganimda, Konvey qonuni va uning tashkiliy tuzilishga ta'siri haqida ko'plab qiziqarli maqolalarni o'qidim. Ayniqsa , bu . Demak, ushbu qonunda shunday deyilgan
Tizimni loyihalashtirgan har qanday tashkilot (keng ma'noda) strukturasi tashkilotning aloqa tuzilmasi nusxasi bo'lgan dizaynni ishlab chiqaradi.
Men har doim bu kontseptsiya haqiqatan ham juda universal va Oltin qoidani ifodalaydi, deb ishonganman.
Keyin men Erik Evansning tizimlarni modellashtirish uchun domenga asoslangan dizayn (DDD) yondashuvini o'rganishni boshladim. Erik Evans chegaralangan kontekstni identifikatsiya qilish muhimligini ta'kidlaydi. Ushbu kontseptsiya murakkab domen modelini har biri o'zining cheklangan bilim to'plamiga ega bo'lgan kichikroq, boshqariladigan bo'limlarga bo'lishni o'z ichiga oladi. Ushbu yondashuv samarali jamoaviy muloqotga yordam beradi, chunki u butun domen bo'yicha keng ko'lamli bilimga bo'lgan ehtiyojni kamaytiradi va kontekstni almashtirishni minimallashtiradi, shu bilan suhbatni yanada samarali qiladi. Kontekstni almashtirish - bu eng yomon va eng ko'p resurslarni sarflaydigan narsa. Hatto kompyuterlar ham u bilan kurashmoqda. Garchi kontekstni almashtirishning to'liq yo'qligiga erishish dargumon bo'lsa-da, men bunga intilishimiz kerak deb o'ylayman.
Konvey qonuniga qaytsak, men u bilan bir nechta muammolarni topdim.
Tizim dizayni tashkiliy tuzilmani aks ettirishini ko'rsatadigan Konvey qonuni bilan duch kelgan birinchi masala - bu murakkab va keng qamrovli chegaralangan kontekstlarni shakllantirish potentsiali. Ushbu murakkablik tashkiliy tuzilma domen chegaralariga mos kelmaganda yuzaga keladi, bu esa o'zaro bog'liq bo'lgan va ma'lumotlar bilan to'ldirilgan Chegaralangan kontekstlarga olib keladi. Bu rivojlanish guruhi uchun tez-tez kontekstni almashtirishga olib keladi.
Yana bir muammo shundaki, tashkilot terminologiyasi kod darajasiga oqib chiqadi. Tashkiliy tuzilmalar o'zgarganda, u qimmatli resurslarni iste'mol qiladigan kodlar bazasini o'zgartirishni talab qiladi.
Shunday qilib, teskari Konvey manevriga rioya qilish kerakli dasturiy ta'minot arxitekturasini rag'batlantiradigan tizim va tashkilotni yaratishga yordam beradi. Ammo shuni ta'kidlash joizki, bu yondashuv allaqachon shakllangan arxitektura va tuzilmalarda unchalik yaxshi ishlamaydi, chunki bu bosqichdagi o'zgarishlar uzoq davom etadi, lekin ular har qanday o'zgarishlarni tezda kiritishlari sababli startaplarda juda yaxshi ishlaydi.
Ushbu naqsh yoki "anti-naqsh" hech qanday arxitekturasiz tizimni qurishga yordam beradi. Muqarrar ravishda o'sib borayotgan murakkablikni nazorat qilish bo'yicha hech qanday qoidalar, chegaralar va strategiya yo'q. Murakkablik dasturiy ta'minot tizimlarini yaratish yo'lidagi eng dahshatli dushmandir.
Bunday turdagi tizimni yaratmaslik uchun biz aniq qoidalar va cheklovlarga rioya qilishimiz kerak.
Dasturiy ta'minot arxitekturasi uchun ko'plab ta'riflar mavjud. Menga ularning ko'plari yoqadi, chunki ular uning turli tomonlarini qamrab oladi. Biroq, arxitektura haqida mulohaza yuritish uchun biz tabiiy ravishda ularning ba'zilarini ongimizda shakllantirishimiz kerak. Shunisi e'tiborga loyiqki, bu ta'rif rivojlanishi mumkin. Shunday qilib, hech bo'lmaganda hozircha men o'zim uchun quyidagi tavsifga egaman.
Dasturiy ta'minot arxitekturasi - bu har kuni qabul qilinadigan tizimga ta'sir qiladigan qarorlar va tanlovlar haqida.
Qarorlarni qabul qilish uchun siz o'zingizning "sumkangiz" tamoyillari va paydo bo'ladigan muammolarni hal qilish naqshlariga ega bo'lishingiz kerak, shuningdek, talablarni tushunish biznesga kerak bo'lgan narsalarni yaratish uchun kalit ekanligini ta'kidlash kerak. Biroq, ba'zida talablar shaffof emas yoki hatto aniqlanmagan, bu holda ko'proq tushuntirishni kutish yoki tajribangizga tayanish va sezgiingizga ishonish yaxshiroqdir. Ammo baribir, agar sizda tayanadigan printsiplar va naqshlar bo'lmasa, to'g'ri qaror qabul qila olmaysiz. Aynan shu erda men dasturiy ta'minot arxitekturasi uslubining ta'rifiga kelyapman.
Dasturiy ta'minot arxitekturasi uslubi - bu dasturiy ta'minotni qanday yaratishni belgilaydigan printsiplar va naqshlar to'plami.
Rejalashtirilgan arxitekturaning turli tomonlariga qaratilgan juda ko'p turli xil me'moriy uslublar mavjud va ularning bir nechtasini bir vaqtning o'zida qo'llash odatiy holdir.
Masalan, masalan:
Monolitik arxitektura
Domenga asoslangan dizayn
Komponentga asoslangan
Mikroservislar
Quvurlar va filtrlar
Tadbirga asoslangan
Mikroyadro
Xizmatga yo'naltirilgan
va hokazo…
Albatta, ularning afzalliklari va kamchiliklari bor, lekin men bilib olgan eng muhim narsa shundaki, arxitektura dolzarb muammolarga qarab asta-sekin rivojlanadi. Monolit arxitekturadan boshlash operatsion murakkablikni kamaytirish uchun ajoyib tanlovdir, ehtimol bu arxitektura mahsulotni yaratishning Product-market Fit (PMI) bosqichidan keyin ham sizning ehtiyojlaringizga mos keladi. Keng miqyosda siz mustaqil joylashtirish, heterojen texnologik stek muhiti va kamroq bog'langan arxitekturaga erishish uchun hodisalarga asoslangan yondashuv va mikroservislarga o'tishni ko'rib chiqishingiz mumkin (va bu orada hodisaga asoslangan va pub-sub yondashuvlarining tabiati tufayli kamroq shaffof bo'lsa, bular qabul qilingan). Oddiylik va samaradorlik yaqin va bir-biriga katta ta'sir ko'rsatadi. Odatda, murakkab arxitektura yangi xususiyatlarning rivojlanish tezligiga ta'sir qiladi, mavjudlarini qo'llab-quvvatlaydi va qo'llab-quvvatlaydi va tizimning tabiiy evolyutsiyasini qiyinlashtiradi.
Biroq, murakkab tizimlar ko'pincha murakkab va keng qamrovli arxitekturani talab qiladi, bu muqarrar.
To'g'risi, bu juda keng mavzu va tabiiy evolyutsiya tizimlarini qanday tuzish va qurish haqida juda ko'p ajoyib g'oyalar mavjud. O'z tajribamga asoslanib, men quyidagi yondashuvni ishlab chiqdim:
Bundan tashqari, DAU (kunlik faol foydalanuvchilar), MAU (oylik faol foydalanuvchilar), RPC (sekundiga so'rov) va TPC (sekundiga tranzaktsiya) kabi raqamlar va ko'rsatkichlarni tushunish juda muhimdir, chunki bu sizga tanlov qilishda yordam berishi mumkin, chunki arxitektura 100 faol foydalanuvchi va 100 million faol foydalanuvchi farq qiladi.
Yakuniy eslatma sifatida shuni aytmoqchimanki, arxitektura mahsulot muvaffaqiyatiga sezilarli ta'sir ko'rsatadi. Masshtablashda mahsulotlar uchun noto‘g‘ri ishlab chiqilgan arxitektura talab qilinadi, bu esa muvaffaqiyatsizlikka olib kelishi mumkin, chunki mijozlar tizimni o‘lchashni kutishmaydi, ular raqobatchini tanlashadi, shuning uchun biz potentsial masshtabdan oldinda bo‘lishimiz kerak. Garchi men tan olsam ham, ba'zida bu oddiy yondashuv bo'lishi mumkin emas, lekin g'oya kengaytiriladigan, ammo hali miqyosli bo'lmagan tizimga ega bo'lishdir. Boshqa tomondan, mijozlari bo'lmagan juda murakkab va allaqachon miqyosli tizimga ega bo'lish yoki ularning ko'pchiligini olishni rejalashtirmaslik sizning biznesingizga behuda pul sarflaydi.
Texnologiyalar to'plamini tanlash ham so'l darajadagi qarordir, chunki u yollash, tizimning tabiiy evolyutsiyasi istiqbollari, kengaytirilishi va tizimning ishlashiga ta'sir qiladi.
Bu texnologiya to'plamini tanlashda asosiy fikrlar ro'yxati:
Bir nechta texnologiya to'plamlariga ega bo'lish biznes o'sishiga qanday ta'sir qilishi mumkin?
Bir nuqtai nazardan, yana bitta stekni joriy qilish sizning yollash hajmini oshirishi mumkin, ammo boshqa tomondan, bu qo'shimcha texnik xarajatlarni keltirib chiqaradi, chunki siz ikkala stekni ham qo'llab-quvvatlashingiz kerak. Shunday qilib, yuqorida aytib o'tganimdek, mening nuqtai nazarimga ko'ra, ko'proq texnologiya to'plamlarini kiritish uchun faqat qo'shimcha ehtiyojlar dalil bo'lishi kerak.
Lekin muayyan muammo uchun eng yaxshi vositani tanlash printsipi haqida nima deyish mumkin?
Ba'zan sizda yuqorida aytib o'tilgan fikrlarga asoslanib, muayyan muammoni hal qilish uchun yangi vositalarni olib kelishdan boshqa tanlovingiz yo'q, bunday hollarda eng yaxshi echimni tanlash mantiqan.
Muayyan texnologiyaga yuqori darajada bog'lanmagan tizimlarni yaratish qiyin bo'lishi mumkin. Shunday bo'lsa-da, tizim texnologiyaga chambarchas bog'lanmagan va ertaga ma'lum bir ramka yoki vosita zaif bo'lib qolsa yoki hatto eskirib qolsa, u o'lmaydi.
Yana bir muhim masala ochiq manba va xususiy dasturiy ta'minotga bog'liqlik bilan bog'liq. Xususiy dasturiy ta'minot sizga kamroq moslashuvchanlikni va moslashtirish imkoniyatini beradi. Shunday bo'lsa-da, eng xavfli omil - bu sotuvchini blokirovka qilish, bu erda siz sotuvchining mahsulotlari, narxlari, shartlari va yo'l xaritasiga qaram bo'lib qolasiz. Agar sotuvchi yo'nalishini o'zgartirsa, narxlarni oshirsa yoki mahsulotni to'xtatsa, bu xavfli bo'lishi mumkin. Ochiq kodli dasturiy ta'minot bu xavfni kamaytiradi, chunki bitta tashkilot uni nazorat qilmaydi. Barcha darajadagi yagona nosozlik nuqtasini bartaraf etish o'sish uchun ishonchli tizimlarni yaratishning kalitidir.
Bitta nosozlik nuqtasi (SPOF) tizimning har qanday qismiga ishora qiladi, agar u muvaffaqiyatsiz bo'lsa, butun tizim ishlamay qolishiga olib keladi. Barcha darajadagi SPOFlarni yo'q qilish yuqori mavjudlikni talab qiladigan har qanday tizim uchun juda muhimdir. Hamma narsa, jumladan, bilim, xodimlar, tizim komponentlari, bulutli provayderlar va internet kabellari muvaffaqiyatsiz bo'lishi mumkin.
Bitta nosozlik nuqtalarini bartaraf etish uchun bir nechta asosiy usullarni qo'llashimiz mumkin:
Ushbu maqolada biz bir nechta asosiy makro jihatlarni va ularning murakkabligi bilan qanday kurashishimiz mumkinligini ko'rib chiqdik.
O'qiganingiz uchun tashakkur! Keyingi safar ko'rishguncha!