Microservice Architecture va SOA asoslari orasidagi farq

Mikroservis arxitekturasi va SOA farqlari

Mikro xizmatlar endi qizib ketmoqda, sohaning mashhur kontrasti "Monolitik yagona dastur" deb nomlanadi va o'nlab yillar oldin ko'p sonli tizimlar tarqaldi, keyin mikro-xizmatlar yangi tushuncha va original sifatida farqlanadi. taqsimlangan tizim yoki SOA (Service Oriented Architecture) o'rtasida?

Avval bir xil fikrni ko'rib chiqaylik:

  • Dinamik xizmatlarni ro'yxatdan o'tkazish mexanizmini amalga oshirish uchun Registrni talab qiladi;
  • Tarqatilgan taqsimot, CAP printsipi, ikki bosqichli majburiyat bajarilishini kafolatlay olmaydi, tranzaktsiyalarni qoplash mexanizmi ko'rib chiqilishi kerak;
  • Sinxron yoki asenkron xabarlar, xabarlarning ishonchliligini qanday ta'minlash mumkin? SOA ESB tomonidan barcha xabarlarga birlashtirilgan;
  • Birlashtirilgan shlyuz interfeyslarni yig'ish va tartibga solish, autentifikatsiya qilishning yagona mexanizmini joriy qilish va APPdan tashqi foydalanish uchun RESTful interfeysni ta'minlash uchun talab qilinadi.
  • Xuddi shu narsa, joylashishni aniqlash tizimidagi muammoni qanday hal qilish kerakligiga, jurnalni kuzatishni qanday amalga oshirishga e'tibor berish kerak, xuddi telekom sohasi o'n yildan ortiq signalni kuzatish funktsiyasini bajarganidek;

Xo'sh, farq qaerda?

  • Doimiy integratsiya va doimiy ravishda tarqatishmi? CI, CD (uzluksiz integratsiya, uzluksiz tarqatish) uchun bu chaqqon va DevOps bilan birlashtirilgan. Menimcha, bu mikroservis texnologiyasiga qaraganda dasturiy ta'minot muhandisligi sohasiga ko'proq moyildir;
  • Turli xil aloqa protokollaridan foydalanish boshqami? Mikro-xizmatni taqqoslash protokoli RESTful bo'lib, an'anaviy SOA odatda SOAP hisoblanadi, ammo hozirgi vaqtda ko'plab engil RubC, Thrift, gRPC ramkalar mavjud va Bahor Bulutidagi Feign tizimi standart RESTfulni kodga o'zgartiradi. API kabi RPC harakati, ushbu aloqa protokollar mikroservis arxitekturasi va SOA o'rtasidagi asosiy farq bo'lmasligi kerak;
  • Bu konteyner asosiga yoki virtual mashinaga asoslanganmi? Docker va virtual mashinalar hali ham asosiy farqlardan emas, balki arxitekturani amalga oshirish usulidir;

Mikroservis arxitekturasining mohiyati bo'linishdir

  • Xizmat segmentatsiyasida katta farq mavjud. SOA dastlab "integratsiyalashgan" texnologiya sifatida ishlab chiqilgan. Ko'pgina texnik echimlar yangi xizmatlarning ushbu xizmatlardan qayta foydalanishi uchun korxonaning ichki xizmatlarini alohida jarayonga aylantiradi. Ushbu xizmatlar, ehtimol ta'minot zanjiri va CRM kabi juda katta zarralar bo'lishi mumkin. Ushbu turdagi mikro-xizmatlar uning kesilishiga alohida e'tibor qaratganligi va murosaga kelmasligini anglatadi. Ko'pgina holatlar shuni isbotladiki, agar sizning segmentatsiyangiz noto'g'ri bo'lsa, unda siz "past ulanish, modernizatsiya ta'sir qilmaydi, yuqori ishonchlilik" afzalliklariga ega bo'lmaysiz va bu "Monolitik" dan foydalanishdan ko'ra ko'proq muammolarga olib keladi. .
  • Saqlashni ajratmaydigan mikroservislar soxta xizmatlardir: Amalda, biz ko'pincha arxitekturani ko'ramiz, bu erda orqa omborxona hamma joyda va bitta ma'lumotlar bazasida, faqat oldingi ishbilarmonlik mantig'i turli xil xizmat jarayonlariga bo'linadi, mohiyati. Monolitik singari, modullar orasidagi protsess qo'ng'irog'ini protsesslararo qo'ng'iroqlar bilan almashtirish kabi, bu birinchi bo'linish taqsimlanmagan, taqsimlangan birinchi tamoyilni buzgan, modul ulanishi hal qilinmagan va ishlashga ta'sir qiladi.

