1. Loyihaning tug'ilish sababi va texnologiyalarni tanlash
So'rovnoma xizmati bemorlar tomonidan to'g'ridan-to'g'ri taqdim etiladigan natijalarni (PRO, Patient-Reported Outcome) muhokama qiluvchi tibbiy so'rovnoma platformasining asosiy xizmati bo'lib, so'rovnoma shakllarini aniqlashdan tortib, yuborish, javoblarni yig'ish va muddatni tugatishgacha, so'rovning butun hayot tsikllarini nazorat qiladi. Baholash, statistik ma'lumotlarni tayyorlash esa alohida metrik xizmatga, xabarnomalar, muloqot va SMS/elektron pochta yuborish esa alohida aloqa xizmatiga topshirilib, ushbu xizmat 'so'rovnoma ma'lumotlarini aniqlash va yig'ish' deb nomlanuvchi bitta vazifaga diqqatni jamlash uchun rejalashtirilgan.
Ko'p miqdordagi ichki mikroservislar va tashqi meros tibbiy ma'lumotlar tizimlari (EMR) bilan integratsiyalashgan muhitda ma'lumotlarning to'g'ri va kengaytirilganligini ta'minlash maqsadida, quyidagi texnologik stekni strategik ravishda tanladik.
• Java 21 & Spring Boot 3.5.13 : Eng so'nggi LTS ishga tushirish va ishonchli Spring ekotizimiga asoslanib, xizmatning ishonchliligini ta'minladik.
• Spring Cloud 2025.0.0 (OpenFeign) : Mikroservislar o'rtasida sinxron muloqotni deklarativ usulda qayta ishlaymiz, bu esa o'qish mumkinligini va qo'llab-quvvatlashni oshiradi.
• PostgreSQL & JPA/Hibernate & QueryDSL 5.0 : Murakkab so'rovnoma domen modelini ob'ektga yo'naltirilgan tarzda boshqaramiz va tipga mos dinamik so'rovni amalga oshiramiz. JSON ustunlari hypersistence utilities yordamida qayta ishlanadi, bu esa o'zgaruvchan so'rovnoma xususiyatlarini moslashuvchan saqlash imkonini beradi.
• Apache Kafka : Xizmatlar o'rtasida asinxron voqea muloqoti orqali bog'liqlikni kamaytiradi va oxirgi yaxlitlikni ta'minlaydi.
• OAuth2 va Keycloak: Tarqatilgan muhitda birlashtirilgan autentifikatsiya (SSO) va ruxsat uchun sanoat standarti OAuth2 protokoli qo'llanildi.
• Redis · ShedLock · MapStruct · Jasypt: Kesh, tarqatilgan reja to'sig'i, ob'ektni xaritalash, sozlashni shifrlash kabi ish faoliyatining barqarorligini ta'minlash uchun qo'shimcha texnologiyalar joriy qilindi.
2. Asosiy texnologiyalarni qo'llash va arxitektura loyihalash
2.1 Domen markazli ko'p modul va geksagonal arxitektura
Biznes mantiqni texnik qaramliklardan himoya qilish uchun, domen markazida ko'p modul tuzilmasini qabul qildik. Bu geksagonal (port-adapter) arxitektura g'oyasini aks ettiradi, asosiy domen mantiqi domain modulida jamlangan va ma'lumotlar bazasi saqlash (store-jpa) yoki tashqi xizmatlar bilan integratsiya (proxy) o'zgartirilishi mumkin bo'lgan adapterlarga ajratilgan.
Xizmat 9 ta moduldan iborat: domain (domen modeli·port), store-jpa (saqlash adapteri), proxy (tashqi integratsiya·voqealar tarqatish adapteri), feature (foydalanish holati), facade (REST·voqealar qabul qilish), client/event (boshqa xizmatlar iste'mol qiladigan shartnoma·voqealar artefakti), scheduler (to'plam), boot (jamlash·kirish nuqtasi). Foydalanish holati qatlaming faqat domen interfeysiga bog'liqligi va haqiqiy amalga oshirish boot modulida in'ektsiya qilinishi (DIP) natijasida, integratsiya obyekti o'zgarsa ham, asosiy mantiq o'zgarmasdan qoladi.
2.2 CQRS asosidagi buyruq (Command)/so'rov (Query) mas'uliyatini ajratish
Yozish va o'qish talablari turli bo'lgan so'rov domeni xususiyatlariga mos ravishda CQRS usuli qo'llanildi. Ma'lumotlarni o'zgartirish normalizatsiyalangan buyruq modeli (cm_* jadval) orqali amalga oshiriladi va so'rovlar ekranga moslashtirilgan notekis so'rov modelida (qm_* ko'rinish) ishlanadi. Ikkita model voqealar orqali sinxronlashtirib natijaviy muvozanatni ta'minlaydi.
Shu bilan birga murakkab ro'yxat·qidiruv so'rovlari buyruq tranzaksiyalariga yuklamaydi va so'rov modelini ekran talablarga muvofiq ravishda erkin notekislashtirishga imkon beradi. Buyruqlarni tanlash doimo eng so'nggi qiymatni ta'minlaydigan buyruq modeliga asosan olib borilib, integratsiya integratsiyasi ta'minlandi.
2.3 Ko'p ipotokilik va yumshoq o'chirish orqali ma'lumotlarni ajratish·himoya qilish
Bir nechta tibbiyot muassasalari·davolash bo'limlariga bitta platformani bo'lishadigan muhit uchun, umumiy asosiy entitiylar tenant identifikatori (muassasa/davolash bo'limi/bosqich) barcha ma'lumotlarga avtomatik ravishda kiritilishi uchun loyihalangan. Shu yo'sin ilova kodining aralashuvisiz tenant darajasida ma'lumotlar ajratiladi.
Shuningdek, barcha sub'ektlar jismoniy o'chirish o'rniga amal qilish belgisi orqali yumshoq o'chirishni qo'llagan holda, o'chirilgan ma'lumotlar ham audit kuzatuvini amalga oshirish imkonini beradi va tibbiy ma'lumotlarning tarixiy saqlash talablari qondirildi.
3. Asosiy funksiyalarni amalga oshirish va muammolarni hal etish tajribasi
3.1 So'rov formasining xavfsiz versiya boshqaruvi (Master/Snapshot naqshi)
So'rov formasida ish jarayonida tez-tez o'zgartirishlar bo'lsa-da, allaqachon yuborilgan va bemor javob bergan so'rov yuborilgan paytdagi forma bilan mosligi saqlanishi kerakligi qiyin talab edi. Bu muammoni 'Master/Snapshot' naqshi bilan hal qildik.
• Tahrirlash (Master): Muallif Master formasini erkin tahrirlaydi. Master hozirgi faol Snapshot'ni ko'rsatadigan ko'rsatkichga ega.
• E'lon qilish (Publish): E'lon qilish vaqtida Master'ning mazmunini takrorlaydigan o'zgarmas (immutable) Snapshot yaratadi. Keyin yuboriladigan so'rovlar ushbu Snapshot'ga bog'lanadi.
• Javoblarning mosligini ta'minlash: Bemor javoblari har doim yuborish vaqtidagi Snapshot'ni ko'rsatadi, shuning uchun forma keyinchalik o'zgarganda ham o'tgan javoblarning ma'nosi yo'qolmaydi.
E'lon qilishdan oldin tasdiqlash uchun oldindan ko'rinish chiqarish, tahrirlangan nusxalarni Master'ga birlashtirish jarayonlarini birgalikda amalga oshirib, ishlab chiqarish jarayonida uzluksiz forma yangilanishi va ma'lumotlar yaxlitligini bir vaqtning o'zida ta'minladik.
3.2 So'rov yuborish·taqsimlash va javoblarni yig'ish hayotiy davri
Soʻrovlarni o'tkazish 'taqsimlash → ish → holat' bosqichlari asosida modellashtirilgan. Taqsimlash (kim kimga qanday jadvalda yuboradi) orqali alohida bajargan birlik bo'lgan ishlar yaratiladi va ishning rivojlanish holati (boshlanmadi/yarim saqlash/taklif/natija va boshqalar) alohida holat konteyneri bilan boshqariladi.
Javoblar savol turiga qarab, sub'ektiv bo'lsa qiymat sifatida, objektiv bo'lsa tanlovlar to'plami sifatida ajratilib saqlangan bo'lib, keyingi baholash va statistika bir xilda muomala qilinishi uchun normalizatsiya qilindi. Shuningdek, soʻrovni tugatish/majburiy tugatish/muddati o'tganini alohida ishlash holatlari sifatida aniqlik bilan ajratilgan, va rejalashtiruvchi tugatish, muddati o'tgan va aloqa tugashini avtomatik ravishda amalga oshirib, operatsion yukni kamaytirdi.
3.3 Tashqi meros tibbiy ma'lumotlar tizimi integratsiyasi
Mavjud tibbiy muassasalar meros EMR bilan integratsiyalashgan, ammo mikroservislar o'rtasida jismoniy tashqi kalit (FK) qo'yilmay, faqat ID asosida mantiqiy murojaat qilish prinsipi amal qilingan. Tashqi tizim integratsiyasi alohida adapter servisi REST (Feign) orqali amalga oshirilib, tashqi tizimlarning o'zgarishi asosiy domenlarga to'g'ridan-to'g'ri kirishini oldini olish maqsadida powiza (ACL) qatlami shakllantirilgan.
Meros tizimi tomonidan beriladigan identifikatsiya raqamlarini javoblarni saqlash paytida moslashtirib, ikkita tizim o'rtasida ma'lumotlarni muvofiqlikda bog'lab qo'ydi va integratsiya amalga oshirish strategiya (Strategy) naqshiga yoki abstraktsiyaga keltirildi, kelajakda boshqa muassasa yoki tizimlar qo'shilganda, asosiy mantiqni o'zgartirmasdan kengaytirish imkonini berdi.
4. Infrastrukturani va operatsiyalarni samarali qilish
4.1 Apache Kafka orqali xizmatlar o'rtasidagi bog'liqlikni bartaraf etish
Domenada ma'noli hodisalar yuzaga kelganda (shablon e'lon qilish, soʻrov yuborish, javobni tugatish, ishni yakunlash va h.k.), bu hodisalar domen hodisasi sifatida e'lon qilinadi. Baholash va statistika servisi va xabarnoma/chat servisi faqat zarur hodisalarni obuna qilib, o'z mas'uliyatlarini bajaradi, shuning uchun xizmatlar o'rtasida to'g'ridan-to'g'ri chaqiruv bog'liqligi olib tashlanadi va bir tomondagi nosozlik boshqa tomonga tarqalmaydi.
Aksincha, foydalanuvchi/organizm ma'lumotlaridagi o'zgarish hodisalari ushbu xizmatda obuna bo'lib, ko'rinish modellari yangilanadi, shuning uchun ustuvor ma'lumotlar bilan natijaviy muvofiqlik saqlanadi. Standart tibbiy ma'lumotlar almashuv formati (FHIR) o'zgartirilishi uchun hodisalar ham birga e'lon qilinib, tashqi bog'lanish kengaytirilishiga erishildi.
4.2 Operatsion barqarorlik infrastruktura (Redis · ShedLock · Outbox)
• Redis kesh: Tez-tez ko'riladigan umumiy ma'lumotlarni keshda saqlash (TTL qo'llaniladi) orqali ko'rish samaradorligini oshirdi va ma'lumotlar bazasi yukini kamaytirdi.
• ShedLock : Ko'p instansiya muhitida tugatish va jo'natish kabi rejalashtiruvchi takroriy ishlarni amalga oshirmaslik uchun tarqatilgan qulflash orqali ishning yagonaligini ta'minladik.
• Outbox pattern: Umumiy kutubxonaning outbox patterndan foydalangan holda, ma'lumotlar o'zgarishi va voqealar e'lonini bitta tranzaktsiyada birlashtirib, voqealarni yo'qotmasdan ishonchli taqdimotni amalga oshirdik.
4.3 Xavfsizlik va autentifikatsiya
Tashqi kirish nuqtalari OAuth2 Resource Server bilan himoyalangan bo'lib, faqat tasdiqlangan tokenlarni (JWT) ruxsat beradi va rol asosidagi kirish nazorati orqali bemor, tibbiyot xodimi, operator va administrator huquqlarini ajratib qo'ydi. Xizmatlar o'rtasidagi ichki chaqiriqlar client_credentials usuli asosidagi xizmat tokenlari Feign interseptori tomonidan avtomatik tarzda to'ldiriladi, shunda biznes mantiqi autentifikatsiya kodidan ajratilgan holda loyihalashtiriladi. Ma'lumotlar bazasiga kirish ma'lumotlari kabi sozlamalarning nozik qiymatlari shifrlangan (Jasypt) holda saqlanadi va malumotlar, ichki endpointlar faqat ish yuritish muhit o'zgaruvchilari orqali kiritiladi, shuning uchun manbada ochiq ko'rsatilmaydi.
4.4 Shartnoma asosidagi modullarni tarqatish strategiyasi
Boshqa xizmatlar ushbu xizmatni chaqirish uchun muloqot shartnomasini (Feign interfeysi) va obuna bo'ladigan voqea sxemasini har birini client/event moduliga ajratib, korxona artefaktlari omboriga tarqatamiz. Sarf tomoni xizmatlari bu artefaktni bog'lanish sifatida oladi va ishlatadi, shuning uchun API o'zgarishlari kompilyatsiya vaqtida yuzaga keladi va integratsiya barqarorligi oshadi.
5. Xulosa va natijalar
So'rovnoma xizmati so'rovnoma ta'rifidan tortib to'plab olishga qadar barcha hayotiy davrni yagona mas'uliyatga jamlagan holda, baholash va xabardor qilish kabi keyingi ishlarni voqealar orqali ajratib, kengaytirilish va barqarorlikni bir vaqtda ta'minlagan misoldir.
• Ma'lumotlar butunligi: Master/Snapshot patterni orqali format o'zgarganda ham o'tgan javoblarning to'g'riligini saqlab qoldik.
• Birlashtiruvchilarni bartaraf etish: Kafka hodisa asosidagi asinxron muloqot bilan xizmatlar o'rtasidagi bog'liqlikni kamaytirish va nosozlikni izolyatsiya qilishga erishildi.
• Kengayishni ta'minlash: Geksagonal ko'p modulli va ko'p ijarachilik dizayni bilan yangi integratsiya obyekti yoki joriy tashkilotlarning ortishi bilan asosiy mantiqni o'zgartirmasdan moslashuvchanlikni ta'minlovchi asos yaratildi.
Ushbu loyihadan olingan soha markazli dizayn, CQRS, hodisa asosidagi arxitektura tajribasi kelajakda murakkab sohalarni muhokama qilishga qaratilgan turli tizimlar dizayni va qurilishida asosiy aktiv bo'ladi.
conley