</>
  • Bosh sahifa
  • Men haqimda
  • Ko'nikmalar
  • Tajriba
  • Case Studies
  • Maqolalar
  • Loyihalar
madrimov.uz

Keling, jiddiy
tizim quramiz

madrimov5014@gmail.com→
</>© 2026 Madrimov Xudoshukur
GitHubTelegramEmail
← Maqolalar
16-iyun, 2026

NestJS + Prisma'dan Bun + Hono + Drizzle'ga: nima uchun o'tdim

BackendArxitekturaBunHonoNestJSDrizzlePrisma

Uzoq vaqt Node.js + NestJS + Prisma mening asosiy stack'im edi. Bu kombinatsiya bilan tezda ishlay olasan — hamma narsa joyida: DI konteyner, modullar, dekoratorlar, guard'lar, pipe'lar, ustiga tip-xavfsiz ORM. Lekin oxirgi loyihalarimdan birida shu "hamma narsa joyida" degan tuyg'u aynan to'siqqa aylandi. Bu maqolada nima uchun Bun + Hono + Drizzle'ga o'tganimni, qaysi muammolar meni bunga undaganini va raqamlarda farq qanaqaligini yozaman.

NestJS'ning kuchli tomoni — bu ayni paytda zaif tomoni

NestJS to'liq framework. Strukturasi oldindan belgilangan, ko'p narsa tayyor holda keladi. Sen faqat biznes-logikani o'ylasang kifoya — qolganini framework hal qiladi. Boshlang'ich bosqichda bu juda qulay.

Muammo shundaki, "qolganini framework hal qiladi" degani — podkapotda nima bo'layotganini bilmaysan. Ko'p dasturchilar bunga avtomatik o'rganib qoladi: dekoratorni qo'yasan, ishlaydi, davom etasan. Kichik va o'rta loyihalarda bu hech qanaqa muammo emas. Ammo loyiha kattalashganda, performance uchun nostandart arxitektura kerak bo'lganda — bu noaniqlik to'g'ridan-to'g'ri og'riqqa aylanadi.

MNazorat loyihasidagi real muammo

MNazorat loyihasini NestJS'da qurganman. Performance'ni ko'tarish maqsadida uni multi-core (har bir yadro uchun alohida instance) sifatida qurganmiz. Mana shu yerda eng katta qiyinchilik boshlandi — ayniqsa event-driven arxitektura bilan.

Muammoning mohiyati: multi-core rejimda Node.js har bir NestJS instance uchun alohida event emitter yaratadi. Ya'ni bir instance chiqargan event boshqa instance'larga yetib bormaydi. Natijada o'rtada ba'zi eventlar yo'qolib ketadi. Bitta jarayonda mukammal ishlagan kod, multi-core'ga o'tganda jim-jit buzila boshlaydi.

Buning oldini olish uchun esa qo'shimcha, aslida kerak bo'lmagan logika yozishga majbur bo'lasan: eventlarni instance'lar orasida sinxronlash, yo'qolganlarini qaytadan jo'natish va hokazo. Bu esa qo'shimcha resurs va qo'shimcha vaqt degani.

To'g'ri, boshqa yechimlar ham bor. Masalan, Redis'ga asoslangan drayverlar — BullMQ kabi. BullMQ aslida navbatlar (queue) uchun mo'ljallangan va o'sha vazifada zo'r ishlaydi. Lekin kerak bo'lganda uni cron job uchun ham, event-driven arxitektura uchun ham bemalol ishlatsa bo'ladi. In-memory event emitter o'rniga markazlashgan Redis backbone — eventlar yo'qolmaydi.

Lekin bu yerda asosiy savol turadi: bu boshog'riqlar nima uchun?

Hammasi performance uchun

Javob oddiy — bu yechimlarning hammasi server tezroq ishlashi, ko'proq so'rovni qayta ishlashi uchun kerak. Bir so'z bilan: performance uchun.

Va aynan shu yerda menda savol tug'ildi: agar men bunchalik kuch sarflab, qo'shimcha infratuzilma qurib, faqat performance'ni quvib yurgan bo'lsam — balki muammo arxitekturada emas, asosiy poydevordadir? Node.js + NestJS + Prisma'ning o'zi shu performance'ni berishga qiynalayotgan bo'lsa-chi?

Bun + Hono: ko'p narsani podkapot o'zi qiladi

Bun + Hono'ga o'tganimda eng birinchi sezganim shu bo'ldi: performance, so'rovlarni qayta ishlash tezligi — Node.js + NestJS bilan solishtirganda podkapot o'zidan o'zi tez va qulay. Men avval qo'lda qurishga majbur bo'lgan optimizatsiyalarning ko'pi bu yerda runtime darajasida hal qilingan.

Bun JavaScriptCore engine'ga (V8 emas) asoslangan va Bun.serve HTTP serveri Node.js'ning node:http modulidan tubdan tezroq. Hono esa — minimalist, runtime-agnostic router. Ikkisi birga eng tez kombinatsiyalardan biri.