Tarqalgan dizaynning birinchi printsipi - "Ob'ektlaringizni taqsimlamang"

  • Mikroservislar uchun "Micro" so'zi iloji boricha kichkina emas, balki SOA kabi qo'pol tanlangan xizmatdir. Bizga kichikroq va mos keladigan teranlik kerak. Ushbu Micro cheksiz emas.

Agar biz kichkina / mikro xizmatlar bilan ikki tomonlama (sinxron) aloqani birlashtirsak va "1 sinf = 1 xizmat" tamoyiliga amal qilsak, biz Corba, J2EE va tarqatilgan ob'ektlardan foydalanib, haqiqatan ham XX asrga qaytamiz. Yoshi Afsuski, yangi avlod ishlab chiqaruvchilari taqsimlangan ob'ektlar bilan tajribaga ega emas edilar, shuning uchun ular bu fikrning qanchalik yomonligini anglamadilar. Ular tarixni takrorlashga harakat qilishdi, ammo bu safar ular RMI yoki IIOP ni HTTP bilan almashtirish kabi yangi texnologiyalardan foydalanishdi. .

Microservices va domenlar uchun mo'ljallangan dizayn

Oddiy kitoblarni boshqarish tizimi, albatta, mikroservislar arxitekturasini talab qilmaydi. Mikro-servis arxitekturasi qabul qilinganligi sababli, duch kelgan muammoli maydon, umuman, elektron tijorat va CRM kabi nisbatan katta bo'lishi kerak.

Xizmatni qanday qismlarga ajratish kerak?

Xizmatni qismlarga ajratish uchun qanday usul ishlatiladi? Soha 1 sinf = 1 xizmat, 1 usul = 1 xizmat, 2 ta Pitsa jamoasi, 2 hafta qayta yozilishi mumkin va hokazolar bilan mashhur, ammo bu amalga oshirish uchun asos yo'q. Biz dasturiy ta'minotni loyihalashning ba'zi usullarini izlashimiz kerak. Ob'ektga yo'naltirilgan va dizayn naqshlari uchun muammo maydoni modul bo'lib, funktsional dasturlash tushunchasi kod darajasining mikro darajasida ko'proq.

Erik Evansning "Domen boshqaradigan dizayn" kitobi mikroservis arxitekturasi uchun juda yaxshi ma'lumotnomadir. Ushbu kitobda domenlar va sub'ektlar o'rtasidagi munosabatlar va xatti-harakatlarga katta muammolar maydonini ajratadigan usul taklif qilinadi. Hozirgi vaqtda bu split muammoning eng oqilona echimi. Chegaralangan kontekst (bundan keyin milod deb ataladi) kontseptsiyasi yordamida biz amalga oshirish tafsilotlarini kapsülleyib, BC-ni SRP (yagona javobgarlik) ni amalga oshirishga imkon beramiz. )amalda. Har bir mikro-xizmat - bu dunyoda miloddan avvalgi jismoniy xaritadir, va BC fikriga mos keladigan mikro xizmatlar mustaqil va bir-biri bilan erkin bog'langan.

Mikro-servis arxitekturasi yaxshi narsa, bu har kimni dizayn dasturlarining ratsionalligiga e'tibor berishga majbur qiladi. Monolitikada domen tahlili va ob'ektga yo'naltirilgan dizayn yaxshi bo'lmasa, mikro-xizmat muammoni ikki baravar oshiradi.

Masalan, elektron tijoratdagi buyurtmalar va tovarlarning ikkita sohasida, DDD demontajiga ko'ra, ular ikkita mustaqil chegara konteksti bo'lishi kerak, ammo buyurtmada tovarlar bo'lishi kerak. Agar u ikki asrga bo'lingan bo'lsa, so'rov va qo'ng'iroqlar munosabatlari, hatto muammoli taqsimlangan bitimlar muammosi bilan birlashtirilib, qanday qilib bu birlashma ajratiladi? Miloddan avvalgi nazariyaga ko'ra, har xil asrlarda, hatto atamada ham uning diqqat markazida bo'lish bir xil emas. Miloddan avvalgi tovar belgilari, xususiyatlar, tafsilotlar va hokazolarga e'tibor qaratiladi (Aslida, BC tovarlari bu sohada narxlar, inventarizatsiya, reklama aktsiyalariga ega. Kutib turing, uni yagona BC sifatida ko'rib chiqish mantiqiy emas. misolni soddalashtiring, har kim avval tovarni BC tovarning asosiy ma'lumotlari deb hisoblaydi) va miloddan avvalgi tartibda tovarning inventarizatsiyasi va narxiga ko'proq e'tibor bering. Shuning uchun, haqiqiy kodlash dizaynida buyurtma xizmati buyurtma uchun mahsulot nomini, narxini va boshqa qiziqish belgilarini sotib olishga moyildir. Ushbu dizayn miloddan avvalgi tovarlar bilan kuchli birlikni ozod qiladi. Ikkala BC mustaqil xizmatlarni, ma'lumotlarni mustaqil ravishda saqlashni ta'minlashi mumkin.

