Microservices-ni sinab ko'rish, sog'lom usul

Dasturni sinab ko'rish haqida eng yaxshi ma'lumot yoki eng yaxshi amaliyot yoki kitoblar yo'q. Biroq, ushbu post faqat dasturiy ta'minot yoki xavfsizlikning muhim tizimlari yoki GUI vositalari yoki oldingi ilovalar emas, balki sizda mavjud bo'lgan xizmatlarni sinab ko'rishga qaratilgan.

Tarqalgan tizimlar har xil odamlarga har xil narsani anglatadi.

Ushbu vazifani bajarish uchun "taqsimlangan tizim" deganda men har xil kafolatlarga va ishlamay qolish rejimlariga ega bo'lgan, harakatlanuvchi qismlardan tashkil topgan tizimni nazarda tutaman, ular birgalikda biznes xususiyatlarini taqdim etish uchun birgalikda ishlaydi. Bu, albatta, "taqsimlangan tizim" ning kanonik ta'rifiga yaqin emas, lekin men bunday tizimlarni juda ko'p ishlaganman va men bu tizimlar bizning ko'pchiligimiz quradigan va ishlaydigan tizimlardir. Tarqalgan tizim haqida gapirayotgan bo'lsak ham, "microservices arxitekturasi" terminologiyasi du jurnal hisoblanadi.

Mikroservislarning asosiy tarkibi

Turli xil biznes funktsiyalarini mustaqil ravishda ishlab chiqish, joylashtirish va ko'lamini kengaytirish qobiliyati mikroservislar arxitekturasini qo'llashning eng muhim afzalliklaridan biridir.

Hakamlar hay'ati, agar ushbu imtiyozlar haqiqatan ham tekshiriladimi yoki yo'qmi, aniqlanmasa ham, mikservislarning ahamiyati juda katta, shu sababli bu arxitektura bugungi kunda hatto ko'plab startaplarning odatiy holiga aylangan.

Mikroservislarni sinab ko'rish (yoki undan ham yomoni, rivojlanayotganda) haqida gap ketganda, aksariyat tashkilotlar barcha komponentlarni yakdillik bilan sinab ko'rishning antilüeluv modeliga juda o'xshaydi. O'rnatilgan sinov quvurlari infratuzilmasi, har qanday xizmatning sinov to'plamida hech qanday regressiya yoki buzilishlar mavjud emasligini tasdiqlash uchun bajariladigan sinovning ushbu turini amalga oshirish uchun majburiy deb hisoblanadi.

Qutidagi to'liq qoziq - ehtiyotkor hikoya

Ko'pincha butun xizmat topologiyasini mahalliy ishlab chiquvchi noutbuklarda ko'paytirishga harakat qilayotgan ko'plab kompaniyalarni ko'raman yoki eshitaman. Men o'zim ishlagan oldingi kompaniyada bunday xatolarni boshdan kechirganman, u erda biz o'z to'plamimizni Vagrant qutisiga yig'ishga harakat qildik. "Vagrant repo" ning o'zi "qutidagi to'liq stek" qatorida nimadir deb nomlandi va siz tasavvur qilganingizdek, oddiy vagran kompaniyadagi har qanday muhandisga (hattoki old va mobil ishlab chiqaruvchilarga) imkoniyat yaratishi kerak edi. stakani to'la-to'kis noutbuklariga aylantira olish.

To'g'ri aytganda, bu haqiqatan ham minglab xizmatlardan tashkil topgan Amazon-esque mikroservislarining arxitekturasi emas edi. Orqa tomonda ikkita xizmatimiz bor edi - gevent asosidagi API serveri va ba'zi asinxron Python ishchilari, ular gnarly mahalliy qaramlikni, shu qatorda C ++ kuchaytiruvchi kutubxonasini o'z ichiga olgan edi, agar ular menga to'g'ri xizmat qilsa, har safar noldan yangi Vagrant qutisini tuzadi. aylanib ketdi.

Birinchi haftamni ushbu kompaniyada o'tkazganim esimda, bu VM-ni mahalliy xatolarga yo'liqish uchun muvaffaqiyatli ishlab chiqishga harakat qildi. Va nihoyat, birinchi haftaning juma kuni soat 16:00 atrofida men Vagrant-ni muvaffaqiyatli ishga tushirdim va barcha sinovlarni mahalliy sharoitda o'tkazdim. Bularning barchasidan tashqari, men ushbu rigmaroldan keyin juda charchaganimni eslayman va men yollagan keyingi muhandis osonlashishi uchun men duch kelgan muammolarni hujjatlashtirishni o'z zimmamga yukladim.

Undan tashqari, keyingi muhandis Vagrant o'rnatilishi bilan bog'liq muammolarning adolatli ulushini qidirib topdi, men o'zimning tizza kompyuterimda shu erda ko'paytira olmadim. Aslida, tizza kompyuterimdagi barcha sozlamalar shunchalik mo'rt ediki, hatto Python kutubxonasini yangilashdan ham qo'rqardim, chunki quvurlarni o'rnatish mening Vagrant sozlamamni buzdi va mahalliy sinovlar muvaffaqiyatsiz bo'lishiga olib keladi.

Bundan tashqari, Internetdagi yoki mobil guruhdagi boshqa muhandislarning hech biri Vagrantni sozlashda katta muvaffaqiyatga erisha olmaganligi va Vagrant muammolarini hal qilish men qo'llab-quvvatlayotgan jamoaga tez-tez yordam so'rab murojaat qiladigan manbaga aylandi. Vagrant moslamasini bir marotaba to'g'rilash uchun biz ko'proq muhandislik tsikllarini sarflashimiz kerak edi, deb ta'kidlash mumkin bo'lsa-da, "biz ishladik", bu bizning boshlang'ich holatimizda edi va startaplarda muhandislik tsikllari doimo yupqa. .

Fred Xebert bu lavozimni sinchkovlik bilan o'rganib chiqib, meni kuzatib qo'yganligi meni bu erda baham ko'rayotganimdan hayratda qoldirdi:

... bulutni dev mashinasida yuklashni so'rash ko'p substratga aylanib, bir nechta bulut ta'minotchisini qo'llab-quvvatlashga teng, ammo ulardan biri siz ko'rgan eng yomon (bitta noutbuk)

Infratuzilma kodi sifatida va o'zgarmas infratuzilma kabi zamonaviy Operatsion eng yaxshi amaliyotlarda ham, bulutli muhitni lokal ravishda ko'paytirishga harakat qilish, uni yerdan tushirish va keyinchalik saqlash uchun zarur bo'lgan sa'y-harakatlar bilan teng kelmaydi.

Monolit uslubidagi mikroservislarni qurish va sinash

Do'stlarim bilan gaplashgandan so'ng, men shuni tushundimki, bu muammo nafaqat boshlang'ichlarni, balki juda katta tashkilotlarni ham azoblaydi. So'nggi bir necha yil ichida men ushbu sozlamaning o'ziga xos mo'rtligi va uni qo'llab-quvvatlash uchun zarur bo'lgan texnikaning sarf-xarajatlari to'g'risida etarlicha hayajonli guvohliklarni eshitdim, endi men ushbu dasturni ishlab chiqaruvchi noutbuklarga to'liq tikib tashlashga urinish mutlaqo ishonaman. noto'g'ri boshlang'ich yoki katta kompaniyalarda bo'lsin.

Aslida, bu taqsimlangan monolitni qurish bilan tengdir.

Taniqli bloger Tayler Reyd aytganidek:

lmao HN bo'yicha ushbu mikroservis munozarasida. “Devlar butun yozuvlarni mahalliy darajada boshqarishlari kerak. Qolgan har qanday narsa bu yomon vositalarning belgisidir ". Ha, iltimos, menga ayting-chi, u sizning Macbook-ga turli xil db va qaramliklarga ega bo'lgan o'nlab xizmatlarni ishlata oladimi. Ammo ha, men aminmanki, docker sizni yozgan.
Bu juda keng tarqalgan. Odamlar monolit tafakkur bilan mikroservislarni qurishni boshlaydilar va u har doim shitshow bilan yakunlanadi. "O'zgarishlarni sinab ko'rish uchun men ushbu xizmatlarning konfiguratsiyasi bilan hamma narsani kompyuterimda ishga tushirishim kerak." Jfc.
Agar kimdir hapşırsa, mening xizmatim nochor bo'lib qoladi. Bunga omad. Bundan tashqari, ko'plab xizmatlarni qamrab oladigan keng miqyosli integratsiyalashuv sinovlari aksil-qarshi bo'lib qolmoqda, ammo baribir odamlarni ishontirib bo'lmaydigan tog' jangi kabi tuyuladi. Mikroservislarga o'tish ham to'g'ri vositalar va usullardan foydalanishni anglatadi. Eskilarini yangi kontekstda qo'llashni to'xtating.

Soha sifatida biz hozirgi zamondan tubdan farq qiladigan davrda ixtiro qilingan metodologiyalarni sinab ko'rishga tayyormiz. Odamlar hali ham to'liq sinov qamrovi kabi g'oyalar bilan yaxshi ko'rishadi (ba'zi kompaniyalarda birlashishi shunchalik ko'pmi?) blokirovka qilingan bo'lsa, agar yamoq yoki yangi xususiyat filiali kod bazasining sinov qamrovini sezilarli darajada kamaytirsa), test asosida ishlab chiqilgan va tizim darajasida oxirigacha sinovdan o'tgan.

Shu maqsadda ular murakkab maishiy quvurlar va ushbu maqsadlarga erishish uchun murakkab mahalliy muhitni qurish uchun ortiqcha muhandislik resurslarini jalb qilishmoqda. Shunday qilib, sinchkovlik bilan amalga oshirilgan sozlashni davom ettirish uchun jamoadan infratuzilmani qurish, texnik xizmat ko'rsatish, nosozliklarni bartaraf etish va rivojlantirish uchun o'z huquqlaridan foydalanish talab etiladi. Kattaroq kompaniyalar bu darajaga ega bo'lishlari mumkin, ammo qolganlar uchun biz sinovni haqiqatan ham shunday deb bilamiz - bu tizimni sinab ko'rishning eng yaxshi usuli - va bizning ehtiyojlarimizga qarab aqlli pul tikish va savdolarni amalga oshirish oldinga eng yaxshi yo'l bo'lib ko'rinadi.

Sinov spektri

