NodeJS: ishlab chiqarish uchun eng yaxshi amaliyotlar

Bu NodeJ-larni ishlab chiqish va o'rnatish uchun eng muhim amaliyotlarni jalb qilishga urinishdir.

Men ushbu texnologiya ustida bir muncha vaqt ishladim. Men uning ulkan salohiyati va rivojlanish jarayonida o'z o'rnini sezaman. Python va Golang kabi tillarning qattiq raqobati bilan NodeJS tegishli foydalanish holatlarida o'zining foydali ekanligini isbotladi.

Men eng yaxshi amaliyotlarni o'rganishdan oldin, men mikroservis tuzilishi nima ekanligini qisqacha tanishtirmoqchiman. Keyin suhbatni o'sha erdan olib chiqing.

Xo'sh, mikroservislar nima?

Mikroservis arxitekturasi deb nomlanuvchi - bu arxitektura uslubi bo'lib, ilova quyidagi xizmatlar to'plami sifatida tuziladi:

  • Yuqori darajada saqlanadigan va sinovdan o'tkaziladigan
  • Bo'shashgan holda bog'langan
  • Mustaqil ravishda joylashtirilishi mumkin
  • Biznes imkoniyatlari atrofida uyushgan.

Mikroservis arxitekturasi katta, murakkab dasturlarni uzluksiz etkazib berish / joylashtirishga imkon beradi. Shuningdek, bu tashkilotga texnologiya stakasini rivojlantirishga imkon beradi.

Sizga mikroservislarga ehtiyoj borligini qanday hal qilish kerak

Dastlab, siz MVP-da ishlay boshlaganingizda, siz mikroservislardan foydalanishingizga hojat qolmasligi mumkin. Y-o'qini kattalashtirish hozir sizning kun tartibingiz bo'lmasligi mumkin. Ammo mahsulot kamolotga erishishni boshlaganda va ba'zan miqyoslash bilan shug'ullanish kerak bo'lgan joyda juda erta bo'lganda, funktsional modullarda parchalanish yanada mazmunli bo'ladi, chunki biznesning o'zi buzilib ketadi. Bu mikroservislar arxitekturasi naqshini o'rganishni boshlash uchun eng to'g'ri nuqta bo'ladi.

Kris Richardsonning kitobini juda tavsiya qilaman: http://bit.ly/2EmJDYt.

Yaqin-yaqingacha Docker singari konteynerizatsiya echimlari DevOps dunyosini boshqarishni boshlagan paytgacha juda oddiy bo'lgan monolit dasturni almashtirishda mikroservislar ko'proq e'tiborga olinadi. Ammo keyinroq bu haqida ko'proq.

Agar domen boshqariladigan dizayni (DDD) haqida gapirmasdan davom etsam, bu adolatsizlik bo'ladi. Bu sizning mahsulotingizni funktsional modullarga ajratish uchun juda mashhur strategiya. Shuning uchun mikroservislarni yaratish juda foydali.

Shunday qilib, DDD bo'yicha domen nima?

Siz hal qilmoqchi bo'lgan har bir muammo - bu domen.

Har bir domen o'zaro chegaralangan kontekstlarga bo'linadi. Ushbu kontekstlar bu muammoning alohida sohalaridan boshqa narsa emas.

Mikroservisda har bir chegaralangan kontekst mikroservis bilan bog'liqdir. DDD naqshlari domendagi murakkablikni tushunishga yordam beradi. Har bir cheklangan kontekst uchun domen modeli uchun siz identifikatorni aniqlaysiz
ob'ektlar, qiymat ob'ektlari va domeningizni modellashtiradigan agregatlar.

Dasturiy ta'minotingizning murakkabligiga qarab siz DDD tamoyillarini tanlashingiz yoki sodda yondashuvni amalga oshirishingiz mumkin.

Maqsad juda uyg'un va yumshoq tarzda bog'langan domen modeliga erishish. Buning uchun quyidagi yondashuvni bajaring:

Bu DDD haqida qisqacha kirish edi. Bu haqda ko'proq bilish uchun men Erik Evansning ajoyib kitobini o'qishni tavsiya qilaman: http://bit.ly/2Eoy17l.

