Serversiz eng yaxshi amaliyotlar

Jamiyat ichida biz ko'p yillardan beri eng yaxshi tajribalarni muhokama qilib kelmoqdamiz, ammo o'sha vaqtning aksariyatida nisbatan qabul qilingan bir necha bor.

Ushbu amaliyotlarga obuna bo'lgan serversiz amaliyotchilarning aksariyati miqyosda ishlaydi. Serversiz bo'lish va'dasi nisbatan past darajada emas, balki yuqori va katta hajmdagi yuklamalarda amalga oshiriladi, shuning uchun bu eng yaxshi amaliyotlarning ko'pi masshtab burchagidan kelib chiqadi. Chakana savdoda Nordstrom va IoT-da iRobot. Agar siz bu masofani o'lchashni mo'ljallamasangiz, ehtimol siz ushbu ilg'or tajribalarga amal qilmasdan qochib ketishingiz mumkin.

Shuni esda tutingki, eng yaxshi amaliyotlar "yagona amaliyot" emas. Eng yaxshi amaliyotlar asosiy taxminlar to'plamiga tayanadi. Agar ushbu taxminlar sizning foydalanish holatingizga mos kelmasa, unda bu eng yaxshi tajribalar sizga mos kelmasligi mumkin.

Mening asosiy taxminim shundaki, har kim o'z dasturini keng miqyosda ishlashi uchun qurmoqda (hatto u hech qachon miqyosda ishlamasa ham).

Shunday qilib, bu mening eng yaxshi amaliyotim.

Har bir funktsiya faqat bitta narsani bajarishi kerak

Bu funktsiyaning xatosi va miqyosni izolyatsiya qilish haqida.

Boshqacha qilib aytganda, agar siz o'z funktsiyangizda kommutatsiya bayonotidan foydalansangiz, ehtimol siz buni noto'g'ri qilyapsiz.

Ko'plab o'quv qo'llanmalar va ramkalar bitta proksi yo'nalishining orqasida joylashgan katta monolit funktsiya asosida ishlaydi va kommutator bayonotlaridan foydalanadi. Menga bu shakl yoqmadi. U yaxshi o'lchamaydi va katta va murakkab funktsiyalarni bajarishga moyildir.

Butun dasturingizni ishlaydigan bitta / bir nechta funktsiyalar bilan bog'liq muammo shundaki, siz o'lchovni aniqlaganingizda, ma'lum bir elementni emas, balki butun ilovangizni miqyosiga o'tkazasiz.

Agar sizning veb-ilovangizning bir qismi 1 million qo'ng'iroqni qabul qilsa va boshqasi esa 1 mingta qo'ng'iroqni qabul qilsa, sizning funktsiyatingizni millionga optimallashtirishingiz kerak, shu bilan birga minglar uchun kodlar. Bu behuda narsa, va mingga osonlikcha optimallashtirish mumkin emas. Ularni ajratib oling. Bu juda katta ahamiyatga ega.

Vazifalar boshqa funktsiyalarni chaqirmaydi

Boshqa funktsiyalarni chaqiradigan funktsiyalar anti-naqshdir.

Bu yaroqli naqsh mavjud bo'lgan juda kam sonli holatlar mavjud, ammo ular osonlikcha buzilmaydi.

Asosan, buni qilmang. Siz shunchaki o'z narxingizni ikki baravar oshirasiz va disk raskadrovka qilishni yanada murakkablashtirasiz va funktsiyalaringiz izolyatsiyasining qiymatini olib tashlaysiz.

Vazifalar ma'lumotni ma'lumot omboriga yoki navbatga yo'naltirishi kerak, agar ko'proq ish kerak bo'lsa, boshqa funktsiyani ishga tushirish kerak.

Funktsiyalaringizda imkon qadar oz kutubxonalardan foydalaning (yaxshisi nol)

Bu menga ravshan ko'rinadi.

Funktsiyalar sovuq boshlanadi (funktsiya birinchi marta ishga tushirilganda) va iliq boshlanadi (ishga tushirildi va issiq hovuzdan bajarishga tayyor). Sovuq boshlanishiga bir qator narsalar ta'sir qiladi, lekin ZIP-fayl hajmi (yoki kod yuklangan bo'lsa ham) uning bir qismidir. Shuningdek, tezlashtirilishi kerak bo'lgan kutubxonalar soni.

Qancha ko'p kod bo'lsa, sovuq ishga tushirish sekinroq bo'ladi.

Shoshilinch talab qiladigan kutubxonalar soni qancha ko'p bo'lsa, sovuq ishga tushirish shunchalik sekinlashadi.