Tarixan sinov, ishlab chiqarishdan oldingi yoki relizdan oldingi faoliyatga tegishli bo'lgan narsa edi. Ba'zi kompaniyalar ishlab chiqaruvchi guruhlar tomonidan yaratilgan dasturiy ta'minot uchun qo'lda yoki avtomatlashtirilgan sinovlarni o'tkazish uchun mas'ul bo'lgan sinovchilar yoki QA muhandislarining maxsus guruhlarini ishga qabul qilishgan va ishlashda davom etishmoqda. Dasturiy ta'minotning bir qismi QA-ni uzatgandan so'ng, u operatsiyalarni amalga oshirish guruhiga topshirildi (xizmat ko'rsatilganda) yoki mahsulot chiqarilishi sifatida yuborildi (ish stoli dasturlari yoki o'yinlari va sizda nima bor bo'lsa).

Ushbu model asta-sekin, lekin albatta bosqichma-bosqich amalga oshirilmoqda (hech bo'lmaganda xizmatlar haqida gap ketganda, mening San-Frantsiskodagi boshlang'ich pufagim orqali bog'langan narsalar to'g'risida). Rivojlanish guruhlari endi o'zlarining mualliflik xizmatlarini sinab ko'rish va ishlatish uchun javob berishadi. Ushbu yangi model men juda g'oyat kuchli deb hisoblayman, chunki u chinakam rivojlanish guruhlariga butun spektrning miqyosi, maqsadi, savdosi va yutuqlari haqida real va barqaror ko'rinishda o'ylashga imkon beradi. Bizning xizmatlarimiz qanday ishlashini tushunish va ularning to'g'ri ekanligiga ishonch hosil qilish uchun yaxlit strategiyani ishlab chiqish uchun, xizmatning mavjudligi, ishonchliligi va to'g'riligi shartlarini hisobga olgan holda sinov usullarining to'g'ri to'plamini tanlash va tanlash imkoniyati paydo bo'ladi. .

Umuman olganda, "sinov" turli xil faoliyatlarni, shu jumladan an'anaviy ravishda "ozod qilish muhandisligi" yoki "Operatsiyalar" yoki "QA" soyaboniga tushish uchun ishlatiladigan ko'plab amaliyotlarni qamrab olish uchun ishlatilishi mumkin. Quyidagi rasmda sanab o'tilgan bir necha usul ba'zi bir doiralarda sinab ko'rish shakli sifatida qaralmaydi - masalan, xaos muhandisligining rasmiy ta'rifi uni eksperiment shakli deb tasniflaydi - va men o'zim buni keng qamrovli qilib ko'rsatishni maqsad qilmayman. ro'yxat - xavfsizlikni testlash (zaiflik testi, kirishni sinov qilish, tahdidlarni modellashtirish va boshqalar) umuman hech qaerda boshlanmaydi, lekin u tabiatda ko'riladigan eng keng tarqalgan sinov turlarini o'z ichiga oladi.

Shuni ta'kidlashim kerakki, yuqoridagi rasm sinash taksonomiyasini ikkilik sifatida taqdim etgan bo'lsa-da, haqiqat bu erda tasvirlanganidek unchalik aniq emas. Masalan, profil «ishlab chiqarishda sinovdan o'tkazish» ustuniga tushadi, lekin uni ishlab chiqish davrida juda yaxshi bajarish mumkin, bu holda bu ishlab chiqarishdan oldingi sinov shakliga aylanadi. Shunga o'xshab, soyalash - bu ishlab chiqarish trafikining ozgina qismi sinov holatlariga nisbatan takrorlanadigan usuldir va siz uni qanday ko'rishingizga qarab, "ishlab chiqarishda sinov" ("ishlab chiqarishda sinov") bo'lishi mumkin (chunki u xizmatni ishlab chiqarish trafigi bilan sinashni o'z ichiga oladi). ) yoki ishlab chiqarishdan oldingi sinov shakli sifatida (chunki oxirgi foydalanuvchilar unga ta'sir qilmaydi).

Dasturlash tillari, shuningdek, ishlab chiqarishda dasturlarni sinab ko'rish uchun har xil darajadagi yordamni taklif etadi. Agar siz Erlangista bo'lsangiz, ehtimol Fred Xebertning Erlang VM-ning ishlab chiqarish tizimlarini ishlayotganda uning tuzatish vositalaridan foydalanish bo'yicha qo'llanmasi bilan tanishmisiz. Go kabi tillar har qanday ishlayotgan (ishlab chiqarishda sinab ko'rish) yoki birliklarni sinovdan o'tkazishda to'plangan, mutex, protsessor va goroutin profillarni olish uchun ishlab chiqilgan (bu ishlab chiqarishdan oldingi sinov deb nomlanadi).

Ishlab chiqarishda sinov-ishlab chiqarishdan oldingi sinov o'rnini bosadimi?

Men oldin "Kuzatuvchanlik nuqtai nazaridan" post-ishlab chiqarish sinovlari haqida batafsil yozgan edim. Monitoring - ogohlantirish, razvedka va dinamik asbobsozlik singari, post-ishlab chiqarish sinovidir. Ishlab chiqarishda sinov usullari sifatida belgi qo'yish va eshiklarni yopish kabi texnikalarni chaqirish uchun uni cho'zmaslik ham mumkin. A / B sinovlari va haqiqiy foydalanuvchi monitoringi kabi usullardan foydalangan holda foydalanuvchilarning o'zaro ta'siri yoki foydalanuvchi tajribasini o'lchash ishlab chiqarishda sinov shakli sifatida ham talqin qilinishi mumkin.

Ba'zi bir doiralarda bunday sinov shakllari qanday qilib ishlab chiqarishdan oldingi sinov o'rnini bosishi mumkinligi haqida munozara bor. Biroz oldin Sara Mei bu haqda munozarani keltirib chiqardi. Bu erda ochish uchun juda ko'p narsa bor, va men Sora aytgan barcha fikrlarga qo'shilmasam ham, men juda ko'p do'zax bor. Sora quyidagilarni aytadi:

Oddiy donolik, kodni chiqarmasdan oldin yashil rangga o'tish uchun sizga keng qamrovli regressiya testlari kerakligini aytadi. O'zgartirishlaringiz ilovaning biron bir joyida buzilmaganligini bilishni xohlaysiz. Ammo regressiya to'plamidan boshqa narsalarni aytib berish usullari mavjud. Ayniqsa, yanada murakkab monitoringning kuchayishi va operatsion tomondan xatolar nisbati (ish vaqtiga nisbatan) yaxshiroq tushunilishi bilan.
Etarli darajada rivojlangan monitoring va etarlicha shkala bilan, bu kod yozish, uni ishlab chiqarish va xatolar sonini ko'rish uchun haqiqiy strategiya. Agar ilovaning boshqa qismida biron bir narsa buzilsa, bu sizning xato tezligingizda juda tez paydo bo'ladi. Siz tuzatishingiz yoki orqaga burishingiz mumkin. Siz asosan monitoring tizimingizni regressiya to'plami va uzluksiz integratsiya boshqa jamoalarda o'ynashiga imkon berasiz.

Ko'p odamlar buni ishlab chiqarishdan oldingi sinov umuman kerak emasligini anglatadi, va men buni qanday izohlamadim. Ikkala satrni o'qiy turib, men ko'p shov-shuvlarni ko'p dasturiy ta'minotni ishlab chiqaruvchilar (va dasturiy ta'minotni professional sinovdan o'tkazuvchilar) ishlab chiqarishdan oldin qo'lda yoki avtomatlashtirilgan sinovdan o'tkazganingizdan so'nggina kelishib olishlari mumkinligi bilan bog'liq deb o'ylayman. Ehtimol, ba'zida bu etarli emasligi uchun etarli bo'lmasligi mumkin.

Dasturiy ta'minotni sinashda o'rganilgan darslar "Avtomatlashtirilgan test" deb nomlangan bobga ega bo'lib, unda mualliflar avtomatlashtirilgan regressiya testlari xatolarning ozgina qismini topadi deb ta'kidlashadi.

Norasmiy so'rovlar shuni ko'rsatadiki, avtomatlashtirilgan testlar orqali topilgan xatolar foizi juda kam. Avtomatlashtirishning muhim, yaxshi mo'ljallangan sa'y-harakatlari bilan amalga oshirilgan loyihalar, regressiya sinovlari hisobotdagi xatolarning 15 foizini topishini ma'lum qildi (Marick, onlayn).
Regression-test avtomatika odatda testlarni ishlab chiqishda ular keyinchalik testlarni bajargandan ko'ra ko'proq xatolarni topadilar. Ammo, agar siz regressiya sinovlarini o'tkazsangiz va ularni turli muhitlarda (masalan, turli xil apparat platformalarida yoki turli xil dasturiy ta'minot drayverlarida) qayta ishlatish imkoniyatlarini topsangiz, testlaringizda muammolar paydo bo'lishi ehtimoli ko'proq. Aslida, ular endi regressiya sinovlari emas, chunki ular ilgari sinov qilinmagan konfiguratsiyalarni sinab ko'rishmoqda. Tekshiruvchilarning ta'kidlashicha, bunday avtomatlashtirilgan sinovlar 30 dan 80 foizgacha hosil berishi mumkin.

Bu kitob, albatta, bir muncha eski bo'lib, men regressiya testlarining samaradorligi to'g'risida yaqinda biron bir izlanish topa olmadim, ammo dasturiy ta'minotni loyihalashtirishning yaxshi usullari va fanlari deb ishonishimiz shart bo'lgan narsalarning aksariyati shu asosga qurilgan. Avtomatlashtirilgan sinovning soddaligi, uning samaradorligiga shubha qilishning har qanday shakli ko'pchilik uchun yoqimsiz bo'lib tuyuladi. Agar so'nggi yillarda xizmatlarning ishlamay qolishini guvohi bo'lgan biron bir narsani bilgan bo'lsam, ishlab chiqarishdan oldingi sinov tizimning kafolatlarining kichik qismini tekshirish uchun eng yaxshi urinishdir va ko'pincha uzoq vaqt ishlash uchun etarli darajada etarli emas. proteynli harakatlanish shakllariga ega tizimlar.

Sara ipini davom ettirish uchun:

Ushbu strategiya juda ko'p narsalarni o'z ichiga oladi, bu ko'pchilik dev komandalarida mavjud bo'lmagan tajribali tajribadan boshlab. Yana ko'p narsalar mavjud. Bu foydalanuvchilarni segmentirovka qilish, har bir devordagi o'zgarishni boshqa segmentga ko'rsatish va har bir segment uchun xato stavkalarini ajratish qobiliyatiga ega. Segmentning xato nisbatlaridagi o'zgarish statistik jihatdan ahamiyatli bo'lishi uchun etarli miqyosga ega bo'ladi. Va, ehtimol, g'ayrioddiy narsa, bu jonli trafikda qulay tajriba o'tkazishni ta'minlaydigan mahsulotni tashkil qiladi. Keyin yana, agar ular jonli trafikda mahsulot o'zgarishini A / B sinovidan o'tkazsa, bu shunchaki bu fikrni o'zgartirish uchun kengaytirmoqda. Ammo agar siz uni ishlata olsangiz, siz amalga oshirgan o'zgarishlar haqida jonli fikr-mulohaza olish juda ajoyib.

Urg'u meniki va bu, menimcha, biz qurayotgan tizimlarga nisbatan ko'proq ishonch hosil qilish uchun eng katta to'siqdir. Umuman olganda, testlashga yanada keng qamrovli yondashuvni qabul qilishga eng katta to'siq bu ongni o'zgartirish zarurati. Ishlab chiqarishdan oldingi sinov dasturiy ta'minot muhandislari kariyerlarining boshidanoq o'rganilgan narsadir, jonli trafik bilan tajriba o'tkazish g'oyasi Operatsiyalar muhandislarining saqlanib qolganligi yoki signal va / yoki FUD bilan kutib olingan narsadir.

Biz ishlab chiqarishni sakrosanct sifatida qo'llab-quvvatlaydigan status-kvoga ko'nikib qoldik va bunga aralashmasligimiz kerak, hatto bu biz har doim haqiqiy maqolani (mahsulotni) taqlid qiladigan muhitda tekshiramiz degan ma'noni anglatadi. Imkoniyatni ishlab chiqarishga "bir xil" bo'lgan muhitda tekshirish, kiyimni qayta tayyorlashga o'xshaydi; ba'zi bir afzalliklari borligi shubhasiz, ammo bu to'liq uy oldida namoyish qilish bilan bir xil emas.

Aslida, Sara fikrlariga ko'plab javoblar buni tasdiqlaydi. Sora bunga javoban:

Shunday qilib, bu ip (yuqoridagi) echib tashlandi va mening eslatmalarim haqiqatan ham to'la. Eng qizig'i, "ammo sizning foydalanuvchilaringiz ko'proq xatolarni ko'rishadi!" Ushbu bayonotda juda ko'p noto'g'ri tushunchalar mavjud. Keling, uni biroz ochishimiz mumkinligini ko'rib chiqaylik. Sinovlardan xalos bo'lish uchun ishlab chiqarishni kuzatishda regressiya uchun javobgarlikni yuklash, foydalanuvchilar ko'proq xatolarga olib kelishi mumkinligini anglatadi. Natijada, siz kodlar bazangizni o'zgartirmasdan turib bunday qila olmaysiz, chunki foydalanuvchilar tomonidan xatolar kamroq seziladi (va kamroq ta'sir qiladi). Bu aslida foydalanuvchilarning tajribasini sezilarli darajada yaxshilaydigan yoqimli ijobiy dizayn bosimi. Ba'zi odamlar "foydalanuvchilar ko'proq xatolarga yo'l qo'yishmoqda" - "" foydalanuvchilar ko'proq xatolar ko'rishadi "-" "sizning foydalanuvchilaringiz haqida qayg'urmaysizlar" degani menga juda kulgili. Bu fikrlash zanjiridagi har bir havola zaif.