Xulosa

Mikroservis arxitekturasiga e'tibor berish kerak bo'lgan birinchi narsa RPC / ServiceDiscovery / O'chirishni buzish tushunchalari, shuningdek Evrika / Docker / SpringCloud / Zipkinning texnik doirasi emas. Bu xizmat chegarasi va vazifalarni taqsimlashdir. Agar siz xatoni ajratsangiz, siz ko'plab xizmatlarga tushasiz. Takliflar va tarqatilgan bitimlar holatida, bu holda mikroservislar qulay emas, ammo qiyin.

DDD bizga oqilona bo'linishni keltirib chiqardi, ammo DDD tushunchasi juda ko'p, tushunish qiyin, asosiy fikrlarni qanday tushunish va mikro-servis arxitekturasidan oqilona foydalanish kerak?

Quyidagi me'moriy g'oyalar eng muhim deb o'ylayman

  • Kongestativ model
  • Hodisaga asoslangan

Yuqorida biz DDD mikro-servis o'rtasidagi munosabatlar haqida gaplashdik, ko'p odamlar hali ham juda xayoliy his qilishadi, DDD bu qadar murakkab nazariya, yig'ilgan ildizlar, qiymat ob'ektlari, hodisalarni kuzatish, biz nimadan boshlashimiz kerak?

Aslida, DDD ob'ektga yo'naltirilgan dizayn, dizayn naqshlari va boshqalar bilan uzviy bog'liqdir, agar siz OOA, OOD bilan tanish bo'lmagan bo'lsangiz, DDD ham yaxshi ishlatilmaydi. Biroq, ushbu OO nazariyalarini o'rganayotganda, odamlar ko'pincha foydasiz deb hisoblashadi, chunki Java dasturchilarining rivojlanish karerasining ko'p qismi ushbu qatlama nazariyasida J2EE klassik qatlamlash nazariyasini (Action, Service, Dao) o'rganishdan boshlanadi. Bunday holda bizda "xatti-harakatlar" deb ataladigan dizayn naqshidan foydalanish imkoniyati yo'q. Bu erda asosiy sabab J2EE klassik qatlamli rivojlanish usuli "kamqonlik modeli" dir.

Martin Fowler o'zining "Enterprise Application Architecture Patterns" nomli kitobida "anemiya modeli" va "tiqilib qolish modeli" ga mos keladigan ikkita "rivojlanish skriptlari" va "domen modelini" taklif qiladi.

Domenni rivojlantirish modeli

  • Domen modeli ma'lumot va xulq-atvorni qamrab oladi va uni real dunyo biznes ob'ektlariga xaritada joylashtiradi. Har bir turda mantiqni to'g'ri ob'ektlarga taqsimlashga imkon beradigan aniq vazifalar taqsimoti mavjud. Bunday ob'ekt “tiqilish modeli” dir.
  • Aniq amaliyotda biz domen modeli davlatga tegishli va haqiqiy narsani anglatadi degan tushunchani aniqlashtirishimiz kerak. Yuqoridagi misolga qaramay, biz fond ob'ektini tovarning haqiqiy inventarizatsiyasini namoyish etish va ob'ektga biznes mantig'ini qo'shish uchun loyihalashtiramiz.

Yagona blokirovka qilish inventarizatsiyasining biznes mantig'ini amalga oshirayotganda, har safar birinchi inventarizatsiya ob'ekti omborxonadan asosiy kalit yuklamasiga binoan tiklanishi kerak va keyin inventarizatsiya ob'ektining holatini o'zgartirish uchun tegishli qulflash (num) usulini bajaring. ob'ektni saqlashga yordam berish uchun Repository saqlash usulidan foydalaning.

Yuqoridagi operatsiyalar ketma-ketligi yakunlandi, Ilova, Ilova ushbu integral operatsiya uchun tashqi interfeysni ta'minlaydi.

Domen modelini ishlab chiqish usulining eng muhim jihati - bu biznes mantig'ini aks ettiruvchi inventarizatsiya ob'ekti bajarilishiga ajratish natijasida kelib chiqadigan davlat o'zgarishining tafsilotlarini kiritish.

