1. Kirish
Hujjatlar boshqaruvi tizimida bir nechta hujjatlarning ma'lumotlarini chiqarib olish va ularga asoslanib qo'shimcha sun'iy intellekt ishlov berish funksiyalari mavjud edi.
Ayniqsa foydalanuvchilar bir nechta hujjatni tanlaganida, tizim har bir hujjatning mazmunini Markdown shaklida o'zgartirib, keyingi tahlil yoki qayta ishlash ishlari uchun AI serveriga yuborishga mo'ljallangan edi.
Dastlabki funktsiyani amalga oshirish bosqichida funktsiyaning o'zini birinchi navbatda to'liq bajarishga e'tibor qaratilganligi sababli, hujjatni qayta ishlash mantiqi nisbatan oddiy tuzilishga ega bo'lib ishlab chiqilgan.
Ya'ni, so'rov kelib tushganda hujjatlarni birma-bir ketma-ket qayta ishlash va barcha hujjatlarni qayta ishlagandan so'ng AI serveriga so'rovni yuborish usuli edi.
Funksiya o'zi normal ishlashiga qaramay, haqiqiy ish muhitida samaradorlik muammolari asta-sekin ko'rinib boshladi.
Xususan quyidagi vaziyatlarda muammolar chuqurlashdi.
- Foydalanuvchilar bir vaqtning o'zida bir nechta hujjatlarni so'rayotganida.
- Hujjat hajmi kattayu
- Markdown o'zgartirish ish vaqti uzoqlashayotgani
- AI so‘rovidan oldin kutish vaqti uzoq bo‘lganda.
Muammo asosiy jihati hujjat soni oshgani sari umumiy javob vaqti chiziqli ravishda oshayotganida edi.
Misol uchun, bitta hujjatni qayta ishlash taxminan 500ms davom etsa, 10 ta hujjat bo'lganda, umumiy qayta ishlash vaqti oddiy summaga ko'ra bir necha soniyadan ko'proqqa oshdi.
Xususan, Markdownni chiqarish vazifasi I/O va ma'lumotlarni qayta ishlash ishlarini o'z ichiga olganligi sababli, qayta ishlash vaqti hech qanday tarzda qisqa bo'lmagan.
Natijada, foydalanuvchilar AI funktsiyasining o'zi emas, balki "hujjat tayyorlash jarayoni"da uzoq kutish vaqtini his qildilar va bu butun foydalanuvchi tajribasining pasayishiga olib keladi.
Shuningdek, server tomondan bitta so'rov uzoq vaqt davomida band bo'lib, resurslardan foydalanish samaradorligi pasayishi muammosi paydo bo'ldi.
Shu sababli loyiha oddiy funktsiyalarni amalga oshirish darajasidan oshib, tuzilgan ishlashni yaxshilash zarurligini aniqladi.
ayniqsa, bir vaqtning o'zida bir nechta mustaqil ishlarni bajarish imkonini beruvchi asinxron asosida parallel qayta ishlash tuzilmasini joriy etishga qaror qilindi.
2. Mavjud tuzilma va muammo holati
Mavjud tuzilma juda an'anaviy ketma-ket ishlashga asoslangan usul edi.
So'rov oqimi quyidagicha ishladi.
1. Mijoz so'rovini qabul qiladi.
2. Birinchi hujjatning Markdownini chiqarish.
3. Ikkinchi hujjatning Markdownini chiqarish.
4. Uchinchi hujjatning Markdownini chiqarib oling.
5. Barcha hujjatlarni qayta ishlashni tugatdik.
6. AI серверга so'rov yuboriladi.
7. Natijalarni qabul qilish uchun javob qaytariladi.
Ya'ni, bitta hujjat qayta ishlangandan so'ng keyingi hujjatni qayta ishlash tuzilmasi edi.
Bu usulning oddiy amalga oshirilishi afzalligi bor edi. Shuningdek, istisno ishlov berish oqimi ham nisbatan intuitiv tarzda tuzilishi mumkin edi.
Lekin haqiqiy ishqor muhitida quyidagi samaradorlik muammolari yuzaga keldi.
Birinchi muammo javob vaqti oshishi edi.
Hujjatlar soni ortishi bilan, qayta ishlash vaqti deyarli proporsional ravishda oshdi.
Masalan, bitta hujjatni qayta ishlashga 1 soniya vaqt ketadigan bo'lsa, quyidagi natijalar ochiqlandi.
- 1 ta hujjat taxminan 1 soniya davom etadi.
- 5 ta hujjat taxminan 5 soniya davom etadi.
- 10 ta hujjat taxminan 10 soniya talab qiladi.
Ya'ni, umumiy ishlov berish vaqti oddiy qo'shiladigan tuzilma edi.
Ikkinchi muammo server resurslaridan foydalanishning samarador emasligi edi.
Haqiqiy hujjatlarni qayta ishlash vazifalari bir-biridan mustaqil edi.
Ya'ni, hujjat Ani ishlov berayotganda hujjat Bni kutish uchun hech qanday sabab yo'q edi.
Ammo mavjud tuzilishda bitta ip oqimida barcha ishlar ketma-ket bajarildi.
Natijada CPU va ip resurslaridan yetarlicha foydalana olmagan samarali bo'lmagan tuzilma yuzaga keldi.
Uchinchi muammo foydalanuvchi tajribasining yomonlashishi bo'ldi.
Foydalanuvchilar AI funksiyalaridan ko'ra Markdown-ni chiqarib olishni kutish vaqtini uzoqroq his qilishdi.
Ayniqsa, hujjatlar soni ko'paygan sari UI javob berish kechikishi kuchayib, ba'zi foydalanuvchilar tizim to'xtab qolgan deb o'ylashdi.
To'rtinchi muammo kengaytirilishning yo'qligida edi.
Loyihaning o'sishi bilan ishlov berish kerak bo'lgan hujjatlar soni o'sishi ehtimoli yuqori edi.
Biroq mavjud tuzilma talablarining ko'payishiga juda moyil edi.
Oxir-oqibat, oddiy funksiyani amalga oshirishdan oshib, tuzilmaning o'zini parallel ishlov berish asosida o'tkazish zarurati aniq bo'ldi.
3. Asinxron qayta ishlashga asoslangan tuzilmalarni takomillashtirish
Muammoni hal qilish uchun loyiha hujjatlar bo'yicha Markdownni chiqarish ishlarini asinxron asoslangan parallel qayta ishlash tuzilmalariga o'tkazdi.
Asosiy g'oya juda oddiy edi.
“Har bir hujjatni qayta ishlash bir-biridan mustaqil, shuning uchun ularni bir vaqtda qayta ishlash mumkin” degan gap edi.
Ya'ni, mavjud bo'lganidek, bitta so'rov oqimida ketma-ket ishlash o'rniga, har bir hujjatni qayta ishlash vazifasini alohida asinxon vazifalariga ajratdik.
Yaxshilangan tuzilma quyidagi oqimda ishladi.
1. Mijoz so'rovini qabul qilamiz.
2. Huquqlar bo'yicha Markdown chiqarish ishlarini yaratamiz.
3. Har bir vazifani parallel ravishda bajaradi.
4. Barcha vazifalar tugagunga qadar kutishadi.
5. Natijalarni yig'aman.
6. AI serveriga so'rov yuboraman.
7. Javob qaytariladi.
Loyihada Spring Framework-ning @Async funksiyasidan foydalanib, asinxron ijro tuzilmasini yaratdik.
Har bir hujjatni qayta ishlash usuli alohida asinxon ipda bajarilishi uchun mo'ljallangan.
Ya'ni, 10 ta hujjat so'rov qilinganida, 10 ta ish bir vaqtda bajarilishi mumkin bo'lgan tuzilmaga ega edi.
Albatta oddiy parallel ijro etish yetarli emas edi.
Eng muhim narsa "barcha ishlar tugagandan so'ng keyingi bosqichga xavfsiz o'tish" edi.
Buni amalga oshirish uchun CompletableFuture'dan foydalandim.
Har bir asinxron vazifa CompletableFuture shaklida qaytarildi va oxirgi bosqichda CompletableFuture.allOf() dan foydalanib, barcha vazifalar tugallangan paytni aniq sinxronlashtirdim.
Bu tuzilish tufayli quyidagi effektlarni olishga muvaffaq bo'ldim.
- Mustaqil ishlarni bir vaqtda bajarish imkoniyatiga egaman.
- Umumiy ishlov berish vaqtini qisqartirish mumkin.
- CPU resurslaridan foydalanish samaradorligini oshirish mumkin.
- Javob kechikishlarini kamaytirishi mumkin.
Xususan, avval hujjatni qayta ishlash vaqti oddiy yig'indiga teng bo'lsa, yaxshilanishdan so'ng umumiy javob vaqi eng uzoq davom etadigan ish vaqti atrofida belgilanadi.
Masalan, 10 ta hujjatni har biri 1 soniyada ishlov berish kerak bo'lsa, mavjud tuzilmada taxminan 10 soniya talab qilinardi, ammo parallel ish yuritish tuzilmasida bu taxminan 1-2 soniyagacha qisqarishi mumkin edi.
4. Qo'llaniladigan texnologiyalar va amalga oshirish usuli
Ushbu ishlashni yaxshilashda asosiy foydalanilgan texnologiyalar Spring-ning @Async va Java CompletableFuture edi.
Birinchidan, @Async Spring Framework tomonidan taqdim etilgan asinxron qayta ishlash imkoniyatidir.
Aynan metodga @Async ni e'lon qilsangiz, ushbu metod alohida ipda asinxron ravishda bajariladi.
Loyihada hujjatga xos Markdown chiqarish metodiga @Async qo'llandi.
Bu orqali har bir hujjatni qayta ishlash ishlarining bir-biridan mustaqil ravishda parallel ravishda bajarilishi uchun tashkil etildi.
Masalan, quyidagi shaklda amalga oshirish mumkin edi.
- extractMarkdownAsync(document) ni chaqiradi.
- CompletableFuture
- parallel bajarish tuzilmasi bilan ishlaydi.
Lekin oddiy @Async orqali umuman oqimni boshqarish qiyin edi. Har bir ishning tugash vaqtini aniq boshqarish zarur edi.
Buni hal qilish uchun CompletableFuture ni faol ravishda foydalanishga harakat qildik.
CompletableFuture - bu asinxron ishlar natijasini ifodalovchi ob'ekt bo'lib, bir nechta ishlarni tugatishni birlashtirish yoki sinxronlashtirish uchun juda kuchli funksiyalarni taqdim etadi.
Loyihada u quyidagi tarzda ishlatilgan.
- Hujjatlar bo'yicha asinxron vazifalarni yaratadi.
- CompletableFuture ro'yxatini to'playdi.
- CompletableFuture.allOf() orqali to'liq tugashni kutyapmiz.
- Natija ma'lumotlarini to'playmiz.
Xususan, CompletableFuture oddiy Future'dan ancha moslashuvchan oqimni boshqarishni amalga oshirishga imkon beradi.
Masalan, quyidagi kabi funktsiyalarni osonlikcha amalga oshirish mumkin edi.
- Tugagacha bo'lgan ishlarni bog'lash mumkin.
- Tasodifiy muammolarni hal qilish zanjirini tuzish mumkin.
- Parallel vazifalarni birlashtirish mumkin.
- Asinxron oqimlarni boshqarish mumkin.
Shuningdek, parallel ishlashni joriy etishda ip havzasini boshqarish ham muhim bo'ldi.
Cheksiz parallel bajarish, aslida tizim yukini oshirishi mumkin.
Shu sababli loyiha to'g'ri ThreadPoolTaskExecutor tashkil qilib, maksimal parallel ishlar sonini chekladi.
Buning yordamida ortiqcha parallel qayta ishlashdan kelib chiqadigan tizimning beqarorligini oldini olish mumkin bo'ldi.
5. E'tiborga olish va ishlash barqarorligi
Asinxron muloqot va parallel ishlash tuzilmasi samaradorlik nuqtai nazaridan juda kuchli afzalliklar taqdim etsa-da, shu bilan birga ish faoliyatining murakkabligini ham oshiradi.
Shu sababli, loyihada faqat tezlikni oshirish emas, balki barqaror ish tuzilmasini ham hisobga oldik.
Birinchidan, e'tiborga olingan qism iplar to'plamini boshqarish bo'ldi.
Parallel ishlarni shunchaki oshirish, aslida ish faoliyatining pasayishiga olib kelishi mumkin.
Masalan, quyidagi muammolar yuzaga kelishi mumkin.
- Ip vaqt o'tkazish faoliyati orqali ko'proq iplar yaratilishi mumkin.
- CPU kontekst almashinuvi oshishi mumkin.
- Xotira iste'moli oshishi mumkin.
- Server yuklanishi oshishi mumkin.
Shuning uchun loyiha server spetsifikatsiyasi va o'rtacha so'rovlar sonini inobatga olib, mos ip havzasining hajmini belgiladi.
Ikkinchi hisobga olish masalasi istisno qilingan edi.
Parallel ishlov berish muhitida ba'zi vazifalar faqat muvaffaqiyatsiz bo'lishi mumkin.
Masalan, 10 ta hujjatdan 1 tasi faqat muvaffaqiyatsiz bo'lishi mumkin.
Ushbu holatda, umumiy talabni muvaffaqiyatsiz deb hisoblash yoki faqat ayrim muvaffaqiyatli natijalarni ishlatish bo'yicha siyosat kerak edi.
Loyihada, istisnolar yuzaga kelganda, umuman oqimga ta'sirini minimallashtirish uchun tuzilmani loyihalashtirdik.
Bundan tashqari, CompletableFuture ning istisno bilan ishlash funksiyasidan foydalanib, asinxron vazifa istisnolarini ishonchli tarzda boshqarishga erishdik.
Uchinchisi, bajarilish vaqtida sinxronizatsiya edi.
Paralel ishlov berishda «barcha vazifalar aniq tugatilgandan so'ng, keyingi bosqichga o'tish» juda muhimdir.
Agar ba'zi vazifalar tugashidan oldin AI serverining so'rovi yuzaga kelsa, ma'lumotlarning muvofiqlik muammolari paydo bo'lishi mumkin.
Shuning uchun loyiha CompletableFuture.allOf() asosidagi tuzilmani ishlatish orqali umumiy tugash vaqtini aniq nazorat qildi.
To'rtinchisi monitoring va izlanish edi.
Asinxron tuzilma log oqimining tarqalishi sababli, muammo sababini tahlil qilish qiyinlashishi mumkin.
Buni hal qilish uchun ishlar bo'yicha loglar va ishlov berish vaqtini kuzatish imkonini beruvchi tuzilma tayyorladik.
Bu orqali ma'lum hujjatlarni qayta ishlash kechikishi yoki istisno vaziyatlarini tezda aniqlash mumkin bo'ldi.
6. Takliflar va xulosa
Asinxron qayta ishlashga asoslangan tuzilma joriy etilgandan so'ng, loyiha bir necha jihatdan sezilarli ishlash yaxshilanishlarini ko'rdi.
Eng avvalo, his etilgan jihat javob berish vaqtining qisqarishi bo'ldi.
Mavjud tuzilishda hujjatlar soni oshgani sayin, qayta ishlash vaqti chiziqli ravishda oshgan bo'lsa, takomillashtirgandan keyin parallel qayta ishlash tuzilishi tufayli umumiy javob vaqi ancha qisqartirildi.
Ayniqsa, hujjatlar soni ko'p bo'lsa, takomillashtirish effekti yanada ko'proq namoyon bo'ldi.
Masalan, avval dokumentlar 10 ta bo'lsa, jarayon bir necha soniyadan ko'p vaqt olardi, lekin parallel ishlaridan keyin ancha qisqa vaqt ichida bajarilishi mumkin edi.
Ikkinchisi esa server resurslaridan foydalanish samaradorligini oshirish edi.
Mavjud tuzilishda ketma-ket qayta ishlash natijasida CPU va ip resurslaridan to'liq foydalanish imkoniyati bo'lmagan.
Boshqa tomondan, yaxshilanishlardan so'ng bir nechta vazifani bir vaqtning o'zida bajarish orqali tizim resurslaridan ancha samarali foydalanish imkoniyati paydo bo'ldi.
Uchinchi foyda foydalanuvchi tajribasini yaxshilash edi.
Foydalanuvchilar tezroq javob tezligini his qilishdi va AI funksiyalaridan foydalanish jarayonida kutish stressi ham sezilarli darajada kamaydi.
To'rtinchisi struktural kengayish edi.
Ushbu tajriba orqali men asinxron ishlov berish va parallel ishlov berish tuzilmalari nafaqat oddiy ish faoliyatini yaxshilashda, balki kelajakda kengayish nuqtai nazaridan juda muhim dizayn usuli ekanligini his qildim.
Xususan, quyidagi sharoitda juda samarali ekanligini tasdiqladik.
- Mustaqil ish ko'p bo'lgan tuzilma.
- I/O qayta ishlash ulushi yuqori bo'lgan tuzilma.
- Bir nechta so'rovlarni parallel qayta ishlash muhiti.
- AI bilan birlashgan oldingi-qo'shimcha tuzilma.
Natijada, ushbu yaxshilanish faqat oddiy funktsiyani amalga oshirish darajasidan tashqariga chiqib, "o'lcham tuzilmasini yaxshilash orqali samaradorlikni optimallashtirish misoli" deb qaralishi mumkin.
Shuningdek, asinxron ishlov berish va parallel ishlov berish tuzilmalari zamonaviy orqa reja tizimlarida juda muhim asosiy dizayn usullaridir va kelajakda shunga o'xshash tuzilma dizaynlarida faol ravishda foydalanish mumkin bo'lgan juda muhim tajriba bo'ldi.
messi