Bu boshdagi tirnoqni uradi. Rejressiya sinovini ishlab chiqarishdan keyingi monitoringga o'tkazish nafaqat fikrlash tarzini o'zgartirishni va xavf uchun ishtahani o'zgartirishni talab qiladi, balki muhimi, tizimni loyihalashni mukammal qayta ishlashni talab qiladi, bu yaxshi chiqadigan muhandislik amaliyoti va vositalariga kuchli investitsiya. Boshqacha qilib aytganda, bu nafaqat xatolarni arxitlashni, balki mohiyatan oldin muvaffaqiyatsiz bo'lish uchun kodlashda muvaffaqiyatsizlikka kodlashni ham o'z ichiga oladi. Va bu tushuncha, men juda xohlayman, juda ko'p ishlab chiquvchilar unchalik ham qulay emas.

Ishlab chiqarishda nimani sinab ko'rish kerak va ishlab chiqarishdan oldin nimani sinab ko'rish kerak?

Xizmatlarni sinab ko'rish spektr bo'lganligi sababli, har ikkala shakl uchun ham tizimni loyihalash paytida (ikkala arxitektura ham, kod ham) asosiy nuqtai nazar muhim bo'lishi kerak, chunki u tizimning qanday funktsional imkoniyatlari to'g'risida qaror qilish imkoniyatini ochib beradi. Ishlab chiqarilishdan oldin tekshirilishi kerak va qanday xususiyatlar (masalan, juda uzoq vaqt dum singari) ishlab chiqarishda yanada kengroq asbob va vositalar yordamida o'rganilishi yaxshiroq ekanligi aniqlandi.

Chegaralar qayerda joylashganligi va funktsionallik aynan spektrda qaerda faqat ishlab chiqish va ekspluatatsiya qilish bo'yicha guruhlar qaror qabul qilishi mumkinligiga kelsak, bu tizim dizaynining bir qismi bo'lishi kerak. Sinash yoki monitoringga "yuqoridan-pastga" yondoshish, uni keyinchalik o'z holati sifatida ko'rib chiqish samarasiz bo'lib chiqdi.

Xayriya Majorlari bu yil Strangeloopda nutq so'zladilar, u erda kuzatuv va "monitoring" o'rtasidagi farq haqiqatan ham noma'lum va noma'lum kimsalarga qanday tushishi haqida gapirdi.

Charity Majors 'Strangeloop 2017 nutqidan

Xayriya to'g'ri - bu siz "kuzatishni" xohlagan narsalarning turlari emas. Xuddi shu tomir ichida, siz o'zingiz istamagan narsalar ham emas. Tarqatilgan tizimlar patologik jihatdan oldindan aytib bo'lmaydi va tizimning turli qismlarida joylashgan kvagmirlarning kombinatorial sonini tasavvur qilishning iloji yo'q. Biz xizmatni har qanday usulini oldindan aytib berishga ahmoqning topshirig'i ekanligimiz qanchalik tez tushuniladi. mashq qilish va regressiya testini yozib qo'yish mumkin, shunda biz testga nisbatan kamroq funktsional yondashuvni qo'llashimiz mumkin. Fred Xebert ushbu lavozimni sharhlashda ta'kidlaganidek:

... ko'plab kompyuterlar ishtirok etadigan katta xizmat o'sib borishi bilan, tizim 100% sog'lom bo'lganda hech qachon ishlamasligi ehtimoli ko'proq. Har doim biron bir joyda qisman muvaffaqiyatsizlikka uchraydi. Agar testlar 100% sog'liqni saqlashni talab qilsa, sizda muammo borligini bilasiz.

Ilgari, men "hamma narsani kuzatib borish" bu antitrassizm deb ta'kidlaganman. Menimcha, xuddi shu falsafani testga ham tatbiq etish mumkin. Biror narsani sinab ko'rishning iloji yo'q - va shunga o'xshab hamma narsani sinab ko'rmaslik kerak. SRE kitobida shunday deyilgan:

Aniqlanishicha, ma'lum bir vaqt o'tishi bilan, xizmatning (va uning foydalanuvchilarining) ishonchliligi oshishi yaxshisi emas, balki yomonroqdir! Yuqori darajadagi ishonchlilik qimmatga tushadi: barqarorlikni maksimal darajada oshirish yangi funktsiyalarni ishlab chiqish tezligini va mahsulotlarni foydalanuvchilarga qanchalik tez etkazib berilishini cheklaydi va ularning narxini keskin oshiradi, bu esa o'z navbatida jamoa taklif qilishi mumkin bo'lgan xususiyatlar sonini kamaytiradi.
Bizning maqsadimiz ushbu xizmat tomonidan olingan xavfni biznes olib borishga tayyor bo'lgan xavf bilan aniq muvofiqlashtirishdir. Biz xizmatni etarlicha ishonchli qilishga intilamiz, ammo kerak bo'lgandan ko'ra ishonchli emas.

Agar siz yuqoridagi parchadagi "ishonchlilik" so'zini "sinov" bilan almashtirgan bo'lsangiz, u shunchaki maslahatlar kabi o'qiydi.

Keyin savol tug'iladi - ishlab chiqarishdan oldingi sinovdan o'tishga eng munosib bo'lganini va post-ishlab chiqarishni sinovdan o'tkazishga nima ko'proq mos keladi?

Tadqiqot ishlab chiqarishdan oldin sinov uchun EMAS

Izlanish sinovlari bu 80-yillardan beri mavjud bo'lgan sinov usulidir. Ko'pincha professional testerlar tomonidan olib boriladigan tadqiqotlar bo'yicha test sinovidan ozgina tayyorgarlikni talab qiladigan, muhim xatolarni ochib tashlagan va "skriptlangan testlarni bajarishdan ko'ra ko'proq intellektual rag'batlantiruvchi" bo'lgan. Men hech qachon professional tester bo'lmaganman va dasturni sinab ko'rish uchun alohida guruh bo'lgan tashkilotda ishlamaganman, shu sababli yaqinda testning ushbu shakli haqida nima uchun bilganimni tushuntirib berishi mumkin.

Dasturiy ta'minotni sinashda o'rganilgan darslar "Tester kabi fikrlash" bobida juda yaxshi maslahatlarga ega bo'lib, unda shunday deyilgan: Sinash uchun siz izlanishingiz kerak.

Biror narsani sinab ko'rish uchun siz u bilan ishlashingiz kerak. Siz unga kirishingiz kerak. Agar siz mahsulotning mukammal tavsifiga ega bo'lsangiz ham, bu kashfiyot jarayoni. Agar siz ushbu spetsifikatsiyani yodingizda ko'rmasangiz yoki mahsulotning o'zi bilan ishlamasangiz, siz aniqlagan sinovlar yuzaki bo'ladi. Mahsulotni chuqur tushunish uchun etarlicha kashf qilganingizdan so'ng ham, muammolarni qidirish masalasi hali ham mavjud. Barcha sinovlar namuna bo'lib xizmat qiladi va sizning namunangiz hech qachon to'liq bo'lmasligi mumkin, shuning uchun tadqiqot loyihasida butun izlanish fikrlash katta ahamiyatga ega.
Izlanish orqali biz maqsadli sayohatni anglatadi: kosmosda muloyim missiya bilan, lekin belgilangan marshrutsiz sayohat. Izlanish doimiy o'rganish va tajriba qilishni o'z ichiga oladi. O'qitilmagan ko'z uchun chiqindiga o'xshab ketadigan orqaga chekinish, takrorlash va boshqa ko'plab jarayonlar mavjud.