Misol tariqasida, Java ba'zi platformalarda iliq boshlanganda ajoyib ijrochi til. Ammo agar siz ko'plab kutubxonalardan foydalansangiz, sovuq boshlanishiga bir necha soniya kerak bo'lganda topishingiz mumkin. Siz deyarli ularga muhtoj emassiz va sovuq ishga tushirish nafaqat ishga tushirishda, balki miqyosda ham xalaqit beradi.

Yana bir nuqta, men faqat kerak bo'lganda kutubxonalardan foydalanadigan va hech narsa bilan boshlanmaydigan va hech kim bilan tugamaydigan vositalarni ishlatmasdan ishonaman.

Ekspres kabi narsalar serverlar uchun yaratilgan va serversiz ilovalar undagi barcha elementlarga kerak emas. Xo'sh, nima uchun barcha kodlar va bog'liqliklarni kiritish kerak? Nima uchun ortiqcha kodni olib kelish kerak? Bu shunchaki hech qachon ishlamaydigan narsa emas, balki bu xavfsizlikka xavf tug'dirishi mumkin.

Buning eng yaxshi amaliyoti uchun juda ko'p sabablar bor. Albatta, agar siz sinab ko'rgan, bilgan va ishongan kutubxona bo'lsa, uni mutlaqo kiriting, ammo u erda asosiy element bu kodni sinab ko'rish, bilish va unga ishonishdir. Qo'llanmaga amal qilish - bu bir xil narsa emas.

Masalan, ulanish asosidagi xizmatlardan foydalanishdan saqlaning. RDBMS

Faqat kerak bo'lmaguncha.

Bu meni eng qiyin ahvolga soladi. Ko'pgina veb-ilovalar "lekin biz RDBMS biz bilamiz" bandiga o'tishadi.

Bu RDBMS haqida emas. Bu ulanishlar haqida.

Serverless ulanish bilan emas, balki xizmatlar bilan yaxshi ishlaydi.

Xizmatlar haqiqatan ham tez so'rovlarga javoblarni qaytarishga va xizmat orqasida joylashgan ma'lumotlar sathining murakkabligini boshqarishga mo'ljallangan. Bu serversiz bo'shliqda juda katta ahamiyatga ega va nima uchun DynamoDB kabi narsa serversiz paradigma ichida juda mos keladi.

Rostini aytganda, serversiz odamlar RDBMSga qarshi emaslar, ular ulanishlarga qarshi. Ulanish vaqt talab etadi va agar siz funktsiyani kattalashtirishini tasavvur qilsangiz, har bir funktsiya muhiti ulanishni talab qiladi va siz ikkala funktsiyani ham ishga tushirishingiz va kirish / chiqish funktsiyalarini sovuq boshlanishini kutmoqdasiz. Buning keragi yo'q.

Shunday qilib, agar siz RDBMS-dan foydalanishingiz kerak bo'lsa, lekin o'rtada aloqani birlashtirishga xizmat qiladigan xizmatni qo'ysangiz, ehtimol bu qandaydir tavsifga ega avtomatik masshtabli idish, bu juda yaxshi bo'lar edi.

Bu erda qilish kerak bo'lgan eng katta nuqta shundaki, serversiz arxitektura ma'lumot qatlamini qayta ko'rib chiqishni talab qilishi mumkin. Bu serversiz aybi emas. Agar siz mavjud ma'lumotlar qatlamini o'ylab qayta ishlatishga harakat qilsangiz va u ishlamasa, demak serversiz arxitekturani tushunmaslik kerak.

Yo'nalishga bitta vazifa (agar HTTP foydalanayotgan bo'lsa)

Iloji bo'lsa, bitta funktsiyali proksi-serverdan foydalanishdan saqlaning. Bu juda yaxshi hajmga ega emas va muammolarni ajratishga yordam bermaydi. Siz bundan qochishingiz mumkin bo'lgan holatlar mavjud, masalan. bu erda bir qator yo'nalishlarning funktsional imkoniyatlari faqat bitta jadvalga bog'langan va boshqa dasturlardan juda uzilib qolgan, ammo bu men ishlagan ko'pgina dasturlarda eng yaxshi holat.

Bu menejment nuqtai nazaridan murakkablikni oshiradi, ammo bu sizning arizangizni o'lchashda xatolar va muammolarni izolyatsiyalash nuqtai nazaridan haqiqatan ham yordam beradi. Davom etishni xohlaganingizdek boshlang.

Shunday bo'lsa-da, siz hamma narsani boshqarish uchun qandaydir konfiguratsiyani boshqarish vositasidan foydalandingizmi? Siz allaqachon CI va CD vositalarini to'g'ri ishlatganmisiz? Siz hali ham serverless bilan DevOps qilishingiz kerak.

Xabarlar va navbatlardan foydalanishni o'rganing (async FTW)

