Ruby on Rails 5.2 - ActionController::Streaming

मॉड्यूल एक्शनकंट्रोलर :: स्ट्रीमिंग




ruby

मॉड्यूल एक्शनकंट्रोलर :: स्ट्रीमिंग

जैसे ही वे रेंडर किए जाते हैं, तो व्यू को क्लाइंट में वापस स्ट्रीम करने की अनुमति देता है।

डिफ़ॉल्ट रूप से, रेल पहले टेम्प्लेट और फिर लेआउट रेंडर करके विचारों को प्रस्तुत करता है। पूरे टेम्प्लेट के प्रस्तुत होने के बाद क्लाइंट को प्रतिक्रिया भेजी जाती है, सभी प्रश्न किए जाते हैं, और लेआउट को संसाधित किया जाता है।

पहले लेआउट को रेंडर करके और प्रवाह के प्रत्येक भाग को संसाधित करने के दौरान स्ट्रीमिंग प्रवाह को निष्क्रिय कर देता है। यह HTML के शीर्षलेख (जो आमतौर पर लेआउट में होता है) को क्लाइंट पर बहुत तेज़ी से वापस स्ट्रीम करने की अनुमति देता है, जिससे JavaScripts और स्टाइलशीट को सामान्य से पहले लोड किया जा सकता है।

यह दृष्टिकोण रेल 3.1 में पेश किया गया था और अभी भी सुधार कर रहा है। कई रैक बिचौलिये काम नहीं कर सकते हैं और आपको स्ट्रीमिंग करते समय सावधानी बरतने की आवश्यकता है। जल्द ही उन बिंदुओं पर ध्यान दिया जाएगा।

स्ट्रीमिंग का उपयोग करने के लिए, आपको एक रूबी संस्करण का उपयोग करने की आवश्यकता होगी जो फाइबर का समर्थन करता है (फाइबर मुख्य रुबिन कार्यान्वयन के 1.9.2 संस्करण के बाद से समर्थित हैं)।

Streaming को किसी दिए गए टेम्प्लेट में आसानी से जोड़ा जा सकता है, आपको बस इतना करना है: स्ट्रीम विकल्प।

class PostsController
  def index
    @posts = Post.all
    render stream: true
  end
end

कब करें स्ट्रीमिंग का इस्तेमाल

new या edit जैसी हल्के कार्यों के लिए Streaming को ओवरकिल माना जा सकता है। स्ट्रीमिंग का वास्तविक लाभ महंगे कार्यों पर है, उदाहरण के लिए, डेटाबेस पर बहुत सारे प्रश्न हैं।

ऐसी कार्रवाइयों में, आप प्रश्नों के निष्पादन में देरी करना चाहते हैं जितना आप कर सकते हैं। उदाहरण के लिए, निम्नलिखित dashboard कार्रवाई की कल्पना करें:

def dashboard
  @posts = Post.all
  @pages = Page.all
  @articles = Article.all
end

यहां अधिकांश प्रश्न नियंत्रक में हो रहे हैं। स्ट्रीमिंग से लाभ पाने के लिए आप इसे फिर से लिखना चाहेंगे:

def dashboard
  # Allow lazy execution of the queries
  @posts = Post.all
  @pages = Page.all
  @articles = Article.all
  render stream: true
end

ध्यान दें कि: धारा केवल टेम्पलेट्स के साथ काम करती है। प्रतिपादन : json या: xml साथ: धारा नहीं चलेगी।

लेआउट और टेम्पलेट के बीच संचार

स्ट्रीमिंग करते समय, रेंडरिंग अंदर-बाहर के बजाय टॉप-डाउन होता है। रेलें लेआउट से शुरू होती हैं, और बाद में जब इसकी yield जाती है, तो टेम्पलेट को प्रस्तुत किया जाता है।

इसका मतलब यह है कि, यदि आपका एप्लिकेशन वर्तमान में लेआउट में उपयोग किए जाने वाले टेम्पलेट में सेट किए गए उदाहरण चर पर निर्भर करता है, तो एक बार जब आप स्ट्रीमिंग पर जाते हैं तो वे काम नहीं करेंगे। लेआउट और टेम्पलेट के बीच संवाद करने का उचित तरीका, भले ही आप स्ट्रीमिंग का उपयोग करें या नहीं, content_for , provide और yield का उपयोग करके yield

एक सरल उदाहरण लें जहां लेआउट टेम्पलेट से अपेक्षा करता है कि वह बताए कि किस शीर्षक का उपयोग करना है:

<html>
  <head><title><%= yield :title %></title></head>
  <body><%= yield %></body>
</html>

शीर्षक निर्दिष्ट करने के लिए आप अपने टेम्पलेट में content_for का उपयोग करेंगे:

<%= content_for :title, "Main" %>
Hello

और अंतिम परिणाम होगा:

<html>
  <head><title>Main</title></head>
  <body>Hello</body>
</html>

हालाँकि, यदि content_for को कई बार कॉल किया जाता है, तो अंतिम परिणाम में सभी कॉल कॉन्टेक्टेड होंगे। उदाहरण के लिए, यदि हमारे पास निम्नलिखित टेम्पलेट हैं:

<%= content_for :title, "Main" %>
Hello
<%= content_for :title, " page" %>

अंतिम परिणाम होगा:

<html>
  <head><title>Main page</title></head>
  <body>Hello</body>
</html>

इसका मतलब है कि, यदि आपके पास yield :title आपके लेआउट में yield :title और आप स्ट्रीमिंग का उपयोग करना चाहते हैं, तो आपको शीर्षक और सभी परिसंपत्तियों को स्ट्रीम करने से पहले पूरे टेम्पलेट (और अंततः सभी प्रश्नों को ट्रिगर करना होगा), जो स्ट्रीमिंग के उद्देश्य को मारता है। इस उद्देश्य के लिए, आप एक सहायक नाम का उपयोग कर सकते हैं जो कि content_for के समान है लेकिन लेआउट को अन्य प्रविष्टियों की खोज बंद करने और रेंडर करना जारी रखने के लिए कहता है।

उदाहरण के लिए, उपर्युक्त टेम्पलेट का उपयोग करना होगा:

<%= provide :title, "Main" %>
Hello
<%= content_for :title, " page" %>

देते हुए:

<html>
  <head><title>Main</title></head>
  <body>Hello</body>
</html>

कहा कि, स्ट्रीमिंग करते समय, आपको अपने टेम्प्लेट को ठीक से जांचने की जरूरत है और यह चुनें कि कब क्या provide और content_for का उपयोग provide

हेडर, कुकीज़, सत्र और फ्लैश

स्ट्रीमिंग करते समय, HTTP हेडर क्लाइंट को पहली पंक्ति के रेंडर करने से ठीक पहले भेजा जाता है। इसका मतलब यह है कि, टेम्पलेट शुरू होने के बाद हेडर, कुकीज, सेशन या फ्लैश को संशोधित करना क्लाइंट को प्रोपेगेट नहीं करेगा।

Middlewares

शरीर को हेरफेर करने की जरूरत है कि Middlewares स्ट्रीमिंग के साथ काम नहीं करेगा। जब भी विकास या उत्पादन में स्ट्रीमिंग हो तो आपको उन बिचौलियों को निष्क्रिय करना चाहिए। उदाहरण के लिए, Rack::Bug तब काम नहीं करेगा जब स्ट्रीमिंग को HTML शरीर में सामग्री को इंजेक्ट करने की आवश्यकता हो।

इसके अलावा Rack::Cache स्ट्रीमिंग के साथ काम नहीं करेगा क्योंकि यह स्ट्रीमिंग निकायों का समर्थन नहीं करता है। जब भी कैश-कंट्रोल की स्ट्रीमिंग स्वचालित रूप से "नो-कैश" पर सेट हो जाती है।

त्रुटियाँ

जब यह स्ट्रीमिंग की बात आती है, तो अपवाद कुछ अधिक जटिल हो जाते हैं। ऐसा इसलिए होता है क्योंकि टेम्प्लेट का हिस्सा पहले से ही प्रदान किया गया था और क्लाइंट को स्ट्रीम किया गया था, जिससे पूरे अपवाद पृष्ठ को प्रस्तुत करना असंभव हो गया था।

वर्तमान में, जब कोई अपवाद विकास या उत्पादन में होता है, तो रेल स्वचालित रूप से ग्राहक को स्ट्रीम करेगी:

"><script>window.location = "/500.html"</script></html>

किसी दिए गए टैग के लिए विशेषताओं को प्रस्तुत करते समय अपवाद होने की स्थिति में पहले दो वर्ण (">) की आवश्यकता होती है। आप अपने लकड़हारे में अपवाद के वास्तविक कारण की जांच कर सकते हैं।

वेब सर्वर का समर्थन

सभी वेब सर्वर बॉक्स के बाहर स्ट्रीमिंग का समर्थन नहीं करते हैं। आपको उनमें से प्रत्येक के लिए निर्देशों की जांच करने की आवश्यकता है।

एक तंगावाला

यूनिकॉर्न स्ट्रीमिंग का समर्थन करता है लेकिन इसे कॉन्फ़िगर करने की आवश्यकता है। इसके लिए आपको निम्नलिखित के रूप में एक विन्यास फाइल बनाने की जरूरत है:

# unicorn.config.rb
listen 3000, tcp_nopush: false

और इसे आरंभीकरण पर उपयोग करें:

unicorn_rails --config-file unicorn.config.rb

आप अन्य मापदंडों को भी कॉन्फ़िगर करना चाह सकते हैं जैसे :tcp_nodelay । कृपया अधिक जानकारी के लिए इसके प्रलेखन की जांच करें: bogomips.org/unicorn/Unicorn/Configurator.html#method-i-listen

यदि आप NGINX के साथ यूनिकॉर्न का उपयोग कर रहे हैं, तो आपको NGINX को ट्विक करने की आवश्यकता हो सकती है। Streaming को रेनबो पर बॉक्स से बाहर काम करना चाहिए।

यात्री

वर्णन किया जाना।