Ta'kid meniki, agar yuqoridagi paragrafda "mahsulot" so'zini "xizmat" so'zi bilan almashtirsangiz, bu mikroservislarni ishlab chiqarishdan oldin sinovdan o'tkazish orqali erishish mumkin bo'lgan eng yaxshi narsalar haqidagi ishonchimni aks ettiradi. -mahsulot sinovlari asosan yuzaki.

Bundan tashqari, men kashf qilishning muhimligiga aniq qo'shilaman, lekin bu albatta ishlab chiqarishdan oldingi sinov bosqichiga tegishli deb o'ylamayman. Kitob qidiruvni sinovga qanday kiritish kerakligi to'g'risida batafsilroq ma'lumot beradi:

Izlanish - bu detektiv ish. Bu ochiq qidiruv. Izlanishni kosmosda yurishni tasavvur qiling. Bu oldinga, orqaga va lateral fikrlashni o'z ichiga oladi. Siz mahsulotning yaxshiroq modellarini yaratish orqali taraqqiyotga erishasiz. Keyinchalik ushbu modellar samarali testlarni loyihalashga imkon beradi.
Oldinga fikrlash: O'zingiz bilganingizdan bilmaganingizga ishlang.
Orqaga qarab fikr yuritish: Gumonlarni tasdiqlash yoki rad etishga urinib, o'zingiz gumon qilgan narsadan yoki o'zingiz bilgan narsaga qarab harakat qiling.
Yanal fikrlash: Sizga ishlashga sizni boshingizdagi g'oyalar chalg'itishga, tangentslarni o'rganib, keyin asosiy ipga qaytishga imkon bering.

Xavfsizlik tanqidiy tizimlari yoki moliyaviy tizimlar yoki hatto mobil dasturlarni yaratishda sinovdan oldin ushbu versiyani amalga oshirish juda muhim bo'lishi mumkin, ammo mening tajribam infratuzilma xizmatlarini qurish jarayonida, masalani hal qilish yoki ishlab chiqarishda tajriba o'tkazishda bunday tadqiqotlar ancha mos keladi. aravani otning oldiga qo'yish va xizmatni rivojlantirish bosqichida bunday ochiq usulni oldindan kiritish.

Buning sababi shundaki, xizmatning ishlash xususiyatlarini yaxshiroq tushunish ko'pincha uni ishlab chiqarishda kuzatgandan so'ng olinadi va kashfiyot aniq taxminlar bilan emas, balki biron-bir dalil bilan qurollangan holda amalga oshirilsa yanada samaraliroq bo'ladi. Shuni ham ta'kidlash kerakki, ishlab chiqarishda bunday izlanishlarni xavfsiz ravishda amalga oshirishga ishonadigan juda tezkor ishlaydigan ishlab chiqaruvchilar bo'lmasa, bunday eksperiment ko'pincha zaruriy xavfsizlik dastgohlari bilan jihozlangan zamonaviy jihozlarni talab qiladi. Mahsulot va infratuzilma / operatsiyalar guruhlari o'rtasida yaxshi aloqa. Yoki Sora aytganidek:

Bu tashkilotdagi operatsiyalar va rivojlanayotgan odamlar uchun qayta bir-biri bilan yaqin hamkorlikda ishlash uchun juda muhim bo'lgan sabablardan biridir. Ishlab chiqaruvchilar va dushmanlar o'rtasidagi qarama-qarshi munosabatlar buni yo'q qiladi. Agar siz "sifat" uchun javobgarlik bir tomonga berkitilgan bo'lsa ham, uni ishga tushira olmaysiz. Albatta, gibrid yondashuvlar mumkin, agar kichkina, tezkor sinov to'plami juda muhim kodga ega bo'lsa, qolganlari esa prod.

Ishlab chiquvchilar ushbu tizimlarni ishlab chiqarishda qanday ishlashini kuzatish orqali faqat aniq javoblar asosida tizimlarini sinab ko'rish va rivojlantirish g'oyasini olishlari kerak. Ishlab chiqarishdan oldingi sinovlarga yakka ishonish ularni nafaqat kelajak uchun, balki hatto eng nomutanosib arxitekturaning tobora ko'proq tarqalib borayotgan sovg'asi uchun ham barqaror qila olmaydi.

Men hamma ham Operatsiyalar bo'yicha muhandis ekanligiga ishonmayman. Ammo men operatsiyalar umumiy majburiyat ekanligiga to'liq ishonaman. Mexanik xayrixohlik asoslarini tushunish (apparat qanday ishlashini tushunish) uni ishlab chiquvchiga yanada yaxshilaydi. Operatsion xayrixohlik haqida ham xuddi shunday gapirish mumkin (xizmat ishlab chiqarishda qanday ishlashini tushunish).

