पाठ 38 / 38

रिएक्टिव प्रोग्रामिंग परिचय

रिएक्टिव स्ट्रीम जो समस्या हल करते हैं वह देखें — लोड में ब्लॉक होते थ्रेड — और Mono व Flux पर बने न्यूनतम non-blocking WebFlux endpoint को पढ़ें।

समस्या: प्रति रिक्वेस्ट एक थ्रेड

पारंपरिक (servlet) रिक्वेस्ट हैंडलर धीमी downstream कॉल की प्रतीक्षा में अपना थ्रेड रोक देता है — भारी लोड में थ्रेड ख़त्म हो जाते हैं जबकि CPU खाली, केवल I/O की प्रतीक्षा में है। Reactive प्रोग्रामिंग (Reactive Streams / Project Reactor) इसकी बजाय एक callback पंजीकृत करती है और प्रतीक्षा के दौरान थ्रेड को दूसरे काम के लिए मुक्त कर देती है।

Mono व Flux

Mono<T> शून्य-या-एक असिंक्रोनस मान दर्शाता है, Flux<T> शून्य-से-अनेक — दोनों लेज़ी हैं: जब तक कोई subscribe न करे कुछ नहीं चलता। Spring WebFlux कंट्रोलर परिणाम के लिए ब्लॉक होने की बजाय इन्हें सीधे लौटाते हैं।

@RestController
class UserController {
    private final WebClient client;

    @GetMapping("/users/{id}")
    Mono<User> get(@PathVariable String id) {
        return client.get()
            .uri("/legacy-users/{id}", id)
            .retrieve()
            .bodyToMono(User.class);   // non-blocking
    }
}

यह कब उपयोगी है (और कब नहीं)

उच्च-समरूपता वाली I/O-भारी सेवाओं (gateway, streaming) में reactive चमकता है। सामान्य लोड की CRUD ऐप के लिए वर्चुअल थ्रेड (Java 21+) पर सामान्य ब्लॉकिंग कोड जितना ही स्केलेबल है पर कहीं सरल — reactive केवल मापी गई ज़रूरत पर अपनाएँ।