Reactive programming — ma’lumot yoki hodisa oqimlari o‘zgarganda bog‘liq hisoblashlarni avtomatik davom ettirishga asoslangan dasturlash paradigmasidir. Dasturchi ko‘pincha “qiymat kelganda uni filtrlash, o‘zgartirish va birlashtirish” munosabatini deklarativ ifodalaydi. Paradigma grafik interfeys, real vaqt oqimi va asinxron xizmatlarda uchraydi.
Oqim va observer
Observable vaqt bo‘yicha qiymatlar, xato yoki tugallanish signalini chiqaradi. Observer yoki subscriber ularga ishlov beradi. map har qiymatni o‘zgartiradi, filter tanlaydi, merge oqimlarni birlashtiradi, flatMap esa har qiymatdan yangi asinxron oqim hosil qiladi. Operator semantikasi kutubxonaga qarab farq qilishi mumkin.
Cold observable har obunada ishlab chiqarishni boshidan boshlaydi. Hot observable esa obunachidan mustaqil mavjud hodisani tarqatadi; kech qo‘shilgan subscriber oldingi qiymatlarni olmasligi mumkin. Replay va behavior subject tarix yoki oxirgi qiymatni saqlaydi, ammo xotira va eskirgan holatni hisobga olish kerak.
Backpressure
Producer consumerdan tez bo‘lsa navbat o‘sadi. Reactive Streams subscriber qancha element qabul qila olishini demand orqali bildiradi. Boshqa tizimlar buffer, drop, latest yoki sampling siyosatini qo‘llaydi. Birja tranzaksiyasini drop qilish mumkin emas, UI kursor harakatida esa faqat eng yangi qiymat yetarli bo‘lishi mumkin.
Cheklanmagan buffer vaqtinchalik farqni yashiradi, keyin memory pressure va katta latency keltiradi. Backpressure operatori biznes semantikasiga ko‘ra tanlanadi va yo‘qotilgan elementlar metrikada ko‘rsatiladi.
Rejalashtirish va xatolar
Operator qaysi scheduler yoki thread’da ishlashi muhim. UI yangilanishi main threadda, bloklovchi I/O esa worker poolda bajariladi. observeOn va subscribeOn kabi operatorlarni noto‘g‘ri joylash context switchni ko‘paytiradi yoki event loopni bloklaydi.
Oqimda xato ko‘pincha terminal signal bo‘lib, keyingi qiymatlar kelmaydi. Retry faqat idempotent amal va cheklangan backoff bilan ishlatiladi. Xatoni default qiymatga almashtirish xizmatni davom ettiradi, ammo muhim nosozlikni yashirmasligi kerak. Cancellation subscriptionni yopib, pastki I/O va taymerlarni ham bekor qiladi.
Holat va sinov
Reactive zanjir deklarativ bo‘lsa ham yon ta’sir tartibi murakkablashishi mumkin. Shared mutable state operator ichida data race yaratadi. Pure transformation, aniq state reducer va yon ta’sirni chegaralash tushunishni osonlashtiradi. Juda uzun zanjir nomlangan funksiyalar va diagramma bilan bo‘linadi.
Test scheduler virtual vaqt bilan debounce, timeout va intervalni real kutmasdan tekshiradi. Marble diagram oqim hodisalarini vaqt chizig‘ida ko‘rsatadi. Test qiymatlar bilan birga error, completion, cancellation va sekin subscriber holatini qamrab oladi.
Reactive tizim bilan farqi
Reactive programming kutubxona darajasidagi oqim kompozitsiyasini anglatadi. Reactive system esa responsive, resilient, elastic va message-driven arxitektura xususiyatlarini tasvirlashi mumkin; ikkalasi aynan bir tushuncha emas. Observable ishlatgan ilova avtomatik fault tolerant bo‘lib qolmaydi. Taqsimlangan oqimda xabar qayta kelishi, tartib buzilishi va tugun uzilishi uchun idempotency hamda persistence zarur. UI state’da esa subscription lifecycle view lifecycle bilan bog‘lanmasa observer yopilgandan keyin ham event olib memory leak yaratadi. Hot streamdagi sekin subscriber uchun buffer siyosati har obunachi yoki umumiy bo‘lishi natijaga ta’sir qiladi. Bu contract dokumentatsiya va testda aniq beriladi.
Reaktiv tizimda vaqt tushunchasi ham muhim: hodisalar kechikishi, tartibi o‘zgarishi yoki birlashtirilishi mumkin. Shu sabab operatorlarning ketma-ketligi dastur natijasiga, xotira sarfiga va javob berish tezligiga bevosita ta’sir qiladi.
Bog‘liq tushunchalar
Observable, Reactive Streams, Backpressure, Observer, Scheduler, Event stream