Hono'ning kamchiligi: bu framework emas

Halol bo'laylik. NestJS'dan kelgan dasturchi uchun Hono'ning eng noqulay joyi — bu framework emas, oddiy kutubxona. Ya'ni NestJS'dagi tayyor strukturani kutsang, topa olmaysan. Ko'p narsani qo'lda yozishga to'g'ri keladi: papka strukturasi, DI, modul tashkili — bularning hammasi senga havola qilingan.

Lekin bu medalning ikkinchi tomoni ham bor: Hono klassik Express-like ko'rinadi. Eski, Express bilan ishlagan dasturchilar uchun bu hech qanaqa qiyinchilik tug'dirmaydi — aksincha, tanish va shaffof. Sen har bir middleware qaerda turganini, so'rov qaysi yo'l bilan o'tayotganini aniq bilasan. Hech qanaqa "sehr" yo'q.

Hono'ning kuchli tomonlari

Bun + Hono'ni shunchaki tezligi uchun tanlamadim. Bir qancha amaliy narsalar bor:

  • Native validatsiya. Hono'da @hono/zod-validator kabi to'g'ridan-to'g'ri integratsiya bor. So'rov body, query, param — hammasini Zod sxemasi bilan tekshirib, tip-xavfsiz (type-safe) holda handler'ga uzatasan. NestJS'da bu uchun pipe + DTO + class-validator zanjiri kerak edi.
  • RPC va tip-xavfsizlik. Hono'ning RPC rejimi orqali server route'laridan klient uchun avtomatik tiplar chiqaradi. Frontend va backend orasida shartnoma (contract) bir manbadan keladi.
  • Web standartlariga asoslangan. Hono Request/Response Web API'larida ishlaydi. Shu sababli u Bun, Deno, Cloudflare Workers, Node.js — hammasida ishlaydi. Bitta kod, ko'p runtime.
  • Bun'ning all-in-one tabiati. Test runner, bundler, package manager, .env o'qish, TypeScript'ni to'g'ridan-to'g'ri ishga tushirish — hammasi qutidan chiqadi. ts-node, nodemon, alohida bundler kerak emas.

ORM masalasi: Prisma vs Drizzle

Stack haqida gapirganda eng ko'p e'tibordan chetda qoladigan, lekin amalda eng katta ta'sir qiladigan qism — bu ORM. Chunki real loyihada bottleneck ko'pincha HTTP layer'da emas, aynan ma'lumotlar bazasi bilan ishlash qatlamida bo'ladi.

Prisma: qulay, lekin og'ir

Prisma'ni yaxshi ko'rardim — sxemasi tushunarli, migratsiyalari qulay, tip-xavfsizligi a'lo, Prisma Studio bonus. Developer experience nuqtai nazaridan u haligacha eng yaxshilaridan biri.

Lekin Prisma'ning tarixiy kamchiligi — uning arxitekturasi og'ir edi. Yaqin vaqtgacha Prisma so'rovlarni alohida Rust query engine orqali bajarardi. Ya'ni sening Node jarayoningdan tashqarida yana bitta binary ishlab turardi: u qo'shimcha latency qo'shardi, bundle hajmini shishirardi va serverless (Lambda) muhitida cold start'ni sezilarli sekinlashtirardi. Aynan shu engine ko'p loyihalarda yashirin bottleneck bo'lib turardi.

Halollik uchun: bu 2025-yil oxirida o'zgardi. Prisma 7 (2025-yil 19-noyabr) Rust engine'ni butunlay tashlab, sof TypeScript klientga o'tdi — bundle 90% ga yaqin kichraydi (1.6 MB atrofida), query latency'si oldingi versiyaga nisbatan 3 barobar yaxshilandi. Ya'ni eng katta tanqid endi qisman tarixga aylandi. Lekin men o'tgan paytdagi Prisma aynan o'sha og'ir engine'li versiya edi.

Drizzle: ortiqcha qatlamsiz

Drizzle butunlay boshqa falsafada qurilgan. U hech qanaqa query engine ishlatmaydi — sening yozgan kodingdan to'g'ridan-to'g'ri SQL string generatsiya qiladi va shu. Orada hech qanday qo'shimcha runtime, hech qanaqa binary yo'q. Natijada:

  • Raw overhead kamroq. ORM qatlami minimal bo'lgani uchun har bir so'rovga qo'shiladigan ortiqcha vaqt deyarli yo'q.
  • Cold start tezroq. Engine yuklash kerak emas — serverless'da Drizzle Prisma'dan sezilarli tez ko'tariladi.
  • SQL'ga yaqin. Drizzle "SQL-like" — agar SQL bilsang, deyarli aynan SQL yozasan, faqat tip-xavfsiz. Murakkab join'larda u bitta optimallashgan SQL statement generatsiya qiladi va N+1 muammosiga tushib qolmaydi.
  • Kamchiligi: aynan shu "qo'lga yaqinligi" boshlovchi uchun qiyinroq. Prisma'dagi sodda, deklarativ DX o'rniga sen SQL mantig'ini o'zing tushunishing kerak. Migratsiya tooling'i ham Prisma'niki kabi yetuk emas (yaxshilanmoqda, lekin hali ham farq bor).

