रूसी गुड़िया कैशिंग के अलावा, रेल ऐप में प्रदर्शन को तेज करने के लिए और भी तकनीकें हैं। इस बार हम रेल के अंतर्निर्मित सशर्त GET समर्थन को देखेंगे, जो आपको रेंडर किए गए पृष्ठों को उपयोगकर्ता के ब्राउज़र कैश में संग्रहीत करने की अनुमति देता है।
<ब्लॉकक्वॉट>👋 और यदि आप कैशिंग के बाहर प्रदर्शन के बारे में अधिक पढ़ना पसंद करते हैं, तो हमने रूबी (ऑन रेल्स) के प्रदर्शन के बारे में और भी बहुत कुछ लिखा है, हमारी रूबी प्रदर्शन निगरानी चेकलिस्ट देखें।
Etag और अंतिम-संशोधित शीर्षलेख
जब आपका ब्राउज़र आपके रेल ऐप में किसी पृष्ठ के लिए HTTP GET अनुरोध निष्पादित करता है, तो राउटर इसे आपके नियंत्रक कार्यों में से एक से लिंक कर देगा। नियंत्रक तब डेटाबेस से आवश्यक डेटा का अनुरोध करेगा और दृश्य प्रस्तुत करेगा। एक HTTP प्रतिक्रिया (200 OK
. के साथ) प्रतिक्रिया कोड के रूप में) फिर आपके ब्राउज़र को पार्स और प्रदर्शित करने के लिए प्रतिक्रिया के शरीर में दृश्य से प्रदान किए गए HTML के साथ ब्राउज़र पर वापस भेज दिया जाता है।
जब संसाधन का दोबारा अनुरोध किया जाता है, तो हम उसी पाइपलाइन से गुजरेंगे। कुछ स्थितियों में, यह अनावश्यक है क्योंकि इस दौरान पृष्ठ नहीं बदला। उसके लिए, HTTP अपना ETag . प्रदान करता है और पिछली बार संशोधित शीर्षलेख इनका उपयोग करके, ब्राउज़र प्रतिक्रिया निकाय को संग्रहीत कर सकता है, और हेडर का उपयोग पुराने होने पर उन्हें अमान्य करने के लिए कर सकता है।
ईटैग , या इकाई टैग , क्लाइंट-साइड कैश सत्यापन के लिए उपयोग किए जाते हैं, इसलिए आप उन्हें अपने HTTP प्रतिक्रियाओं के लिए कैश कुंजी के रूप में सोच सकते हैं। वे प्रत्येक अनुरोध के लिए HTTP प्रतिक्रिया शीर्षलेख में ब्राउज़र पर वापस भेज दिए जाते हैं।
~ $ curl -I https://localhost:3000/products/1
HTTP/1.1 200 OK
...
ETag: W/"9462d76cc55aeb6249fa990e39231c7c"
Last-Modified: Wed, 25 Apr 2018 08:27:04 GMT
...
यदि प्रतिक्रिया बाद में दोहराई जाती है, तो ब्राउज़र अपने कैश में मौजूदा प्रतिक्रिया ढूंढता है और अंतिम अनुरोध से संग्रहीत एटैग का उपयोग If-None-Match
के रूप में करता है शीर्षलेख। यह हेडर हमारे रेल ऐप को बताएगा कि हमारे पास पहले से ही यह संस्करण कैश में है।
यदि अनुरोध से एटैग वर्तमान से मेल खाता है, तो रेल एक 304 Not Modified
. भेजेगी प्रतिक्रिया शरीर के बिना प्रतिक्रिया। यह ब्राउज़र को इसके बजाय उसके स्थानीय कैश से उपयोग करने के लिए कहेगा।
~ $ curl -i -H 'If-None-Match: W/"9462d76cc55aeb6249fa990e39231c7c"' https://localhost:3000/products/1
HTTP/1.1 304 Not Modified
...
ETag: W/"9462d76cc55aeb6249fa990e39231c7c"
Last-Modified: Wed, 25 Apr 2018 08:27:04 GMT
...
रेल में सशर्त GET अनुरोध
यदि हम स्थानीय रेल एप्लिकेशन से एक पृष्ठ का अनुरोध करते हैं, तो हम देख सकते हैं कि रेल प्रत्येक अनुरोध के लिए स्वचालित रूप से एक एटैग जोड़ता है। यदि हम एक ही पृष्ठ को लगातार दो बार अनुरोध करते हैं, तो हम प्रत्येक अनुरोध के लिए Etag परिवर्तन देख सकते हैं।
जबकि रेल डिफ़ॉल्ट रूप से प्रत्येक अनुरोध के लिए एक एटैग उत्पन्न करता है, यह इसे उत्पन्न करने के लिए पूरे प्रतिक्रिया निकाय के डाइजेस्ट का उपयोग करता है। इसका मतलब है <%= csrf_meta_tags %>
लेआउट में एटैग को बंद कर देता है, क्योंकि सीएसआरएफ-टोकन मेटा टैग प्रत्येक अनुरोध के लिए बदलता है। क्योंकि यह प्रत्येक अनुरोध के लिए मुख्य भाग को बदलता है, Etag अमान्य हो जाता है और स्थानीय कैश को बासी के रूप में चिह्नित किया जाता है।
इसके अलावा, रेल कभी भी एक 304 Not Modified
लौटाएगा डिफ़ॉल्ट रूप से, क्योंकि हमारे नियंत्रक में स्थानीय कैश को स्पष्ट रूप से ताज़ा के रूप में चिह्नित नहीं किया जाता है।
fresh_when
और stale?
सशर्त जीईटी के लिए अनुरोध शीर्षलेख से एटैग का उपयोग करने के लिए, हमें स्थानीय कैश में किसी ऑब्जेक्ट को "ताज़ा" के रूप में स्पष्ट रूप से चिह्नित करने की आवश्यकता है। उदाहरण के लिए, किसी उत्पाद को दिखाने वाले पृष्ठ के लिए, हम कैश को तब तक ताज़ा रख सकते हैं, जब तक कि उत्पाद और दृश्य टेम्प्लेट नहीं बदलते। उस काम को करने के लिए, हम दो काम करेंगे।
- हम स्पष्ट रूप से ऐसे मान सेट करेंगे जो हमारे Etag का निर्माण करेंगे, क्योंकि संपूर्ण प्रतिक्रिया निकाय का उपयोग करने के लिए हमें पूरे शरीर को यह जांचने के लिए प्रस्तुत करना होगा कि क्या कैश्ड प्रतिक्रिया मान्य है, जो स्थानीय रूप से पृष्ठ को कैशिंग करने से गति को नकारता है।ली>
- हम अनुरोध हेडर से एटैग की तुलना पहले . के अनुमान से करेंगे दृश्य प्रस्तुत करना, और यदि वे मेल खाते हैं तो हम प्रतिपादन को छोड़ देंगे।
रेल सहायकों के साथ आती है जो हमारे लिए सब कुछ करती है। हम स्पष्ट रूप से fresh_when
का उपयोग करके उत्पाद पर Etag और अंतिम-संशोधित दिनांक को स्पष्ट रूप से आधार बना सकते हैं ।
# app/views/products/show.html.erb
def show
@product = Product.find(params[:id])
fresh_when @product
end
यदि आपके पास स्पष्ट respond_to
है ब्लॉक करें, stale?
इसके बजाय fresh_when
।
# app/views/products/show.html.erb
def show
@product = Product.find(params[:id])
if stale?(@product)
respond_to do |format|
format.html
end
end
end
अब, उत्पाद पृष्ठों में से किसी एक का अनुरोध करने से प्रतिक्रिया स्थानीय रूप से कैश हो जाएगी। उसी पृष्ठ के बाद के किसी भी अनुरोध में रेल को बताने के लिए एटैग शामिल होगा, हमारे पास कैश्ड प्रतिक्रिया है, जिसे तब नए एटैग से तुलना की जाती है। यदि वह मेल खाता है, तो रेल पृष्ठ को प्रस्तुत करना छोड़ देगा, और एक 304 Not Modified
return लौटाएगा तुरंत।
नोट :पृष्ठ को रीफ़्रेश करने पर हमेशा पृष्ठ के कैश न किए गए संस्करण का अनुरोध किया जाएगा। यह जांचने के लिए कि क्या आपका सशर्त जीईटी काम करता है, एक लिंक का उपयोग करके या इसके बजाय बैक बटन का उपयोग करके नेविगेट करें।
आपको यह लेख और AppSignal अकादमी श्रृंखला के पिछले लेख कैसे पसंद आए? रेल लाइन में कैशिंग के बारे में हमारे पास कुछ और लेख हैं, लेकिन कृपया हमें यह बताने में संकोच न करें कि आप हमें आगे क्या लिखना चाहते हैं (कैशिंग से संबंधित या अन्यथा)!