Davom etmoq.

Umid qilamanki, siz men bilan yurasiz.

Shu sababli, bundan buyon men NodeJS-ga xos bo'lgan amaliyotlar haqida ko'proq gaplashaman. Aytmoqchimanki, mikroservislar va DDD sizga NodeJS-ning haqiqiy imkoniyatlarini aniqlashda yordam beradi. O'zida to'liq. Qanday? Ko'ramiz.

NodeJs-dan foydalanishda qaysi dizayn naqshini ishlatish

Dizayn naqshlari, bir qator ishlab chiqaruvchilarga ma'lum bo'lgan ma'lum standartlardan foydalangan holda dasturiy ta'minotni loyihalash haqida.

Biz foydalanishimiz mumkin bo'lgan turli xil dizayn naqshlari mavjud. Repozitoriya naqsh deb ataladigan naqsh haqida allaqachon bilgan ishlab chiquvchilarni tanishtirmoqchiman va / yoki qayta ishlab chiqmoqchiman.

Ushbu naqsh MVC mantig'ini ajratishni osonlashtiradi, shu bilan birga modelni aniqlash va qolgan mantiq bilan modelning o'zaro ta'sirini osonlashtiradi.

U quyidagilardan iborat:

  1. Nazoratchi: Bu faqat so'rov va javob va tegishli atributlarni ko'rib chiqadi. Bu har qanday biznes mantig'i yoki model ta'rifi yoki model assotsiatsiyasiga ega bo'lmaydi. (papka nomi: boshqaruvchilar)
  2. Xizmat: Unda sizning mikroservisingiz uchun biznes mantig'i mavjud. Tekshirish tekshiruvchidan xizmatga o'tadi. Nazoratchi va uning xizmati o'rtasidagi 1: 1 munosabatlar va 1: xizmat va omborxona o'rtasidagi ko'plab munosabatlar. (papka nomi: xizmatlar)
  3. Repozitoriya: Model papkasida joylashgan modellar bilan o'zaro ta'sir qiladi. Model qatlami orqali ma'lumotlar bazasiga har qanday so'rov bu erda hosil bo'ladi. Bu hech qanday biznes mantig'iga ega bo'lmaydi. (papka nomi: omborxonalar)
  4. Model: Unda model ta'rifi, assotsiatsiyalar, virtual funktsiyalar mavjud (masalan, mongoose-da)
  5. Yordamchi dasturlar: Bu xizmat sifatida ishlatilishi mumkin bo'lgan yordamchi sinflar / funktsiyalarni o'z ichiga oladi. Masalan: Redis bilan o'zaro ishlash uchun zarur bo'lgan barcha funktsiyalarga ega bo'lgan Redis yordam dasturi. (papka nomi: yordamchi dasturlar)
  6. Sinov summasi: Bunga maksimal kod qamrovini ta'minlash uchun kontroller usuliga qarshi blok sinovlari kiradi. (papka nomi: spetsifikatsiya)

Qo'shimcha ma'lumot uchun ushbu havolaga murojaat qilishingiz mumkin: http://bit.ly/2TrSyRS

OK, menga klaster modullari haqida aytib bering

Node.js-ning bitta nusxasi bitta oqimda ishlaydi. Ko'p yadroli tizimlardan foydalanish uchun foydalanuvchi ba'zida yuklarni boshqarish uchun Node.js jarayonlar klasterini ishga tushirishni xohlaydi.

Klaster moduli barcha server portlarini ulashadigan bolalar jarayonlarini oson yaratishga imkon beradi.

Iltimos, Doker konteynerizatsiyasidan mikroservis orqali tarqatish uchun har bir konteyner uchun bitta jarayonni ishlatish ideal ekanligini unutmang. Shu sababli, klaster modullari docker-ionizatsiyadan foydalanganda foydali bo'lmaydi.

NodeJS-da boshqaruv oqimini qanday boshqarish kerak