Ishlab chiquvchilar shunga ko'ra kodlashni o'rganishlari kerak (va sinab ko'ring!). Men odatda bunday e'lonlarni amalga oshirilgandan ko'ra ko'proq ishchan va intiluvchan deb bilaman. Ishlab chiquvchi uchun «shunga muvofiq kod berish» nimani anglatadi?

Menimcha, bu uchta narsaga bog'liq.

- dasturning amaliy semantikasini tushunish
- qaramliklarning operatsion xususiyatlarini tushunish
- disk raskadrovka kodini yozish

Ilovaning amaliy semantikasi

Bunga quyidagilar bilan bog'liq savollarni o'z ichiga olgan holda yozish kodi kiradi:

- xizmat qanday joylashtirilganligi va qanday vositalar bilan
- xizmat 0 port yoki standart port uchun majburiymi?
- dastur signallarni qanday ishlaydi?
- berilgan xostda jarayon qanday boshlanadi?
- xizmat kashfiyoti bilan qanday ro'yxatdan o'tadi?
- Qanday qilib u oqimlarni kashf etadi?
- xizmatni chiqish arafasida qanday ulanadi?
- Qayta boshlashlar qanchalik yoqimli (yoki yo'q)
- konfiguratsiya - ham statik, ham dinamik - jarayonga qanday oziqlanadi
- ilovaning parallellik modeli (ko'p qirrali yoki sof bitta ipli va hodisaga asoslangan yoki aktyor yoki gibrid model)
- ilova oldidagi teskari proksi-serverning ulanishlarni boshqarish usuli (oldindan ishlab chiqarilgan

Ko'plab tashkilotlar yuqorida keltirilgan misollarni platforma yoki standart vositalar yordamida ishlab chiquvchilardan eng yaxshi tarzda ajratib olingan narsa sifatida ko'rishadi. Shaxsan men hech bo'lmaganda ushbu tushunchalarni boshlang'ich ma'lumotga ega bo'lish dasturiy ta'minot muhandislariga katta yordam berishi mumkinligiga ishonaman. Nuqtai nazar - Fred Gerbert ushbu lavozimni sharhlashda quyidagilarni ta'kidlaydi:

TCP stack pastadir interfeysi va masofadan boshqarish pulti bilan ishlaganda boshqacha harakat qiladi. Masalan, agar ulanish uzilgan bo'lsa, pastadir interfeysi TCP 'yuborish' operatsiyasini bajarayotganda sizga bu haqda xabar berishi mumkin; Loopback interfeysida bu juda kamdan-kam hollarda bo'ladi va FINni ko'rish uchun paketlarni buferdan o'qib chiqishingiz kerak (RST baribir o'ldirishi mumkin). Shu sababli, agar sizning sinov qurilmangiz hech bo'lmaganda pastga tushadigan interfeysdan foydalanmasa, bunday ulanishni osib qo'yish muammolarini topishning iloji yo'q.

Bog'lanishlarning operatsion xususiyatlari

Biz tobora ko'payib ketadigan (va ko'pincha tez-tez o'zgarib turadigan) mavhumliklar ustida yaxshi tushunilmagan va qobiliyatsiz rejimlar bilan quramiz. So'nggi uch yil ichida men bilan suhbatlashishim kerak bo'lgan bunday xususiyatlarga misollar:

- Konsul mijozi kutubxonasining odatiy o'qish muttasilligi rejimi (odatda odatiy "qat'iy mos keladi", bu xizmatni ochish uchun siz talab qilishi mumkin bo'lmagan narsa emas)
- RPC mijozi yoki standart TTL tomonidan taqdim etilgan keshlash kafolatlari
- rasmiy Confluent Python Kafka mijozining tishli modeli va uni tekislangan Python serverida ishlatishning xususiyatlari.
- pgbouncer uchun odatiy ulanish pulining o'lchamini sozlash, ulanishlar qanday qayta ishlatilganligi (asl qiymati LIFO) va ushbu Postgres o'rnatish topologiyasi uchun eng mos variantmi yoki yo'qligi.

Nosozliklarni aniqlash kodi

Nosozliklarni tuzatish kodini yozish kelajakda savol berishni o'z ichiga oladi, bu o'z navbatida:

- asboblarni boshqarish kodi etarlicha yaxshi
- Kuzatilishni tanlash formatini (o'lchovlar yoki jurnallar yoki istisno trekchilar yoki izlar yoki ularning kombinatsiyasi bo'lsin) va uning ijobiy va salbiy tomonlarini tushunish.
- ushbu xizmatning talablari, bog'liqlik operativ so'rovlari va yaxshi muhandislik sezgi talablariga binoan kuzatuvning eng yaxshi formatini tanlash imkoniyatiga ega bo'lish.

Agar yuqorida sanab o'tilganlarning barchasi juda yoqimli bo'lsa, demak, bu "tegishli ravishda kodlash" (va eng muhimi, "shunga yarasha" sinab ko'rish) bu qiyinchiliklarni yaxshi bilish va plastinkaga ko'tarilishni talab qiladi.

Ishlab chiqarishdan oldingi sinov

Sinovga gibrid yondoshishga imkon bergan holda, ushbu postning qolgan qismi - mikroservislarni ishlab chiqarishdan oldingi sinovlari bilan tanishib chiqaylik.

Sora quyidagilarni aytadi:

Sinovlarni yozish va o'tkazish o'z-o'zidan maqsad emas - HAMMA. Biz buni jamoamizga yoki biznesimizga biron bir foyda olish uchun qilamiz. Agar siz o'zingizning jamoangizga va kattaroq orgga foyda keltiradigan foyda olishning samaraliroq usulini topsangiz, uni albatta qabul qilishingiz kerak. Chunki sizning raqibingiz, ehtimol.

Dasturiy ta'minotni ishlab chiqishda boshqa har qanday kabi, har qanday sinovni (an'anaviy sinov yoki monitoring yoki tadqiqotlar va sizda nima bo'lishidan qat'i nazar) yakunlash uchun vosita bo'lishdan tashqari u navlar diniga aylanishi mumkin. Sinov mutlaq emas va shuningdek, yaxshi sinovdan o'tgan tizimning universal ustuni bo'lib xizmat qilishi mumkin bo'lgan standartlashtirilgan o'lchovlar mavjud emas.

Shu bilan birga, to'rtta eksa - maqsad, qamrab olish, ishdan bo'shatish va ishdan bo'shatish - testning har qanday shakli qanchalik samarali ekanligini baholash uchun ishonchli vakil bo'lishi mumkin.

Ishlab chiqarishdan oldingi sinov maqsadi

Yuqorida ta'kidlab o'tilganidek, men ishlab chiqarishdan oldingi sinovni tizimning to'g'riligini tekshirishning eng yaxshi usuli va nosozlik rejimlarining ma'lum simulyatsiyasi sifatida ko'raman. Ishlab chiqarishdan oldingi sinovning maqsadi bu erda biron bir xato yo'qligini isbotlash emas (balki tahlilchilarda va pul yoki xavfsizlik bilan bog'liq har qanday dasturda bundan mustasno), lekin ma'lum bo'lganlar yaxshi qamrab olinganligini va ishonch hosil qilish. noma'lumlar uchun asboblar o'rnatilgan.

Ishlab chiqarishdan oldingi sinov doirasi

Ishlab chiqarishdan oldingi sinovning ko'lami, bizning ishlab chiqarish xatolarining alomati bo'lishi mumkin bo'lgan yaxshi evristikani tasavvur qilish qobiliyatimiz kabi yaxshi. Bunga tizimning chegaralarini, baxtli kod yo'llarini (muvaffaqiyat holatlari) va eng muhimi, qayg'uli yo'llarni (xatolar va istisnolar bilan ishlash) taxminiy yoki intuitiv ravishda aniqlash va vaqt o'tishi bilan ushbu evristikani doimiy ravishda takomillashtirishni o'z ichiga oladi.

Mening tajribamda, men har doim kodni va testni yozgan odam edim. Kodim qayta ko'rib chiqilganida ham, o'sha jamoada kimdir uni ko'rib chiqadi. Shunday qilib, har qanday ko'lamni tizimni qurish bo'yicha muhandislar, shuningdek, tizimga asoslangan har qanday taxminlar bilan bog'liq bo'lgan o'ziga xos tarafkashlik bilan cheklangan.

Ushbu maqsadlar va ko'lamni hisobga olgan holda, ishlab chiqarishdan oldingi sinovlarning turli shakllarini baholaymiz va savdo va yutuqlarni ko'rib chiqamiz.

Birlikni sinovdan o'tkazish

Mikroservislar biznes-mantiqiy bo'linmalarni mustaqil xizmatlarga bo'linish tushunchasiga asoslanib, har bir xizmat alohida biznes yoki infratuzilma funktsiyasi uchun javobgar bo'lgan yagona javobgarlik tamoyiliga muvofiq amalga oshiriladi. Keyinchalik ushbu xizmatlar tarmoq orqali bir-biri bilan yoki sinxron RPC mexanizmining biron bir shakli yoki asenkron xabarni uzatish orqali aloqa o'rnatadilar.

Ba'zi bir mikroservislarning tarafdorlari tarkibiy qismlarni xizmat ichidagi tashkil qilish uchun standartlashtirilgan shablondan foydalanishni talab qiladilar, shunda barcha xizmatlar tarkibiy jihatdan bir-biriga o'xshash bo'lib, har bir qavatni sinab ko'rish uchun qulay tarzda birlashtirilishi mumkin bo'lgan ko'plab tarkibiy qismlardan iborat. izolyatsiya.

Boshqacha qilib aytganda, ushbu yondoshish (haqli ravishda) har bir xizmatni kod darajasida dekompozitsiyasini amalga oshirib, turli xil domenlarni ajratish uchun ishlaydi, shunda tarmoq mantiqlari protsessorni tahlil qilish mantig'i, biznes mantig'i va ma'lumotlar barqarorligi mantig'idan alohida bo'lishi kerak. Tarixan, kutubxonalar ushbu maqsadlarga erishish uchun foydalanilgan (shuning uchun siz JSON-ni tahlil qiladigan kutubxonangiz va ma'lumotlar bazangiz bilan suhbatlashish uchun boshqa kutubxonangiz bor edi) va ushbu dekompozitsiya shaklining ko'p marotaba takrorlanadigan afzalliklaridan biri bu qatlamlarning har biri jihozni har bir sinovdan o'tkazish mumkin. Birlik testi universal ravishda eng kichik funktsional birlikni sinash uchun arzon va tezkor usul deb hisoblanadi.

Mayk Kon tomonidan "Agile bilan muvaffaqiyatga erishish" kitobida taklif etgan va Sem Nyuman tomonidan "Mikroservislarni qurish: Yupqa taniqli tizimlarni loyihalash" kitobida keltirilgan sinov piramidasi haqida so'z yuritmasdan turib, testlar bo'yicha hech qanday bahs tugamaydi. Pastki qismida biz tez, ham arzon deb hisoblanadigan birlik sinovlari bor, undan keyin xizmat sinovlari (yoki integratsiya testlari) va keyin UI tomonidan boshqariladigan testlar (yoki oxiridan oxirigacha). Piramidaning ustiga chiqqanda, testlarni o'tkazish tezligi pasayadi va sinovni o'tkazish uchun sarflanadigan xarajatlar bir vaqtda ortadi.

Mayk Konning sinov piramidasi

Sinov piramidasi monolit davrida yaratilgan va biz bunday dasturlarni sinab ko'rish haqida o'ylaganimizda juda mazmunli bo'ladi. Tarqalgan tizimlarni sinab ko'rish uchun men ushbu yondashuvni nafaqat qadimiy, balki etarli emas deb hisoblayman.

Mening tajribamda, individual mikroservis (ehtimol tarmoq proksi-serverlari bundan mustasno) deyarli har doim ma'lumotlar bazasi yoki kesh singari davlat tomonidan himoyalanadigan dasturiy ta'minot (biznes mantig'ini yopib qo'yish). Bunday tizimlarda, aksariyat hollarda, agar bo'lmasa ham, funktsional elementlarning odatiy birliklari odatda biron bir shaklni (umid qilamanki, bloklanmagan) o'z ichiga oladi - xoh baytni o'qish yoki diskdan ba'zi ma'lumotlarni o'qish.

Hamma I / O teng emas

Kori Benfild PyCon 2016-da juda katta nutq so'zladi, u erda ko'pgina kutubxonalar protokollarni tahlil qilishni I / O-dan ajratmaslikda xato qilishadi, bu ham sinov, ham kodni qayta ishlatishni juda qiyin qiladi. Bu, albatta, juda to'g'ri va men bunga mutlaqo qo'shilaman.

Biroq, men ham hamma ham / hammasi ham teng emasligiga ishonaman. Protokollarni tahlil qilish kutubxonalari, RPC mijozlari, ma'lumotlar bazasi drayverlari, AMQP mijozlari va boshqalar barchasi I / O qilishadi, ammo bu mikroservisning chegaralangan kontekstini hisobga olgan holda turli xil ulushlarga ega bo'lgan I / O shakllari.

Masalan, foydalanuvchilarni boshqarish uchun javobgar bo'lgan mikroservisni sinab ko'rishda, agar HTTP tahlil qilinishi kutilganidek ishlayotgan bo'lsa, testdan farqli o'laroq, foydalanuvchilar ma'lumotlar bazasida muvaffaqiyatli yaratilganligini tekshirish imkoniyati muhimroqdir. Albatta, HTTP tahlil qilish kutubxonasidagi xato ushbu xizmat uchun bitta xato nuqtasi bo'lib xizmat qilishi mumkin, ammo HTTP tahlil qilinadigan narsalarning bosh sxemasida faqat o'ynash uchun qo'llab-quvvatlanadigan qism mavjud va bu xizmatning asosiy mas'uliyatiga ziddir. . HTTP kutubxonasi bu barcha xizmatlar tomonidan qayta ishlatiladigan narsadir (va qattiq buzilishdan foyda ko'rishi mumkin) va shu tariqa umumiy mavhumlikka aylanadi va abstraktsiyalar bilan ishlashda tinchlik o'rnatish uchun eng yaxshi yondoshuv - eng hattoki eng yaqini ham. (alam bilan) va'da qilingan shartnomaga bo'lgan ishonchni yo'qotish. Bu savdo-sotiq umuman ideal bo'lmasada, menga hech narsa etkazib bermaslik nuqtai nazaridan tushunarli bo'ladi.

Ammo, mikroservisning o'zi haqida gap ketganda, tizimning qolgan qismiga taqdim etilayotgan abstraktsiya - bu ma'lum bir biznes yoki infratuzilma mantig'iga to'g'ridan-to'g'ri xaritada joylashtiradigan, kapsullovchi davlat o'tishidir va ergo bu funktsiyani sinab ko'rish kerak. havo o'tkazmaydigan birlik sifatida.

Shunga o'xshab, Zookeeper-ni dinamik orqaga qaytarish uchun so'rovlarni yuklash uchun xizmat kashf etishda foydalanadigan tarmoq proksi-sini hisobga olgan holda, proksi soatni ichki holatini o'zgartirib va ​​(va ehtimol uni) sozlash orqali ishga tushirishga to'g'ri javob berganligini sinab ko'rish juda muhimdir. yangi soat. Bu o'sha erda sinovdan o'tgan birlik.

Bu erda mohiyatning mohiyati shundaki, mikservis tomonidan taqdim etiladigan funktsionallikning eng muhim birligi uning doimiy orqasida joylashgan I / O-ning abstraktsiyasi bo'lib, sinov ostida asosiy funktsiyalarning germetik birligi bo'lishi kerak.

Shunday bo'lsa-da, bunday tizimlarni sinab ko'rishning eng keng tarqalgan amaliyoti - bu elektr toki ostidagi I / O-ni sinov ostidagi jihozning ajralmas qismi sifatida emas, balki butun blokni ishdan chiqaradigan darajagacha bo'lgan muomala. ushbu kunlarni sinab ko'rish og'ir istehzo ishlatish bilan sinonimga aylandi.

Bunday muhim kritik I / O-ni zarbalar bilan sinash birligi, bu shunchaki tezlikni qurbon qilish bilan bir qatorda, bizning aqliy modelimizni tizimning haqiqiy xususiyatlariga mutlaqo mos kelmaydigan tarzda shakllantiradi. qayta qurish. Aslida, men masxaralash bilan jihozni sinovdan o'tkazish (biz bu soxta sinov deb ham atashimiz mumkin), ko'p jihatdan bizning to'liq bo'lmagan (shuningdek, juda kamchilik) aqliy modelimizni tasdiqlash bilan barobar bo'ladi, deb aytdim. biz mualliflik qilayotgan va biznesning muhim kritik tarkibiy qismlari bo'lib, tasdiqlash tarafdori emas.

Sinov vositasi sifatida ishlatilganda masxara qilishning eng katta kamchiligi shundaki, muvaffaqiyat va muvaffaqiyatsizlikni simulyatsiya qilishda ham, mag'lubiyatlar - dasturchining kelajakdagi egiluvchanlik sarobidir, ular funktsiyalarni ishlab chiqish vaqtida onglarida tasavvur qila olmaydilar yoki hatto taxmin qila olmaydilar.

Endi bu muammoni ishlab chiqarishda tarmoq darajasidagi barcha nosozliklarni kuzatish orqali hal qilish mumkin, va shu sababli ushbu hisoblangan barcha holatlar hisobga olinishi uchun qo'shimcha zaxiralar bilan sinov to'plamini tuzing, ammo hisobga olish kafolatidan ko'proq. Tizim darajasida yuzaga kelishi mumkin bo'lgan har qanday xato uchun ushbu yondashuv, ehtimol, keyinchalik shunga o'xshash vazifani bajarish uchun turli xil masxaralar bilan shishirgan sinov to'plamiga olib keladi.

Sinov kodining texnik yuki haqida gapirganda, masxarabozlikning yana bir salbiy tomoni shundaki, ular test kodini haddan tashqari ko'p va / yoki tushunishni qiyinlashtirishi mumkin. Mening tajribamda, ayniqsa, barcha sinflar masxara qilinib, masxara qilish sinovga qaramlik sifatida kiritilsa, bu masala shunchaki ushbu sinfdagi biron bir usul bir necha marotaba yoki bir necha marta ishlatilganligini tasdiqlash uchun tasdiqlanishi uchun to'g'ri keladi. ma'lum parametrlar. Bunday masxara shakli ba'zi doiralarda xatti-harakatlarni tekshirish uchun keng qo'llaniladi.

Istehzo bilan tinchlik o'rnatish

Google-ning sinov blogidan sizning juftliklaringizni bilib oling

Soxta toshlar, butalar va soxta narsalar - bu "sinov dubllari" deb ataladigan narsadir. Yuqoridagi masxarabozliklar haqida yozganlarim asosan testning boshqa shakllariga ham tegishli. Ammo, bu masxara (va boshqa variantlar) hech qanday foyda keltirmaydi, deb aytmayman, yoki test sinovlari har doim sinov juftligi o'rniga I / O ni o'z ichiga olishi kerakligini aytmayman. Agar test bitta I / O operatsiyasidan iborat bo'lsa, qo'shimcha yon ta'sirlarni hisobga oladigan bo'lsa, bu test sinovlari qiymatini ko'rmayotganim sabablaridan biri bo'lsa, faqat I / O ni jalb qilish maqsadga muvofiqdir. nashr qilish-obuna ish oqimlarini shu tarzda).

Quyidagi topologiyani ko'rib chiqing - mikroservis arxitekturasining juda to'g'ri misolidir.

A xizmatining B xizmati bilan o'zaro aloqasi Redis va C xizmati bilan suhbatlashish B xizmatini o'z ichiga oladi. Ammo sinovdan o'tkaziladigan eng kichik birlik bu A xizmatining B xizmati bilan o'zaro aloqasi, va B xizmatiga qalbakilashtirish orqali o'zaro ta'sirni sinashning eng oson usuli. va A xizmatining soxta bilan o'zaro aloqasi. Shartnomani sinash ushbu turdagi integratsiyani sinash uchun ayniqsa foydali bo'lishi mumkin. Soundcloud kompaniyasi 300+ mikroservislarini sinab ko'rish uchun kontrakt sinovlaridan keng foydalanadi.

A xizmati ham Riak bilan suhbatlashadi. U erda sinovdan o'tkaziladigan eng kichik birlik A va Riak xizmati o'rtasidagi haqiqiy aloqani o'z ichiga oladi, shuning uchun sinov paytida mahalliy Riak misolini yig'ish mantiqiy.

GCP (yoki AWS yoki Dropbox yoki Twilio) kabi uchinchi tomon xizmatlari bilan integratsiyalashuv haqida gap ketganda, eng yaxshi stsenariy - bu sotuvchilar tomonidan taqdim etilgan til biriktirishlari yoki SDK-larni sinov to'plamiga kiritish uchun yaxshi soxta narsalar. Agar ushbu sotuvchilar haqiqiy API qo'ng'iroqlarini amalga oshirish imkoniyatini taqdim etsalar, ammo sinov yoki dummy rejimida bo'lsa, bu juda katta yordam beradi, chunki bunday moslashuvchanlik uni ishlab chiquvchilar tomonidan yanada aniqroq usulda sinab ko'rishlari mumkinligini ta'minlaydi. Masalan, Stripe, sinov rejimi tokenlarini taqdim etish orqali buni juda yaxshi bajaradi.

Ko'rib chiqilgan barcha narsalar, sinov dubllari sinov spektrida o'z o'rniga ega. Ammo ular birlik sinovlarini o'tkazishning yagona vositasi emas va menimcha, kam ishlatilganda yaxshi ishlaydi.

Birlik testlarining ko'pgina foydasiz tomonlari

Ushbu postda ilgari muhokama qilingan narsalardan ko'ra ko'proq narsani tekshirish kerak. Jihozlarni sinash mavzusida men mol-mulkka asoslangan testlar va xiralashgan narsalar haqida gaplashmasligim mumkin. Haskell-dagi QuickCheck kutubxonasi (o'sha vaqtdan boshlab Scala va boshqa tillarga tarjima qilinadi) va Python-dagi Gipoteza kutubxonasi tomonidan ommalashgan, mulk asosida test o'tkazish bir xil testni turli xil kirishlar bilan bir necha marta turli xil kirishlar bilan dasturchidan sobit to'plamni yaratishni talab qilmasdan bajarishga imkon beradi. sinov holatidagi kirishlar. Jessika Kerrda men mulkni sinash bo'yicha eng yaxshi suhbatni ko'rganman. Fred Xebertning ko'proq ma'lumot olishni istaganlar uchun ushbu mavzu bo'yicha to'liq kitobi bor va ushbu lavozimni sharhlashda mulkka asoslangan vositalarning turli xil yondashuvlari haqida ko'proq ma'lumot berilgan:

Mulkga asoslangan testda, vositalarning yaxshi qismi uni xiralashganga tenglashtiradi, ammo buni oq quti shaklida bajarishingiz mumkin bo'lgan burilish va nozik yondashuv bilan. Boshqacha qilib aytadigan bo'lsak, xiralashish tizimning bir qismi ishdan chiqishini yoki yo'qligini aniqlash bilan bog'liq bo'lib, mulkka asoslangan test tizimda muayyan xatti-harakatlar yoki qoidalar (xususiyatlar) to'plamini har doim ushlab turilishini tekshirishga harakat qiladi. Mulk sinovlari bo'yicha uchta katta oila mavjud:
- Haskell Quickcheck variantlari: Bular test sinovlarini o'tkazadigan ma'lumotlarni yaratish uchun tip darajasidagi ma'lumotlardan foydalanishga asoslangan. Ularning eng katta sotadigan joyi bu sizning qancha qamrab olishingizni va qancha misollar topish mumkinligini sinchkovlik bilan tekshirishdir. Muvaffaqiyatsiz aksincha misollar qanday soddalashtirishga doirani yo'naltirib, «qisqarishi» tufayli ularni miqyosni kengaytirish qiyin
 - Erlang QuickCheck variantlari: bular kompozitsion funktsiyalarga ega bo'lgan dinamik ma'lumotlar generatorlariga asoslangan. Asosiy Haskell Quickcheck-ning tip darajasidagi yondashuvi hanuzgacha mavjud, ammo ramkalar shuningdek, davlatga xos modellashtirish vositalariga ega. Uni tasvirlashning eng aniq usuli bu modelni tekshirish bilan barobar bo'lishi mumkin, ammo to'liq qidiruvni amalga oshirish o'rniga, ehtimoliy qidiruv amalga oshiriladi. Shunday qilib, biz noaniq joyni tark etamiz va butunlay boshqa sinov amaliyotlari oilasi bo'lgan modellarni tekshirishga yaqinlashmoqdamiz. Muayyan bulut provayderlari tomonidan mulkni sinab ko'rish va uni apparat xatolarini topishda ishlatgan muzokaralarni ko'rdim
 - Gipoteza: narsalarga o'ziga xos yondashuvga ega. U muzlatish mexanizmiga asoslangan bo'lib, unda ma'lumotlarning yaratilishi murakkablik darajasida yuqoriroq yoki pastroqqa ko'tarilishi mumkin bo'lgan bayt oqimiga asoslangan. Gipoteza qopqoq ostida qanday ishlashi bilan o'ziga xosdir va bu erda barcha variantlardan eng foydalisi. Ishlarning ishlashiga boshqacha yondashadi va men unchalik tanish emasman, lekin shuni aytish kerakki, bu Haskellning variantlaridan tashqari ko'proq narsani taklif qiladi.

Boshqa tomondan, notinch, bu dastur noto'g'ri bajarilishini tekshirish uchun bila turib yaroqsiz va keraksiz kirishlarni ovqatlantirish bilan bog'liq. Indeksdan tashqaridagi xatolar ko'pincha topilmaydigan xatolardir, ammo cheksiz pastadir, rekursiya chegarasi oshib ketganda, nolga bo'lingan va xotiradan tashqarida bo'lgan xatolar notekis sinovlarda yuzaga keladi.

Buzilish uchun turli xil vositalar mavjud - ular orasida afsonaviy salqin tovush chiqargichlar, shuningdek, manzilni tozalash vositasi, iplarni tozalash vositasi, xotira tozalash vositasi, aniqlanmagan xatti-harakatlarning tozalagichi va bir nechta nomlarni aytadigan oqish tozalash vositasi kabi vositalar mavjud.

Birlikni tekshirish, ma'lum bir kirish uchun kutilganidek biror narsa ishlashini tekshirishdan tashqari turli xil afzalliklarga ega bo'lishi mumkin. Sinovlar ilova tomonidan taqdim qilingan API uchun ajoyib hujjat sifatida harakat qilishi mumkin. Go kabi tillar, masalan, Test o'rniga misol bilan boshlanadigan funktsiyalar, har qanday paketning _test.go faylidagi oddiy testlar bilan bir qatorda, testlarni o'tkazishga imkon beradi. Ushbu misol funktsiyalari paketning sinov to'plamining bir qismi sifatida tuzilgan (va ixtiyoriy ravishda bajarilgan) va keyinchalik foydalanuvchilarga ularni test sifatida ishlatishga imkon beradigan paket hujjatlarining bir qismi sifatida namoyish etiladi. Ta'kidlanishicha, asosiy narsa bu:

Paket uchun bajariladigan hujjat bo'lishi, API o'zgarishi bilan ma'lumot eskirmasligini kafolatlaydi.

Birlik testlarining yana bir afzalligi shundaki, u dasturchilarga ma'lum bir dizayn bosimini iste'mol qilish oson bo'lgan tarzda API tuzilishi uchun sarflaydi. Google-ning sinov blogida "Bezovtalikni O'zgartirish vositasi sifatida" deb nomlangan ajoyib yozuv bor, u API mualliflaridan soxta dasturlarni taqdim etishni talab qilishda og'riqni yo'q qiladi va ularni API iste'molchilariga hamdard qiladi.

Men 2016-yilda San-Frantsiskoda Python Twisted uchrashuvlarini boshqarganimda, ko'pincha Twisted-da voqea aylanishini global qilish xato bo'lgan edi (Python 3 asinsiyada takrorlanib kelganda). Amalga oshirish, bu Twisted hamjamiyatining xafagarchiliklariga olib keladi) va har ikkala xizmat uchun asosiy interfeyslarni ta'minlaydigan Reaktor (sinov tarmoqlari, voqea-hodisalar dispetcherligi va shu kabilarni o'z ichiga olgan holda) sinovdan o'tkazishda ham, ishlatishda ham oson bo'lgan. ) iste'molchilarga aniq bog'liqlik sifatida berildi.