Qo'llash ob'ektining qulflash usulini, bitim skript usulining StockService qulfi bilan taqqoslash mumkin. StockService barcha tafsilotlarni biladi. O'zgarish yuz bergandan so'ng (masalan, inventarizatsiya 0 ga kamaytirilishi mumkin), xizmat ko'rsatish usuli o'zgaradi; Inventarizatsiya ob'ekti ichida hisoblab chiqilgan ekan, yo'lni o'zgartirishning hojati yo'q. Kod to'g'ri joyda, hisoblash to'g'ri darajada va hamma narsa o'rinli. Ushbu dizayn juda chiroyli biznes mantig'iga erishish uchun turli xil OOD, OOP nazariyalaridan to'liq foydalanishi mumkin.

  • Tiqilish modelining kamchiliklari

Yuqoridagi misoldan, ish usulini bajarish uchun Repository yuklamasida va keyin uni tejash uchun ma'lum vaqt talab etiladi, lekin agar bir nechta iplar bir vaqtning o'zida inventarizatsiya inventarizatsiyasida qulfni talab qilsa, bu nomuvofiq holatga olib keladi. . Muammo shundaki, inventarizatsiya uchun bir vaqtning o'zida ishlov berish nafaqat qiyin, balki juda keng tarqalgan.

Anemiya modeli mutanosiblik uchun ma'lumotlar bazasining yordamiga to'liq tayanadi. Amalga oshirishni ancha soddalashtirish mumkin, ammo tiqilish modelini o'zi amalga oshirishi kerak. Xotiradagi qulflash ob'ekti yoki Redis-dan foydalanib masofadan qulflash mexanizmi orqali bo'ladimi, bu kamqonlik modeliga qaraganda ancha murakkab va ishonchlilik pasaymoqda. Tiqilish modeli bu qiyinchilik. Yaxshi yondashuv - hodisani boshqaradigan arxitektura orqali moslikni bekor qilish.

Domen modeli va Microservices o'rtasidagi munosabatlar

Yuqorida aytib o'tilganlar domen modelini amalga oshirish haqida gap boradi, lekin u va mikroservislar o'rtasida qanday bog'liqlik bor? Amalda, bu inventarizatsiya chegaralangan kontekstning to'plangan ildizidir. Biz agregat ildizni mikroservis jarayoni deb hisoblashimiz mumkin.

Biroq, muammo yana paydo bo'ladi. Inventarizatsiyani inventarizatsiya qilish mahsulot to'g'risidagi ma'lumotlar bilan bog'liq bo'lishi kerak. Inventarizatsiya qilishda ortiqcha mahsulot identifikatoriga ishonish etarli emas. Mahsulotning holati biznes-mantiq tomonidan talab qilinadi, shuningdek, ushbu mikroservisga Sku mahsuloti kabi og'ir ob'ekt kiritilmaganmi? Bitta xizmatda ikkita og'ir narsa? Bunday mikro-xizmatni ochib bo'lmaydi yoki tovarlar kutubxonasiga ishonish kerakmi? !

Yuqorida biz domenga asoslangan rivojlanish usulini qo'lladik, tiqilib qolish modelidan foydalandik va uning afzalliklaridan bahramand bo'ldik, ammo kamchiliklarga duch keldik. Ushbu kamchilik taqsimlangan mikroservis arxitekturasida kattalashtirilgan.

O'tkazmalarning izchilligi

Tranzaktsion tutarlılık masalasi Monolit davrida katta muammo emas, lekin mikroservislarda juda o'likdir. Keling, ACID deb nomlangan printsipni ko'rib chiqaylik.

  • Atomlik - atom, o'zgaruvchan ma'lumotlar holati birgalikda amalga oshiriladi yoki birgalikda muvaffaqiyatsiz bo'ladi
  • Muvofiqlik - muvofiqlik, ma'lumotlar holati to'liq va izchil
  • Izolyatsiya - izolyatsiya chiziqlari, bir vaqtning o'zida bitimlar mavjud bo'lsa ham, ular bir-biriga ta'sir qilmaydi
  • Chidamlilik - Bitim bajarilgandan keyin qaytarib bo'lmaydigan qat'iylik

Yagona xizmat va aloqador ma'lumotlar bazalari holatida ma'lumotlar bazasining xususiyatlari orqali ACIDni amalga oshirish oson. Ammo, siz DDD-ga binoan mikroservislarning umumiy arxitekturasini ajratganingizdan so'ng, ularning ma'lumotlar bazalari ajralib chiqadi va siz mustaqil ravishda tarqatilgan bitimlar bilan shug'ullanishingiz kerak va o'zingizning kodingizda ACID-ni qondirishingiz kerak.