Qo'ng'iroqlar va va'dalardan foydalanganda quyidagi kutubxonalar foydali bo'lishi mumkin:

  1. Async (https://www.npmjs.com/package/async)
  2. Vasync (operatsiyani yaxshiroq kuzatish bilan) https://www.npmjs.com/package/vasync
  3. Bluebird (va'dalarni bajarish, masalan. Promise.all va boshqalar) https://www.npmjs.com/package/bluebird

Va ko'chadan?

  • Seriyalar qatori: har bir qadamni ketma-ket bajarish
  • Kechiktirilgan pastadir: kutish vaqti bo'lgan pastadir
  • Parallel halqa: barcha va'dalarni ko'chadan to'plash va parallel ravishda bajarish

Va qanday foydali astarlash vositalari bor?

Linting vositalari kodingizni statistik ravishda tahlil qiladi (ishlamasdan). Ular mumkin bo'lgan xatolar yoki xavfli naqshlarni aniqlaydilar. Aniqlanmagan o'zgaruvchilardan foydalanish yoki almashtirish ichidagi "case" iboralari "break" iborasiz.

Kodni bazangizda 'қатъ foydalanish' bilan qat'iy tartibni yoqish, agar JavaScript tahlil qiluvchisi sizda global yoki shunga o'xshash yomon xulq-atvorni aniqlasa, sizning kodingizni tezda ishdan chiqishiga yordam beradi.

Javascript lint va JS lint linters-larga misollar.

Ok, biz Logging bilan qanday ishlaymiz?

Odatda ishlatiladigan npm paketlar:

  • Uinston (https://www.npmjs.com/package/winston)
  • Bunyan (https://www.npmjs.com/package/bunyan)

Mumkin bo'lgan jurnal formati:

Mikroservis singari taqsimlangan tizimlar uchun siz ZipKin va hokazolar yordamida taqsimlangan kuzatishni o'rganmoqchisiz.

NPM paketlaridagi eslatma: Agar siz o'zingiz hal qila olmaydigan muammoni hal qilsangiz, paketdan foydalanishingiz kerak. Npm ga bog'liq bo'lgan muammolarni aniqlash uchun npm tekshiruvlarini muntazam ravishda o'tkazing.

To'liq bo'lmagan istisnolardan foydalanish

Odatiy bo'lib, Node.js bunday istisnolarni stderr-ga stack izini bosib chiqarish va 1-kod bilan chiqish, oldindan o'rnatilgan process.exitCode-ni bekor qilish orqali amalga oshiriladi.

Eslatma: 'uncaughtException' hodisasi uchun ishlov beruvchini qo'shish bu odatiy holatni bekor qiladi.

Shu bilan bir qatorda, "uncaughtException" ishlov beruvchisida process.exitCode-ni o'zgartiring, natijada protsedura taqdim etilgan chiqish kodi bilan chiqadi. Aks holda, bunday ishlov beruvchi mavjud bo'lsa, jarayon 0 bilan chiqadi.

process.exit (0) - muvaffaqiyatli tugatish
process.exit (1) - muvaffaqiyatsiz tugatish

Ruxsat berilmagan rad javoblarini berish

Va'dalar Node.js kodida keng tarqalgan va ba'zida va'dalarni qaytaradigan funktsiyalarning juda uzoq ro'yxatiga bog'langan.

Tegishli .catch (...) rad qilish ishlov beruvchisidan foydalanmaslik, rad qilinmagan rad etish voqeasini chiqarishga olib keladi. To'g'ri ushlanmagan va tekshirilmagan bo'lsa, muammoni aniqlash va hal qilishning yagona imkoniyatidan mahrum bo'lishingiz mumkin.

Qo'shimcha maslahat:

console.time () va console.timeEnd ()

Konsol ob'ektida kod (parcha) ning ishlashini tahlil qilishga yordam beradigan vaqt () va timeEnd () usullari mavjud.

Bu ishlab chiqarish uchun echim emas, lekin undan yaxshi vositalaringiz bo'lmaganda foydalanish mumkin.

Vaqtingiz uchun katta rahmat.
Mening yangiliklarim uchun ro'yxatdan o'ting

O'xshash mavzu (lar) dagi boshqa ajoyib maqolalar:

  1. https://microservices.io
  2. https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/ddd-oriented-microservice