Halol xulosa ORM bo'yicha

Mening holatimda Drizzle to'g'ri tanlov bo'ldi: ortiqcha engine yo'q, cold start tez, SQL ustidan to'liq nazorat. Bu Bun + Hono'ning "shaffoflik va kam sehr" falsafasiga mukammal mos keldi.

Lekin halol bo'lay: Prisma 7'dan keyin bu farq oldingidek katta emas. Murakkab join'lar va serverless cold start'da Drizzle hamon ustun, ammo oddiy so'rovlarda ikkalasi orasidagi farq endi bir necha millisekund. Va unutmang — aksariyat ilovalarda ma'lumotlar bazasi round-trip'i (odatda 5–50 ms) umumiy vaqtni baribir egallaydi, ORM qaysi bo'lishidan qat'i nazar. ORM tanlovini faqat tezlik emas, balki nazorat va loyihangiz murakkabligiga qarab qiling.

Raqamlarda taqqoslash

Endi eng qizig'i — raqamlar. Quyidagilar ochiq benchmarklardan (sintetik, "salom dunyo" darajasidagi HTTP testlar):

  • `node:http` vs `Bun.serve` (Bun 1.0 e'loni): Node 65,000 req/s atrofida, Bun 183,000 req/s atrofida — taxminan 2.8x.
  • Yangiroq Linux x64 o'lchovi (Node v23.6 vs Bun v1.2): Node 19,000 req/s atrofida, Bun 59,000 req/s atrofida — taxminan 3x.
  • Hono: Node vs Bun (framework benchmark): Node 27,000 req/s atrofida, Bun 64,000 req/s atrofida.

Framework darajasida: Hono Express'dan taxminan 3–4 barobar ko'proq so'rovni eplaydi va 40% ga yaqin kamroq xotira ishlatadi. Bun.serve esa Node ekotizimidagi eng tez framework — Fastify 5'dan 2.8x, Express 5'dan 4.7x tezroq.

ORM tomonida: murakkab join'larda Drizzle N+1 muammosiga tushib qolgan ORM'larga nisbatan 14x gacha kam latency ko'rsatishi mumkin. Cold start'da Drizzle 20–50 ms ulanish, 50–100 ms birinchi so'rov; Prisma 7 esa 40–80 ms engine yuklash, 80–150 ms birinchi so'rov — ya'ni Prisma endi Drizzle bilan bir ligada, lekin baribir orqada.

Halol ogohlantirish: real loyihada farq kichrayadi

Bu raqamlarga oshiqib bog'lanib qolmang. Sintetik benchmark bilan real loyiha — ikki xil narsa. Express-uslubidagi sof HTTP testda Bun 52,000 req/s atrofida, Node 13,000 req/s atrofida bergan (taxminan 4x farq). Lekin routing + validatsiya + ma'lumotlar bazasi bo'lgan real URL-shortener loyihasida farq Bun 12,400 req/s, Node 12,000 req/s — ya'ni 3% dan kamga tushib qolgan.

Buning sababi oddiy: real loyihada bottleneck ko'pincha runtime emas, ma'lumotlar bazasi, tarmoq, I/O. Bun runtime tez bo'lsa ham, so'rov DB javobini kutib turgan bo'lsa — bu tezlikning ko'p qismi ko'rinmay qoladi. Aynan shuning uchun ORM tanlovi (Prisma'ning og'ir engine'i vs Drizzle'ning yengilligi) ko'pincha runtime tanlovidan ham muhimroq bo'ladi.

Xulosa

Men NestJS yoki Prisma'ni yomon deb aytmoqchi emasman — ikkalasi ham zo'r vosita, ayniqsa katta jamoa va strukturani majburlamoqchi bo'lganingda. Lekin mening holatimda — performance kerak bo'lgan, nostandart arxitektura qurish kerak bo'lgan loyihada — bu abstraktsiyalar yordam o'rniga to'siqqa aylandi. Men podkapotda nima bo'layotganini bilishim va boshqarishim kerak edi.

Bun + Hono + Drizzle menga aynan shuni berdi: shaffoflik, tezlik va kamroq sehr. Sintetik raqamlar ham ortda, lekin men uchun asosiysi raqam emas — nazorat. Endi har bir middleware, har bir route, har bir SQL so'rov qaerda va qanaqa ishlayotganini aniq bilaman. Va agar qo'shimcha logika yozsam — bu framework cheklovini aylanib o'tish uchun emas, o'z biznesim uchun bo'ladi.

Agar siz NestJS + Prisma'da qulay ishlayotgan bo'lsangiz — o'tishga shoshilmang, ayniqsa Prisma 7'dan keyin. Lekin agar siz ham performance uchun kurashayotgan, abstraktsiyaga qarshi turayotgan bo'lsangiz — Bun + Hono + Drizzle'ga bir nazar tashlashga arziydi.