Shunga qaramay, yaxshi API dizayni va yaxshi sinov ikkita mutlaqo mustaqil bo'lgan maqsadga muvofiqdir va bu etarli darajada sinovga ega bo'lmagan, aql bovar qilmaydigan va intuitiv API-ni loyihalash uchun juda mumkin, lekin tavsiya etilmasa ham. Ammo keng tarqalgan holda, yuz foiz kodni qamrab olishga intiladigan (chiziq qamrovi, filial qamrovi yoki boshqa shu kabi to'siqlar) o'lchanadigan, ammo oldindan abstrakt va DRY-to-up bo'ladigan API-ni loyihalashtirish mumkin. - nomuvofiqlikning yarqiragan artefakti. Uyoqqa asoslangan blokni sinovdan o'tkazish, albatta, yaxshi API dizaynini yaratishda yordam berishi mumkin, lekin bu kod kutilganidek o'zgarib turishini aniq belgilab qo'ymaydi.

VCR - yoki test javoblarini takrorlash yoki keshlash

Men mutlaqo bema'nilik deb biladigan narsaga istehzolarning o'ziga xos mo'rtligi berilgan, ba'zi bir jamoalar buni bir qadam oldinga surib, javoblarni yozib olish va sinash uchun saqlashni talab qilmoqdalar. Men shunchaki integratsiya testlarini tezlashtirish uchungina samarasiz deb hisoblayman (agar bu usullardan birini qo'llasa, bu integratsiya sinovi emas), lekin ba'zi birlar shu usulda birlik sinovlarini tezlashtirishga harakat qilishganda. Sinov muvaffaqiyatsizligini tuzatish paytida qo'shimcha qo'shimcha qatlamlar bilan ishlov berishda ishtirok etadigan kognitiv ortiqcha muammolarga loyiq emas.

Integratsiya sinovi

Agar zarbalar bilan jihozni sinovdan o'tkazish mo'rtligi va sezgirligi yo'q bo'lsa, demak integratsiya sinovi barcha kasalliklarni davolay oladimi?

Ilgari, men quyidagilarni aytdim:

Men ba'zi odamlar ushbu ikki bayonotda ajralib turadigan qarama-qarshilikni ko'rsatish uchun menga murojaat qilishgan edi, chunki bir tomondan men birlik sinovlari o'rniga ko'proq integratsiyalashuv sinovlarini o'tkazishga chaqirayotgan edim, ammo boshqa tomondan ham integratsiya sinovlari haqida bahslashdim. taqsimlangan tizimlar uchun kengaytirib bo'lmaydigan edi. Bu qarashlar bir-biriga zid emas va ehtimol mening birinchi fikrim bu erda aniqroqlikni talab qiladi.

Mening argumentimning asosiy tomoni, bu test sinovlari oxir-oqibat testlar tomonidan butunlay rad etilgani emas edi, ammo sinov ostida "birlik" ni to'g'ri aniqlay olish, bu birlik testi an'anaviy ravishda "odatiy" deb qabul qilinadigan narsaga o'xshashligini qabul qilishni anglatishi mumkin. integratsiya testi "tarmoq orqali aloqani o'z ichiga oladi.

Eng ahamiyatsiz stsenariylarda xizmat bitta ma'lumotlar omborida ishlaydi. Bunday holatlarda, sinov ostidagi bo'linmas birlik I / U xizmatchisini birlashtirishi kerak. Boshqa paytlarda, bitimlar taqsimlanadi, bunda sinov ostida bitta birlik qanday bo'lishi kerakligi hal qilinadi. Men bilaman, taqsimlangan sagalar bilan shug'ullangan yagona kompaniya Uber va men u erda ishlaydigan do'stlarimdan sinovni qanday o'tkazayotgani haqida so'rasam, "bundan buyon ham qiyin bo'lib qolmoqda". Xayoliy ravishda, agar men ushbu yangi xizmatda ushbu naqshni ishlatgan bo'lsam, taqsimlangan bitim to'g'ri bekor qilinganligini yoki kompensatsiya bitimi kutilganidek qo'llanilganligini tekshirish uchun soxta yoki soxta usullardan foydalanish istiqboli . Sinov ostidagi jihoz uzoq muddatli bitimga aylanadi.

Voqealar manbasi - quyoshda vaqt o'tkazish va Kafkaning mashhurligi oshib boradigan odat. Buyruqlar bo'yicha so'rovlar bo'yicha javobgarlik segregatsiyasi tartibi (uning aksil-antilassiyalarning adolatli ulushisiz) deyarli o'n yildan beri mavjud bo'lib, davlat o'zgarishini (yozilishini) davlatning qaytarilishidan ajratish tushunchasiga tayanadi (o'qiydi). Ko'pincha me'yoriy bo'lmagan arxitektura naqshlari to'g'risida muzokaralarda men etishmayotgan narsa kodlar darajasida masxara qilishdan va tizim darajasida oxir-oqibat testlardan tashqari bu kabi arxitekturalarni sinab ko'rishning eng yaxshi usullari.

Odatda, bunday tekshirishni to'liq to'kilgan integratsiya testiga qoldirish, nafaqat fikr-mulohaza aylanishini sekinlashtiradi, balki sinov tizimining raqobatdoshi yoki hatto undan ham oshib ketadigan darajada murakkab bo'lgan integral sinov apparati uchun kafolat bo'lib xizmat qiladi, bu juda ko'p sonli tizimni talab qiladi. ko'tarish uchun muhandislik tsikllari (va, ehtimol, butun jamoa).

Murakkab tizimlar uchun integratsiya testlarining yana bir kamchiligi shundaki, u keyinchalik ishlab chiqish, sinovdan o'tkazish va / yoki sahnalashtirish uchun alohida muhitlarni talab qiladi. Ko'pgina tashkilotlar ushbu muhitlarni bir xil va iloji boricha ishlab chiqarish bilan "sinxron" saqlashga harakat qilishadi, bu odatda barcha jonli trafikni test klasteriga takrorlashni o'z ichiga oladi (yoki hech bo'lmaganda yozadi), sinov muhitidagi doimiy do'konlar ishlab chiqarish bilan mos keladi. Qanday qilib bo'lmasin, bu avtomatlashtirishni (va xodimlarni) kuzatib borish va xizmat ko'rsatishga katta mablag 'sarflashni talab qiladi.

