- प्रोग्रेसिव JPEG की तरह, JSON डेटा को भी पहले अधूरी अवस्था में भेजने का तरीका पेश किया गया है ताकि क्लाइंट धीरे-धीरे पूरे कंटेंट का उपयोग कर सके
- मौजूदा JSON parsing पद्धति में पूरी डेटा प्राप्त होने तक कोई काम शुरू नहीं किया जा सकता, जिससे अक्षमता की समस्या होती है
- Breadth-first पद्धति में डेटा को कई chunks (हिस्सों) में बाँटा जाता है, और जो हिस्से अभी तैयार नहीं हैं उन्हें Promise के रूप में दिखाकर तैयार होते ही क्रमशः भरा जाता है, ताकि क्लाइंट अधूरे डेटा का भी उपयोग कर सके
- यह अवधारणा React Server Components(RSC) की मुख्य innovation है, और
<Suspense> के जरिए इच्छित चरणबद्ध loading state को नियंत्रित किया जाता है
- डेटा streaming और जानबूझकर डिजाइन किए गए UI loading flow को अलग करके अधिक लचीला user experience दिया जा सकता है
प्रोग्रेसिव JPEG और प्रोग्रेसिव JSON का विचार
- प्रोग्रेसिव JPEG में इमेज को ऊपर से नीचे एक बार में लोड करने के बजाय, पहले पूरी इमेज धुंधली अवस्था में दिखाई जाती है और फिर वह धीरे-धीरे साफ होती जाती है
- इसी तरह, JSON ट्रांसमिशन में भी प्रोग्रेसिव तरीका लागू करने पर पूरी चीज़ तैयार होने तक इंतज़ार किए बिना कुछ डेटा का तुरंत उपयोग किया जा सकता है
- उदाहरण JSON डेटा संरचना में, सामान्य तरीके से parsing तभी संभव है जब आख़िरी byte तक सब कुछ प्राप्त हो जाए
- इसके कारण क्लाइंट को सर्वर के धीमे हिस्सों (जैसे धीमे DB से comments लाना) सहित सब कुछ ट्रांसमिट होने तक इंतज़ार करना पड़ता है, और यही आज के मानक की बहुत बड़ी अक्षमता है
Streaming JSON parser की सीमाएँ
- Streaming JSON parser अपनाने पर अधूरी (मध्यवर्ती) data object tree बनाई जा सकती है
- लेकिन जब हर object के fields (जैसे footer, कई comment सूचियाँ आदि) का केवल कुछ हिस्सा ही आया हो, तब type mismatch होता है और यह समझना कठिन होता है कि क्या पूरा हो चुका है, जिससे उपयोगिता घट जाती है
- HTML की streaming rendering की तरह, stream को क्रम से प्रोसेस करने पर एक धीमा हिस्सा पूरे परिणाम को देर से पहुँचाता है
- यही वजह है कि सामान्यतः streaming JSON का उपयोग कम होता है
Progressive JSON संरचना का प्रस्ताव
- पारंपरिक depth-first streaming (यानी tree structure के भीतर नीचे तक घूमते हुए भेजने का तरीका) के बजाय, Breadth-first (चौड़ाई-प्रथम) तरीका अपनाया गया है
- पहले सिर्फ top-level object भेजा जाता है, और नीचे के values को Promise जैसे placeholders के रूप में छोड़कर तैयार होते ही अलग-अलग chunks में भरा जाता है
- उदाहरण के लिए, सर्वर जब भी async data loading पूरी करता है, उससे संबंधित chunk भेज देता है, और क्लाइंट उतने तैयार हिस्से का तुरंत उपयोग कर सकता है
- इससे async data reception (early load) संभव हो जाता है, और कई धीमे हिस्सों के पूरा होने तक पूरी तरह इंतज़ार नहीं करना पड़ता
- अगर क्लाइंट को chunk-आधारित non-sequential और partially sequential reception के लिए मज़बूती से बनाया जाए, तो सर्वर विभिन्न chunk विभाजन रणनीतियों को लचीले ढंग से लागू कर सकता है
Inlining और Outlining: कुशल डेटा ट्रांसमिशन
- प्रोग्रेसिव JSON streaming format में reusable objects (जैसे एक ही
userInfo को कई जगह refer करना) को duplicate किए बिना अलग chunk के रूप में निकालकर हर जगह उसी reference से इस्तेमाल किया जा सकता है
- केवल धीमे हिस्सों को अलग करके placeholder के रूप में भेजा जाता है, और बाकी को तुरंत भरकर कुशल data stream बनाई जाती है
- जब एक ही object कई बार आता है, तो उसे केवल एक बार भेजकर दोबारा इस्तेमाल (Outlining) किया जा सकता है
- इस तरीके से circular references (जब object खुद को refer करे) भी सामान्य JSON की तरह कठिन नहीं रहते, और chunks के बीच indirect references से स्वाभाविक रूप से serialize किए जा सकते हैं
React Server Components(RSC) में प्रोग्रेसिव streaming का कार्यान्वयन
- वास्तविक React Server Components, प्रोग्रेसिव JSON streaming मॉडल लागू करने का एक प्रमुख उदाहरण हैं
- सर्वर बाहरी डेटा (जैसे Post, Comments) को async तरीके से लोड करता है
- क्लाइंट में जो हिस्से अभी नहीं पहुँचे हैं उन्हें Promise की तरह रखा जाता है, और वे तैयार होने के क्रम में UI को प्रोग्रेसिव तरीके से render किया जाता है
- React के
<Suspense> से जानबूझकर loading states सेट की जाती हैं
- user experience में अनावश्यक screen jump से बचने के लिए Promise state (खाली जगह) को तुरंत दिखाने के बजाय
<Suspense> fallback से चरणबद्ध loading दिखाया जा सकता है
- भले ही डेटा जल्दी आ जाए, असली UI को डिजाइन किए गए चरणों के अनुसार प्रोग्रेसिव तरीके से दिखाने पर डेवलपर का नियंत्रण रहता है
सारांश और निहितार्थ
- React Server Components की मुख्य innovation यह है कि component tree के props को बाहरी स्तर से भीतर की ओर प्रोग्रेसिव तरीके से stream किया जाता है
- इसलिए सर्वर के पूरी तरह सभी डेटा तैयार करने तक इंतज़ार किए बिना, महत्वपूर्ण हिस्सों को पहले दिखाया जा सकता है और loading wait state को भी बारीकी से नियंत्रित किया जा सकता है
- केवल streaming ही नहीं, बल्कि इसका उपयोग करने वाला programming model (जैसे React का
<Suspense>) जैसा संरचनात्मक समर्थन भी ज़रूरी है
- इससे धीमे डेटा के एक हिस्से के कारण पूरे परिणाम के रुक जाने जैसी मौजूदा ट्रांसमिशन bottleneck समस्याओं को कम किया जा सकता है
1 टिप्पणियां
Hacker News की राय