Dastur asenkron bo'lsa, serversiz ilovalar yaxshi ishlashga moyil. Bu veb-ilovalar uchun to'g'ridan-to'g'ri oldinga siljish emas, chunki ular so'rovlarga javob berish va ko'plab so'rovlarni bajarish kerak.

Boshqa funktsiyalarni chaqirmaydigan funktsiyalarga qaytsak, siz funktsiyalarni shu tarzda zanjirlashingiz kerakligini ta'kidlash muhimdir. Navbat zanjirli stsenariyda navbatni o'chirgich sifatida ishlaydi, agar biron bir funktsiya ishlamasa, ishlamay qolganligi sababli zaxiraga qo'yilgan navbatni osongina to'kib tashlashingiz yoki o'lik xat navbatida bo'lmagan xabarlarni surishingiz mumkin.

Asosan, taqsimlangan tizimlarning qanday ishlashini bilib oling.

Serversiz orqa tomoni bo'lgan mijoz ilovalarida CQRSga murojaat qilish eng yaxshi usuldir. Ma'lumotni kiritish nuqtasidan ma'lumotlarni olish nuqtasini ajratish ushbu turdagi naqsh uchun muhimdir.

Ma'lumotlar ko'llari emas, balki ma'lumotlar oqimi

Serversiz tizimda ma'lumotlaringiz sizning tizimingiz orqali oqadi. U ma'lumot ko'lida yakunlanishi mumkin, ammo sizning serversiz tizimingizda u qandaydir oqimda bo'lishi ehtimoli. Shunday qilib, har qanday vaqtda dam olish holatida emas, balki barcha harakatlarda harakat qiling.

Bu har doim ham mumkin emas, lekin serversiz muhitda ma'lumotlar ko'lidan so'rov o'tkazmaslikka harakat qiling.

Serverless sizdan ma'lumot qatlamini qayta ko'rib chiqishni talab qiladi. Bu serversizlarga yangi kelgan odamlar bilan eng katta yutuq, ular RDBMSga etib borishga moyil bo'lib, nafaqat masshtab ularni tortib olganligi sababli, balki ularning ma'lumotlar tuzilmalari juda qattiq bo'lib qolishadi.

Ilovangiz o'zgarganda va miqyosingiz hammasi o'zgarganda sizning oqimlaringiz o'zgarishini topasiz. Agar qilishingiz kerak bo'lgan narsa oqimni boshqa tomonga yo'naltirish kerak bo'lsa. Ko'lni to'g'onlash ancha qiyin.

Men bu fikrni boshqalarga qaraganda biroz ko'proq "tashqarida" ekanligini bilaman, lekin bu to'g'ri qilish kerak emas.

Faqat masshtabni kodlash xato, uni qanday o'lchash kerakligini o'ylab ko'rishingiz kerak

Sizning birinchi serversiz ilovangizni yaratish va uning hajmini tomosha qilish juda oson. Agar siz nima qilganingizni tushunmasangiz, osongina har qanday avtomatik avtoulov echimi bilan tuzoqqa tushishingiz mumkin.

Agar siz o'zingizning arizangizni va uning ko'lami qanday bo'lishini hisobga olmasangiz, unda siz muammolarni o'zingiz hal qilasiz. Agar siz asta-sekin sovuq ishga tushadigan biror narsa qilsangiz (masalan, ko'plab kutubxonalar va RDBMS-dan foydalansangiz) va undan foydalanish tezligini oshirsangiz, siz o'zingizning funktsiyangizning moslashuvchanligini sezilarli darajada oshirib, keyin ulanishlaringizni kengaytirishingiz va dasturingizni sekinlashtirishingiz mumkin. pastga.

Shunday qilib, dasturni shunchaki ichiga tashlab qo'ymang va u yuk ostida ishlayotganini tasavvur qiling. O'zingizning arizangizni yuk ostida tushunish hali ham ishning bir qismidir.

Xulosa

Bu erda ko'proq narsalarni qo'yishim mumkin edi va men odamlar bilan suhbatlashganda ko'proq tushuntirishim kerak bo'lgan narsalar haqida bu mening fikrim.

Men sizning arizangizni qanday rejalashtirish kerakligi yoki qanday qilib dasturiy xarajatlarni qoplashni ko'rib chiqish kerakligi haqida aytib o'tmadim.

Boshqa odamlarning fikrlarini eshitish uchun orziqib kutamiz. Men RDBMS haqida noto'g'ri fikrda ekanligimni aytadigan odamlar toshqini paydo bo'lishiga aminman. Konteynerlarda bo'lgani kabi, men RDBMS-ni yomon ko'rmayman, lekin to'g'ri ish uchun kerakli vositalardan foydalanishni yaxshi ko'raman. Asboblaringizni biling!