Ushbu cheklovlar va muammolarni inobatga olgan holda, integratsiya testlarini qanday qilib eng yaxshi yaratish to'g'risida har qanday munozaralar murosani o'z ichiga oladi va men "qadam-baqadam qoida" deb nomlagan narsaga erishish mumkin deb o'ylayman.

Qadam ko'tarish qoidasi

Men "bosqich sinovlari" degan atamani aniqladim, bu umumiy g'oyani ilgari surilganidan yuqoriroq bir qavatda sinab ko'rish. Ushbu model bo'yicha birlik sinovlari integratsiya testlariga o'xshaydi (I / O-ni blokning bir qismi sifatida chegaralangan kontekstda ko'rib chiqish orqali), integratsiyalash testi haqiqiy ishlab chiqarishga nisbatan sinovga o'xshaydi va ishlab chiqarishda sinov ko'proq o'xshaydi. , quduq, monitoring va qidirish. Taqsimlangan tizimlar uchun qayta tuzilgan sinov piramidasi (sinov huni?) Quyidagicha ko'rinishi mumkin:

Tarqatilgan tizimlar uchun sinov piramidasi

Buni real dunyo stsenariysida qanday qo'llash mumkinligini bilish uchun keling, imgix-da xizmatlarning juda soddalashtirilgan arxitekturasidan (men barcha qo'llab-quvvatlanadigan ma'lumotlar omborlarini, kuzatish vositalarini va boshqa uchinchi tomon integratsiyalarini qoldirib yuborganman) foydalanaman. So'nggi ikki yil davomida vaziyatni o'rganish uchun yaxshi tomonlarni jalb qilishdi. Quyida tavsiflangan narsa butun infratuzilmaning kichik bir qismi, bundan tashqari, men uchun chegaralar juda konservativ ekanligini oldindan aytib berish juda muhimdir. Agar biz ushbu talablarni inobatga olishning iloji bo'lmaganda ajratamiz. Masalan, yuklarni muvozanatlashtiruvchi taqsimlangan fayl tizimi yoki tarqalgan ko'p darajali keshlash tizimi bo'lishi mumkin emas, shuning uchun bu tizimlar har xil.

Har bir xizmat haqiqatan ham nima qilishining ahamiyati yo'q, bundan tashqari ularning barchasi turli xil tillarda yozilgan turli xil xizmatlarga ega. Ushbu xizmatlarning barchasi xizmatlarni ochish uchun Konsuldan foydalanadi. Ushbu xizmatlarda turli xil joylashtirish kadrlari ham mavjud - markaziy API serveri (oxirgi versiya versiyasi bilan) kuniga bir necha marta joylashtiriladi, G xizmati esa har yili ikki marta foydalaniladi.

API xizmatini ishlab chiqishda ushbu xizmatlarning barchasini mening mahalliy Macbook-ga yig'ish tushunchasi ravshan (va yo'q, men buni qilmayman). Ushbu xizmatlarning barchasini sinov muhitida yig'ish va har bir qurilish uchun integratsiya sinovlarini o'tkazish bir xil darajada oson. Buning o'rniga, har bir xizmatni sinab ko'rish to'g'risida qaror, har bir xizmatning funktsional imkoniyatlari, kafolatlari va foydalanish rejimini hisobga olgan holda, ma'lum savdo-sotiq va tikish orqali amalga oshiriladi.