Taqsimlangan bitimlar uchun odamlar, odatda, oldingi JTA standarti, 2PC ikki qismli majburiyat haqida o'ylashadi. Esimda, o'sha yili Dubbo guruhida odamlar har hafta Dubbo to'g'risida tarqatilgan bitimlarni qo'llab-quvvatlash to'g'risida so'rashgan. Aslida, taqsimlangan tizimlarda CAP printsipiga ko'ra, P (bo'linishga bardoshlik) paydo bo'lganda, C (mustahkamlik) ga intilish majburiy ravishda (A) mavjudligi va o'tkazuvchanlikning pasayishiga olib keladi. Hozirgi vaqtda biz kafolat berish uchun odatda yakuniy mustahkamlikdan foydalanamiz. Tizim AP imkoniyatlari. Albatta, C dan voz kechish emas, lekin umuman olganda, CAP qismlarga ajratishda biz yakuniy mustahkamlik orqali ma'lumotlarning barqarorligini ta'minlashimiz mumkin.

Masalan:

Elektron tijorat biznesida buyurtma muzlatilgan. Buyurtmaning inventarizatsiya holatiga muvofiq to'ldirilganligini aniqlash kerak.

Aytaylik, siz taqsimlangan tizimni qabul qildingiz, bu erda buyurtma moduli va inventarizatsiya moduli ikkita xizmat bo'lib, ularning har biri o'z saqlashiga ega (relatsion ma'lumotlar bazasi).

Ma'lumotlar bazasida tranzaktsiya ikkita jadvalni tuzatishi mumkin, ammo mikroservislarda buni amalga oshirishning iloji yo'q.

DDD kontseptsiyasida bitim faqat agregat ichidagi holatni o'zgartirishi mumkin. Agar bir nechta agregatlar bir xil holatga ega bo'lishi kerak bo'lsa, unda yakuniy mustahkamlik o'tkaziladi. Buyurtmalar va inventarizatsiya ikki xil chegaralangan kontekstga tegishli aniq agregatlardir. Yakuniy muvofiqlikka erishish uchun voqealarga asoslangan arxitektura talab qilinadi.

Hodisa yakuniy qat'iylikka asoslangan

Hodisaga asoslangan arxitektura asenkron xabarlar orqali domen ob'ektlari o'rtasida holatni sinxronlashtiradi. Ba'zi xabarlar bir vaqtning o'zida bir nechta xizmatlarga e'lon qilinishi mumkin. Xabar xizmatni sinxronlashtirishga olib kelgandan so'ng, u boshqa xabarni keltirib chiqarishi mumkin va voqea tarqaladi. Qat'iy aytganda, voqea drayverlari sinxron deb atalmaydi.

Masalan:

Buyurtma xizmati buyurtma qo'shgandan so'ng, buyurtmaning holati "yoqilgan" va keyin Buyurtma Yaratilgan hodisasi xabar navbatiga joylashtiriladi.

Buyurtma yaratilgan voqeani olgandan so'ng, inventarizatsiya xizmati sotiladigan tovar-moddiy zaxiralarni inventarizatsiya jadvalidagi ma'lum bir sku-dan ajratib oladi, buyurtmalarni to'ldirish inventarizatsiyasini ko'paytiradi va keyin inventarizatsiyadan himoyalangan voqeani xabarlar navbatiga yuboradi.

Buyurtma xizmati "Inventarizatsiya Qulflangan" hodisasini oldi va buyurtma holatini "tasdiqlandi" ga o'zgartirdi

Kimdir so'radi, agar inventarizatsiya muvaffaqiyatli bo'lmasa va qulf muvaffaqiyatsiz bo'lsa nima bo'ladi? Oddiy qilib, inventarizatsiya xizmati "Lock Fail" tadbirini yuboradi va buyurtma xizmati uni qabul qilgandan so'ng, buyurtma "bekor qilindi".

Yaxshi yangiliklar, biz qulflay olmaymiz!

Voqealar bilan bog'liqlik moslikni bekor qilishning katta afzalliklariga ega, barcha so'rovlar navbatga qo'yiladi, bu biz tiqilib qolish modelini amalga oshirishda juda foydali, biz o'zimiz xotiradagi qulflarni boshqarishimiz shart emas. Qulfni bekor qiling, navbatni qayta ishlash samaradorligi juda yuqori va hodisa drayveri skapping kabi yuqori kelishuv stsenariylarida ishlatilishi mumkin.

Ha, foydalanuvchi tajribasi o'zgargan,

Ushbu voqea asosida foydalanuvchi tajribasi o'zgarishi mumkin. Masalan, asl sinxronizatsiya tuzilishi stokda bo'lmaganda, u darhol shartni qondirmaslik va buyurtma berish mumkin emasligini va buyurtma yaratilmasligini aytadi. Shu bilan birga, voqea mexanizmi o'zgartiriladi va buyurtma darhol yaratiladi. Bir muncha vaqt o'tgach, tizim sizga buyurtmaning bekor qilinganligi haqida xabar beradi. Xuddi "tarozi telefoni" singari, yuzlab minglab odamlar navbatda turishibdi, ular uzoq vaqtdan beri zaxirada emasligini aytib, ertaga qaytib kelinglar. Agar siz foydalanuvchidan natijani darhol olishni istasangiz, unda siz bu haqda o'ylab ko'rishingiz mumkin. BFF-da (Backend For Frontend), soniy asenkronni oldingi sinxronizatsiyaga aylantirish uchun CountDownLatch-ning qulfidan foydalaning. Albatta, BFF iste'moli nisbatan katta.

Yo'q, mahsulot menejeri qabul qilmaydi,

Mahsulot menejerining ta'kidlashicha, foydalanuvchi tajribasi shuni anglatadiki, inventarizatsiya mavjud emas va buyurtma hosil bo'lmaydi. Ushbu dastur bekor qilingan buyurtmalarni doimiy ravishda ishlab chiqaradi. U qabul qila olmaydi. Nima qilishim kerak? Keyin, ro'yxatga buyurtma berishda, ushbu buyurtmalarni bekor holatida qoldiring, ehtimol buni amalga oshirish uchun sizga qo'shimcha ko'rinish kerak bo'ladi. Men idealist emasman. Mavjud muammoni hal qilish - men e'tiborga olishim kerak bo'lgan birinchi narsa. Mikroservislarni loyihalashning maqsadi biznesning mosligini hal qilishdir. Endi muammo foydalanuvchi tajribasi, shuning uchun arxitektura dizayni ham buzilishi kerak: (Ammo hech bo'lmaganda tahlildan keyin men qaerda murosaga kelganimni, nima uchun murosaga kelganimni va kelajakda o'zgarishi mumkinligini bilaman.

Multi-table Bir nechta maydonlardagi qo'shilish so'rovlari

  • Men shaxsan o'ylaymanki, agregat ildizning modeli holatni o'zgartirish uchun juda mos keladi, ammo qidirish ma'lumotlari uchun noqulay, masalan, mos keladigan buyurtmalar to'plamini filtrlash, yig'ma ildiz ob'ekti ommaviy so'rov vazifasini bajara olmaydi, chunki bu uning burchi emas. Keyin "Domen xizmati" vositasiga ishonishingiz kerak.

Agar usul ob'ektga yoki qiymat ob'ektiga joylashtirish uchun noqulay bo'lsa, domen xizmatidan foydalanish eng yaxshi echim bo'ladi. Domen xizmati fuqaroligi yo'qligiga ishonch hosil qiling.

  • Bizning so'rov vazifalarimiz odatda murakkabdir, masalan, buyumlar ro'yxatini so'rash, o'tgan oyda sotilgan narsalar bo'yicha saralashni talab qilish; mahsulotning qaytarilish darajasi bo'yicha saralash va boshqalar. Ammo mikroservis va DDD-dan keyin bizning saqlash modelimiz olib tashlandi. Yuqoridagi so'rovlar buyurtmalar, foydalanuvchilar va tovarlarning bir nechta sohalaridagi ma'lumotlar haqida. Qanday jalb qilish kerak? Bu erda biz qarash tushunchasini kiritmoqchimiz. Masalan, quyida, buyurtma qilish uchun foydalanuvchi nomining ishlashini so'rash, ikkita xizmatni to'g'ridan-to'g'ri xotiraga qo'shilish samaradorligini chaqirish, shubhasiz juda past, bundan tashqari ba'zi filtr sharoitlari, peyjinglarni amalga oshira olmaydi. Shunday qilib, biz tadbirni translyatsiya qilamiz, ushbu voqealarni qabul qilish uchun alohida ko'rish xizmati va materiallashtirilgan ko'rinishni shakllantiramiz, ma'lumotlar qo'shildi, ishlov berildi, alohida so'rov kutubxonasiga joylashtirildi, so'rovni kutmoqda, bu odatiy usul. vaqt uchun bo'sh joy.

Tahlildan so'ng, asosiy qidiruv kalitiga asoslangan yoki juda ko'p bog'liq bo'lgan so'rovga asoslangan oddiy ro'yxatga qo'shimcha ravishda, bizning ko'pgina so'rovlar topshiriqlari alohida so'rovlar kutubxonasiga joylashtirilishi mumkin, ushbu so'rovlar kutubxonasi nisbiy ma'lumotlar bazasining ReadOnly kutubxonasi bo'lishi mumkin NoSQL ma'lumotlar bazasi Aslida, biz ElasticSearch-ni loyihada ixtisoslashgan so'rov ko'rinishida ishlatganmiz, bu juda yaxshi ishlaydi.

Cheklangan kontekst va ma'lumotlarning bog'lanishi

Ko'p domenlarni birlashtirish muammosiga qo'shimcha ravishda, biz ko'pincha biznesdagi ba'zi sahnalarga duch kelamiz. Masalan, elektron tijoratdagi mahsulot - bu marketing xizmati, narx xizmati, xarid qilish vositasi xizmati bo'ladimi-yo'qmi, alohida BC va boshqa milodga tegishli bo'lgan asosiy ma'lumotlardir. Ushbu mahsulot haqida ma'lumot olish uchun buyurtma xizmatlari talab qilinadi. Biroq, mahsulot haqida kerakli ma'lumot uning faqat kichik bir qismidir. Marketing xizmati mahsulotning identifikatorini va nomini va javonlar holatini talab qiladi; buyurtma xizmati mahsulot identifikatorini, ismini, katalogini, narxini va boshqalarni talab qiladi. Bu mahsulot markaziga nisbatan mahsulotni (mahsulot identifikatori, nomi, spetsifikatsiyasi, spetsifikatsiya qiymati, tafsilotlar va boshqalar) kichik to'plami. Bu turli xil chegaralangan kontekstlar uchun bir xil terminologiyani aks ettiradi, ammo aytilgan tushunchalar boshqacha. Ushbu turdagi muammo bizning amalga oshirishimiz bilan taqqoslangan. Tovar modulini buyurtma va marketing modulida to'g'ridan-to'g'ri so'rash aniq emas.

  • Tovar markazlari har xil xizmat uchun zarur bo'lgan ma'lumotlarni moslashtirishi, turli xil interfeyslarni taqdim etishi kerak
  • Moslik katta bo'lishi kerak
  • Xizmatlar orasidagi ulanish juda jiddiy va buzilishlar va yangilanishlar ta'sir qilganda, ularning hajmi juda katta.

Xususan, birinchisi bizning mikroservislarni taqdim etishdagi ustunligimizni jiddiy ravishda cheklaydi. "Bo'shashgan holda, har bir xizmatni boshqa modullarga ta'sir qilmasdan tez-tez yangilab turish mumkin." Bu bizdan ushbu ulanishni demontaj qilish uchun turli xil BClarga ba'zi ma'lumotlarni to'g'ri etkazib berish uchun voqealarga asoslangan yondashuvni talab qiladi. Ushbu turdagi ulanish ba'zan ob'ektni yaratishda ortiqcha bo'lgan qiymat ob'ekti orqali ob'ektga joylashtiriladi. Masalan, mahsulot ishlab chiqarilganda buyurtma ortiqcha bo'ladi; ba'zan u qo'shimcha qiymat ob'ektlarining qo'shimcha ro'yxati orqali bo'ladi. Marketing markazi tegishli mahsulotlar ro'yxati ma'lumotlarining bir qismini haddan tashqari saqlaydi va nazorat ostidagi mahsulotlarning subordinatlari holatiga har doim e'tibor beradi va cheklanganlik nuqtai nazaridan mahsulotlar ro'yxatini sinxron ravishda o'zgartiradi.

Quyidagi rasmda buyurtma stsenariysi tahlili ko'rsatilgan. Elektron tijorat tizimida biz a'zolar va tovarlar barcha korxonalarning asosiy ma'lumotlari deb o'ylashimiz mumkin va ularning o'zgarishlari turli sohalarga tarqalishi kerak va har bir maydon kerakli ma'lumotlarni saqlab qoladi.

Barqarorlikni kafolatlang

Yakuniy mustahkamlik ko'plab sharoitlarga bog'liq

  • Xabarlarni etkazib berishning ishonchliligiga qarab, A tizim holatini o'zgartirishi mumkin va xabar B tizimiga yuborilganda yo'qoladi, bu esa AB holatining nomuvofiqligini keltirib chiqaradi.
  • Xizmatning ishonchliligiga qarab, agar A tizimi o'z holatini o'zgartirsa, lekin xabar yuborish uchun vaqt topmasa, u osadi. Shuningdek, bu nomuvofiq holatga olib keladi

Esimda, JavaEE spetsifikatsiyasidagi JMS ushbu ikkita muammoga ishlov berish talablariga ega. Ulardan biri shundaki, JMS turli xil tasdiqlash xabarlari (Client Acdiram va boshqalar) orqali xabarlarning ishonchliligini kafolatlaydi va JMS xabarlarini etkazib berish operatsiyalari ma'lumotlar bazasiga qo'shilishi mumkin. Tranzaktsiyada - ya'ni hech qanday xabar yuborilmaydi, bu ma'lumotlar bazasining orqaga qaytarilishiga olib keladi (ma'lumotlar topilmadi, aniq tavsif emas, iltimos, meni to'g'rilang). Shu bilan birga, hozirgi vaqtda JMS spetsifikatsiyasiga mos keladigan kam miqdordagi MQ mavjud, ayniqsa mustahkamlikni ta'minlash va ish faoliyatini pasaytirish uchun. Endi yuqori o'tkazuvchanlikdagi MQ bu muammoni o'z dasturimizga yuklamoqda. Shunday qilib, yakuniy mustahkamlikni yaxshilashning bir necha keng tarqalgan usullari.

Mahalliy tranzaktsiyalardan foydalaning

Yuqoridagi buyurtmadan kreditni ajratib olish misolini olish

  • Buyurtma xizmati avval buyurtmani qo'shib, mahalliy tranzaktsiyani boshlaydi;
  • Keyin Buyurtma Yaratilgan hodisani maxsus Voqealar jadvaliga joylashtiring, bitim topshiriladi;
  • Voqealar jadvalini vaqti-vaqti bilan skanerlaydigan, uni supurib tashlagan va MQ-ga yuboradigan va Voqeani "yuborilgan" qilib belgilaydigan alohida vaqtinchalik vazifa mavjud.

Yechimning afzalligi shundaki, mahalliy ma'lumotlar bazasi tranzaktsiyalari qo'llaniladi. Agar voqea muvaffaqiyatli qo'shilmagan bo'lsa, buyurtma yaratilmaydi. Ip skanerlangandan so'ng, voqea yuboriladi va xabar yashirin bo'lmaydi. Bizning maqsadimiz yaxshiroq bo'lish. Qayta yuboring, uni o'tkazib yubormang, chunki Voqealarni qayta ishlash idempotent sifatida ishlab chiqiladi)

Kamchilik shundaki, hodisani qayta ishlashni biznes mantig'ida alohida qayta ishlash kerak, bu noqulay va unutish oson; tadbirni yuborish biroz kechiktirilgan; skanerlashning vaqtincha ishlashi qimmatga tushadi va yuqori darajadagi suv sathi ma'lumotlar bazasiga yashirin xavf tug'diradi;

Ma'lumotlar bazasiga tegishli MySQL Binlog (Alining kanali) yoki Oracle-ning GoldenGate texnologiyasidan foydalangan holda ma'lumotlar bazasi voqealar jadvali haqida ma'lumot olish uchun ozgina yaxshilandik, shuning uchun vaqtni belgilashda skanerdan qochishingiz mumkin.

Shu bilan birga, ushbu ma'lumotlar bazasi jurnallaridan foydalanadigan vositalar ma'lum ma'lumotlar bazasini amalga oshirish bilan bog'lanadi (hatto aniq versiyalari ham), shuning uchun qaror qabul qilishda ehtiyot bo'ling.

Event Sourcing hodisasi bilan tanishish

Voqealarni kuzatish biz uchun alohida g'oyadir. Entity ob'ektini davom ettirish o'rniga, u har bir o'zgarishning boshlang'ich holatini va hodisasini qayd etadi, va Xodisaga ko'ra ob'ekt ob'ektining so'nggi holatini tiklaydi. Redolog ma'lumotlar bazasini amalga oshirishga juda o'xshash, ammo u ushbu mexanizmni dastur sathiga kiritdi.

Hodisaning kuzatilishi ko'plab afzalliklarga ega bo'lsa-da, ushbu texnologiyani joriy etish alohida e'tibor talab qiladi. Birinchidan, u ko'pchilik biznes stsenariylari uchun mos emas. Ko'p o'zgarishlarni amalga oshirgandan so'ng samaradorlik haqiqatan ham katta muammodir; boshqa so'rovlar ham muammoli.

Biz yakka tartibdagi korxonalarda faqat Tadbir Souring va AxonFramework-dan foydalanamiz. Amalga oshirishning murakkabligi sababli, muayyan vaziyat amaliyotdan biroz vaqt o'tguncha kutish kerak. Ehtimol, batafsil ma'lumot berish uchun qo'shimcha maqola kerak.