QO‘LLANMA · 11 DAQIQA O‘QISH
Vaybkoder lug'ati, birinchi qism
«Rate limit qo'sh», «.env ga chiqar», «tranzaksiyaga o'ra». Neyronka bu so'zlarni xuddi sen bilasan deb tashlaydi. Bu yerda ulardan 18 tasi: har biri nimani anglatadi va u bo'lmasa nima bilan to'laysan.
CI/CD
Har bir tuzatish o'zi yig'iladigan, testlardan o'tadigan va faqat shundan keyin serverga ketadigan amaliyot. Sen kodni yuborasan, qolgani sensiz bo'ladi: yig'ish, tiplarni tekshirish, testlar, chiqarish. Tekshiruvdan o'tmadi — demak, serverga bormadi.
Usiz xato haqida qo'llab-quvvatlashga yozgan befarq bo'lmagan foydalanuvchilardan bilasan. Neyronka bir joyni tuzatib, qo'shnisiga tegib ketadi. Bu odatiy hol, va buni faqat har bir tuzatishda testlarni yurgizish ushlaydi.
Tekshiruv tuzatish bilan server o'rtasida turadi. Butun farq shunda.
Rate limit
Server bitta manzil yoki kalitdan ma'lum vaqt oralig'ida nechta so'rov qabul qilishi. Me'yordan oshgani 429 kodi bilan rad etiladi. Me'yor kirish, to'lov va SMS'ga kod yuborish uchun alohida qo'yiladi: har joyda so'rovning narxi o'zgacha.
Limitsiz bitta mijoz quvvatni o'ziga oladi, qolganlar kutadi. Parollarni terib topish uchun eshik ham shu yerda: daqiqasiga 10 000 ta kirish urinishi ularni hech kim sanamaguncha hech narsa turmaydi.
Me'yor o'tkaziladi, ortig'i 429 rad javobiga tiraladi.
Cron
Kodni jadval bo'yicha ishga tushirish. Oddiy kod kimdir bosganda ishlaydi; cron o'zi ishlaydi: tungi soat 3 da, har seshanba, oyning birinchi kuni. Jadval beshta maydon bilan yoziladi: daqiqa, soat, kun, oy, hafta kuni.
Obuna pulini yechish, eslatmalar yuborish, yetkazib beruvchidan narxlarni olish, kechagi savdolarni hisobotga yig'ish. Bularning hammasi bosadigan odam yo'q paytda kerak. Vazifa bir vaqtda ikkita serverdan ishga tushmasligini tekshir: bir oyda ikki marta yechib olinganini odam payqaydi.
«0 3 * * *» — har kecha soat 3:00 da. Bosadigan odam yo'q, jadval ishga tushiradi.
Indekslar
Kitob oxiridagi alifbo ko'rsatkichi, faqat baza uchun. Sen unga aytasan: tovar nomi bo'yicha alohida saralangan ro'yxat tut. Qidiruv shu ro'yxat bo'yicha boradi, keyin to'g'ridan-to'g'ri kerakli qatorga.
Indekssiz qidiruv barcha yozuvlarni ketma-ket o'qiydi: 300 ta tovarda bu sezilmaydi, 300 000 tasida ekran soniyalab qotadi, va baza hamma uchun sekinlashadi, hech narsa qidirmaganlar uchun ham. Har bir ustunga indeks qo'yish ham zarar: u joy egallaydi va yozishni sekinlashtiradi.
Indekssiz — 300 000 yozuvni ketma-ket o'qiydi. Indeks bilan — ko'rsatkich bo'yicha birdaniga kerakli qatorga sakraydi.
Migratsiyalar
Baza tuzilishi qadamma-qadam o'zgaradi, va har bir qadam kod yonida fayl bo'lib yotadi: ustun qo'shish, jadval nomini o'zgartirish, indeks yaratish. Fayllar raqamlar bo'yicha boradi, baza qaysi biriga yetganini eslab qoladi, yangi serverda esa ularni noldan takrorlaydi.
Ularsiz neyronka jangovar bazani to'g'ridan-to'g'ri tahrirlaydi, va bundan yaxshi narsa chiqmaydi. Noto'g'ri qadam faqat orqaga qaytarish yozilgan joyda bekor qilinadi: o'chirilgan ustun ma'lumotlari bilan birga qaytib kelmaydi.
Qadamlar tartib bilan boradi: 001, 002, 003 — har biriga bitta fayl. Orqaga faqat qaytarish yozilgan joyda qaytiladi.
Tranzaksiya
Bitta deb hisoblanadigan bir nechta amal. Pulni yechish va kirishni ochish: ikkalasi ham yoki hech biri. Baza ularni birga ushlab turadi va birdaniga tasdiqlaydi.
Tranzaksiyasiz o'rtacha holat paydo bo'ladi. Jarayon ikki so'rov orasida o'lib qoldi: pul ketdi, kirish yo'q, buyurtma esa to'langanday ko'rinadi. Testlar buni ushlamaydi, u bir oydan keyin pul to'lagan odamning xati bilan chiqadi.
Ramka ichida o'rtacha holat bo'lmaydi: ikkala qadam ham ishladi yoki hech biri.
Kesh
Og'ir natija saqlab qo'yiladi va keyingisiga tayyor holda beriladi. Narxlar, qoldiqlar va chegirmalardan iborat katalog keshsiz har bir tashrif buyuruvchi uchun qaytadan yig'iladi. Kesh bilan bir marta hisoblading, mingtasiga berding.
Eskirgan ma'lumot bilan to'laysan: sen narxni o'zgartirding, tashrif buyuruvchi esa yana 10 daqiqa eskisini ko'radi. Shuning uchun keshga yashash muddati beriladi va tovar tahrirlanganda u tozalanadi.
Birinchi so'rov qaytadan hisoblaydi — 800 ms. Keyingilari tayyor javob oladi — 4 ms.
.env
Kalitlar va parollar yozilgan fayl: u kod yonida yotadi va repozitoriyga ketmaydi. Kod undan qiymatlarni nomi bo'yicha o'qiydi, qiymatlarning o'zi esa har bir serverda o'zgacha: sening kompyuteringda kassaning test kaliti, jangovar serverda — jangovari.
Neyronka sirni to'g'ridan-to'g'ri faylga yozib, commit qilishni yaxshi ko'radi. Shundan keyin kalit gitda yotadi, va bu endi kalit emas: tarixni tozalash uni qutqarmaydi, faqat yangisini chiqarish yordam beradi.
Kalit kod yonida yotadi va repozitoriyga ketmaydi. Kod ichidagi kalit gitga ketadi va kalit bo'lmay qoladi.
Parol xeshi
Bazadagi parol orqaga qaytarib bo'lmaydigan satrga aylantirilgan holda yotadi. Kirishda kiritilgan parolni xuddi shu usulda aylantirasan va satrlarni solishtirasan.
Neyronka aynan nima bilan xeshlashini so'ra: bcrypt va argon2 yaraydi, md5 va sha1 videokartada terib topish bilan bir necha soatda ochiladi. Yonida tuz bo'lishi kerak: har bir parolga qo'shimcha, uning tufayli ikkita bir xil parol har xil satr beradi.
Bir tomonlama yo'l: bazadan parollarni chiqarib bo'lmaydi. Baza sizib chiqsa ham, parollar bermaydi.
CORS
Brauzerning qoidasi: sening API'ingni qaysi saytdan chaqirish mumkin. Server «menga shu manzillardan mumkin» degan sarlavha bilan javob beradi, brauzer solishtiradi va so'rovni o'tkazadi.
Neyronka buni o'chirgich bilan tuzatadi: hammaga ruxsat beradi va davom etadi. Prodda o'chirilgan CORS — bu teshik: u orqali sening API'ingni senga kirib bo'lgan odamning brauzeridan begona sahifa chaqiradi.
To'siqni brauzer ushlab turadi: o'z saytingga ochiq, begonasiga yo'q. «Hammaga ruxsat» to'siqni ikkala tomondan ham olib tashlaydi.
Webhook
Nimadir sodir bo'lganda o'zlari senga taqillatadi: to'lov o'tdi, obuna uzildi, posilka jo'natildi. Sen begona servisga manzil berasan, u unga hodisa tavsifi bilan so'rov yuboradi.
Usiz sen har daqiqa «xo'sh, bo'ldimi?» deb so'rab turasan. Webhook jim, pul bor, sening bazangda esa sukunat. Shuning uchun yonida doim solishtirish tutiladi: har 10 daqiqada kassadan to'lanmay osilib turgan buyurtmalar haqida so'rash.
So'rab turish bo'sh savollar beradi, webhook bir marta, ish bilan keladi.
Idempotentlik
So'rovning xususiyati: uni hatto 5 marta takrorla, natija bitta qoladi. Bu kalitga tayanadi: servis o'sha kalitni ko'radi va yangi operatsiya o'rniga birinchi urinish natijasini qaytaradi.
Kalitsiz ikkinchi bosish pulni ikkinchi marta yechadi. Holat odatiy: aloqa uzildi, odam yana bosdi, kassa webhook'ni uch marta takrorladi. Xuddi shu usul ichkarida ham kerak: «to'langan» belgisi qancha xabar kelmasin, bir marta qo'yiladi.
Barcha urinishlar uchun bitta kalit — yechib olish bitta qoladi.
Taymaut
Hammasi o'ldi deb hisoblashdan oldin javobni qancha kutish. Tashqariga har bir chiqishga qo'yiladi: bazaga, kassaga, begona API'ga.
Juda kattasi workerlarni osib qo'yadi: ulanishlar band, yangi so'rovlar navbatda turadi, bitta sekin qo'shni tufayli butun sayt yotadi. Juda kichigi tirik so'rovlarda yolg'on xatolar sochadi. Neyronka yo abadiyat, yo nol qo'yadi.
Shkalaning ikkala chekkasi o'zicha uradi: chapda yolg'on xatolar, o'ngda abadiy osilgan workerlar. Ishchi o'rta tor.
Navbat
Vazifa qatorga turadi va keyinroq bajariladi: xat, rasm o'lchamini o'zgartirish, hisobot, tarqatma. So'rov uni navbatga qo'yadi va odamga darhol javob beradi, qatorni esa alohida jarayon ajratadi.
Navbatsiz bitta og'ir so'rov o'sha soniyada vkladka ochgan hammaga saytni yiqitadi. Yiqilgan vazifa bilan nima qilishni alohida kelishib ol: necha marta qaytarish, qanday pauza bilan va bir marta ham o'tmaganini qayerga qo'yish.
Bosish darhol javob beradi, ish esa bittadan ajratiladi.
Loglar
Server nima qilgani haqidagi yozuvlar: vaqt, hodisa, xato. Sen uxlab yotganingda, odam esa to'lay olmaganda tunda nima bo'lganini bilishning yagona yo'li.
Logga aynan nima va nima bilan yiqilganini yozishni so'ra: buyurtma raqami, javob kodi, qadam nomi. Va u yerga kalitlar va parollar ketmasligini kuzat. Logga tushgan parol sizib chiqqan hisoblanadi: xosting jurnali orqaga qarab tozalanmaydi.
03:00:01 to'lov yaratildi. 03:00:04 webhook qabul qilindi. 03:00:04 kirish berilmadi: tier ustuni yo'q. Uchinchi qator — loglar aynan shuning uchun yuritiladi.
Staging
Prodning nusxasi, u yerda birinchi navbatda buziladi: o'sha kod, bazaning o'sha tuzilishi, o'z ma'lumotlari va o'z kalitlari. Tuzatish u yerga boradi, sen ko'z bilan qaraysan, va faqat shundan keyin jangovar serverga.
Neyronka to'g'ridan-to'g'ri jangovar serverga chiqarishni yaxshi ko'radi. Keyin tirik odamlarda tuzatasan. Staging'da kassaning test kalitlari turganini kuzat: u yerda jangovar kalitlar har bir tekshiruvda haqiqiy yechib olish degani.
Ikkita bir xil muhit, xatoning narxi har xil. Staging'siz birinchi tekshiruv xaridorlarda o'tadi.
Bekap
Bazaning jadval bo'yicha olingan va serverdan alohida yotgan nusxasi. Alohida — bu majburiy shart: o'sha diskdagi nusxa u bilan birga o'ladi.
Nusxani orqaga tiklab, u ochilishini tekshirganingdan keyin bu bekapga aylanadi. Bu tekshiruvgacha sening qo'lingda nusxa deb o'ylaganing fayllar papkasi bor, xolos.
Nusxa orqaga tiklangan paytda bekapga aylanadi.
Tokenlar
Neyronka uzunlikni sanaydigan matn bo'laklari: so'z, so'zning bir qismi, tinish belgisi. Rus tilida bir tokenga 2–3 belgi to'g'ri keladi. Pul ham ular bo'yicha hisoblanadi: sen yuborganing uchun ham, u javob bergani uchun ham.
Kontekst oynasi tugadi — u chatning boshini unutadi: o'chirilganini qaytaradi, bir soat oldin kelishilganini qayta yozadi. Belgisi darhol ko'rinadi: javoblar siljidi — demak, yangi chat ochish va kelishuvlarni qoidalar fayliga qo'yish vaqti keldi.
Oyna tugadi — chatning boshi sening vazifang bilan birga siqib chiqariladi.
Oxirida
Neyronka bularning hammasi senda allaqachon turibdi deb hisoblaydi. «.env ga chiqaraymi?» degan savolga «ha» deding — u kodni o'zgaruvchilar serverda yaratilgandek yozadi. U ularni u yerga qo'ymagan. Nima tayyor, nima sening zimmangda — so'ra.
Ikkinchi qismda bularning hammasi turganida paydo bo'ladiganlari: docker, revers-proksi, healthcheck, rollback, CDN va vebsoketlar.