Birlik testlari integratsiya testlariga o'xshaydi

Markaziy API serverining 80% funktsional imkoniyatlari MongoDB bilan aloqa qilishni o'z ichiga oladi va shu sababli bir qator sinovlar amalda mahalliy MongoDB instansiyasiga ulanishni o'z ichiga oladi. Service E - bu uchta manbadan kelib chiqqan holda, markaziy API-ning turli nusxalarigacha trafikni muvozanatlashtiradigan LuaJIT-ning ishonchli vakili. E xizmatining eng muhim qismlaridan biri bu har bir konsulni tomosha qilish uchun tegishli ishlov beruvchini chaqirishini ta'minlash va shu sababli ba'zi bir birlik sinovlari bola bilan aloqa qilish uchun konsul jarayonini faollashtiradi va keyin jarayonni o'ldiradi. sinov tugaydi. Bular integratsiya sinovlari natijasida puristlar tomonidan sinab ko'rilishi mumkin bo'lgan birliklarni sinash turi bilan yaxshiroq sinovdan o'tgan ikkita xizmat.

Integratsiya testi ishlab chiqarishda sinovga o'xshaydi

G, H, I va K xizmatlarini batafsil ko'rib chiqaylik (yuqoridagi diagrammada ko'rsatilmagan).

Servis G - bu Kafeda mavzusiga obuna bo'lib, foydalanuvchi tomonidan boshqariladigan yangilanishlardan foydalanish va H, I xizmat va K xizmatlarini qayta yuklash uchun Kafka mavzusiga obuna bo'lgan yagona jarayon. G xizmati H, I va K-ning har bir qabul qiluvchi xizmatiga joylashtirilgan va har qanday vaqtda bizda G xizmatining 15-20 holati mavjud (diagrammada faqat 7 ta ko'rsatilgan). G xizmatining asosiy vazifasi Kafka mavzusidan tashqarida ishlatiladigan xabarlarning H, K va I xizmatlariga tarqatilishini ta'minlashdir.

H, K va men barchamiz mustaqil xizmatlarmiz. Service H bu ochilgan (noshukurlik, aniq bo'lishi kerak) ommaviy ravishda tarqatiladigan tizimning old tomoni (diagrammada ko'rsatilmagan), uning markazida taqsimlangan fayl tizimi yotadi, bundan tashqari LevelDB kesh orqali yozish, MySQL metadata do'koni, Go-da yozilgan meta-ma'lumot izdoshlari, fayl tayyorlovchilar va fayllarni yig'uvchilar. Service K barcha maqsadlar va maqsadlar uchun HAProxy va men xizmat LuaJIT HTTP serveridir. Bundan tashqari, H, I va K servislari Kafkadagi konfiguratsiya yangilanishlarini birlashtirishlari kerak, ammo minnatdorchilik bilan biz mustahkamlik kafolatlariga muhtoj emasmiz.

Shunday savol tug'iladi - bu tizimlarning hodisaviy muvofiqligini qanday qilib sinab ko'rish kerak?

Ushbu xizmatlarni sinab ko'rish usuli bu xizmatlarning barchasini kontsertga yig'ish va Kafka mavzusida biron bir nashrni to'g'ri G xizmatidan foydalanishni tekshirish, so'ngra H, I xizmatlarini to'g'ri ishlatish uchun tekshirish uchun emas. va K ushbu konfiguratsiyani birlashtirish. Bu narsa, hatto "sinov muhitida" tasdiqlangan bo'lsa ham, ishlab chiqarishning to'g'riligini aks ettirmaydi, ayniqsa:

- K xizmati HAProxy (va HAProxy-ning haqiqiy nol ishlamay qolishi yaqin vaqtgacha haqiqatan ham hech narsa emas edi)
 - ishlab chiqarishdagi H xizmati bir sekundda yuzlab (ba'zan minglab) so'rovlarga xizmat qiladi, ularni sinov muhitida osongina qayta tiklab bo'lmaydigan, jihozlash va yuklarni ishlab chiqarishni avtomatlashtirishda. Bundan tashqari, n ningx asosiy xizmat jarayoni H ni qayta yuklash bir nechta yangi ishchi jarayonining boshlanishiga olib kelishini tekshirishimiz kerak. H xizmatining ma'lum bir ishlab chiqarish muammosi shundaki, nginx bosh jarayonini vaqti-vaqti bilan qayta yuklash eski ishchi jarayonlarning o'z vaqtida o'ldirilishiga olib kelmaydi, bu esa eski ishchilarni ish tirokida osib qo'yishiga va transport xizmatiga xizmat qilishiga olib keladi, nginx rasmiy blogining paydo bo'lishi. "juda kam" deb nomlangan:

Juda kamdan-kam hollarda, NGINX ishchi jarayonlarining ko'plab avlodlari ulanishlar yopilishini kutib turganda paydo bo'ladi, ammo ular ham tezda hal qilinadi.

Amalda, hech bo'lmaganda HTTP2-da, "kamdan-kam", yaqin vaqtgacha bunday bo'lmagan, va mening tajribamga ko'ra, nginx ishchilarining ishdan chiqishi va o'ldirilishini kuzatib borish bu muammoni hal qilish edi. H, I va K uchta xizmatining konvergentsiya ortda qolishi - bu yana bir bor kuzatiladigan va ogohlantirishga tayyor bo'lgan narsa.

Bu integratsiyalashgan sinovdan foyda ko'rmaydigan va monitoring yaxshi ishlagan tizimga bitta misol. Bu barcha muvaffaqiyatsiz rejimlarni integratsiya sinov muhitida simulyatsiya qilishimiz mumkinligi aniq bo'lsa-da, baribir monitoringni talab qiladigan narsa bo'lib qolaveradi va integratsiya sinovlari bu erda bizga taqdim etgan foyda keltirmaydi. boshidan arziydi.

Xizmat ko'rsatish vositalari yordamida trafikni shakllantirish

Yangi paydo bo'ladigan xizmat tarmoqlari paradigmasidan juda xursand bo'lganimning sababi shundaki, proksi-server trafikni testlarni o'tkazish uchun juda qulay tarzda yaratishga imkon beradi. Proksi-serverga trafikni sahnalashtirish instansiyasiga yo'naltirish uchun ozgina mantiq bilan (bunga barcha nooziq-ovqat so'rovlarida yoki kirish so'rovining IP manziliga asoslangan HTTP sarlavhasini o'rnatish kabi sodda narsa bilan erishish mumkin), Bitta xizmatni hisobga olmaganda, barchasini real ishlab chiqarish stajidan foydalanish mumkin. Bu ishlab chiqarish xizmatlari bilan haqiqiy integratsiya sinovlarini o'tkazish imkoniyatini yaratadi, shunchaki sinov muhitini ta'minlamasdan.

Albatta, men xavfsizlikka, ma'lumotlarning yaxlitligiga va hokazolarning bexavotirligi to'g'risida yozyapman, lekin chin dildan ishonamanki, jonli trafik sinovi o'tkazilayotgan testlarning ta'siriga yaxshi kuzatib borilishi mikroservislarni sinash uchun oldinga qo'yilgan yo'ldir.

Sinovning ushbu modeliga kirish, xizmatlar o'rtasidagi yaxshi izolyatsiyani rag'batlantirish va yaxshiroq tizimlarni loyihalashda qo'shimcha foyda keltiradi. Muhandislardan xizmatlar ichidagi bog'liqlik va bu ma'lumotlarning yaxlitligiga qanday ta'sir qilishi mumkinligi to'g'risida yaxshilab o'ylashlarini talab qilish bu me'moriy dizaynning toza bosimi. Bitta xizmatni boshqa barcha ishlab chiqaruvchilarga qarshi sinab ko'rish, shuningdek, testdagi xizmat uning yuqoriga yoki pastga qarab bog'lanishiga hech qanday nojo'ya ta'sir ko'rsatmasligini talab qiladi, bu men uchun juda oqilona dizayn maqsadi bo'lib tuyuladi.

Xulosa

Ushbu xabarning maqsadi boshqa bir sinov turini boshqasi uchun bahslashmaslik edi. Men deyarli har qanday narsada tajribali mutaxassis emasman va birinchi bo'lib mening fikrlashim men ishlagan tizimlarim, cheklovlarim bilan bog'liq bo'lganimni tan olaman (asosan juda vaqt va mablag'lar cheklangan) va men ishlagan kompaniyalarning tashkiliy dinamikasi. Ehtimol, men ushbu lavozimga tayinlagan narsalarimning har biri turli xil kontekstlarda turli xil stsenariylarda suvni ushlab turmasligi mumkin.

Spektrni sinash qanchalik kengligini inobatga olgan holda, uni to'g'ri amalga oshirishning hech qanday to'g'ri yo'li yo'q. Har qanday yondashuv murosaga va savdoga murojaat qilishni o'z ichiga oladi.

Oxir oqibat, har bir alohida jamoa o'ziga xos kontekst va ehtiyojlarni hisobga olgan holda mutaxassis hisoblanadi.

Fikrlash tashqi manbadan tashqarida bo'lishi mumkin emas.