पाठ 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 केवल मापी गई ज़रूरत पर अपनाएँ।