performance - कंटेंट-लेन्जर हैडर बनाम चंकेड एन्कोडिंग




http chunked-encoding (2)

अगर सामग्री की लंबाई पहले से जानी जाती है, तो मैं निश्चित रूप से विखंडों में भेजने से अधिक पसंद करूँगा। यदि स्थानीय डिस्क फ़ाइल सिस्टम या डेटाबेस में स्थिर फाइलों का मतलब है, तो किसी भी आत्म-सम्मानित प्रोग्रामिंग भाषा और RDBMS सामग्री लंबाई पहले से प्राप्त करने के तरीके प्रदान करता है। आपको इसका उपयोग करना चाहिए

दूसरी ओर, यदि सामग्री की लंबाई वास्तव में पहले से अप्रत्याशित है (जैसे जब आपका इरादा कई फाइलों को एक साथ ज़िपित करना है और उसे एक के रूप में भेजना है), तो इसे साझा करने में सर्वर की स्मृति में बफरिंग या स्थानीय डिस्क पर लिखने से तेज़ हो सकता है फ़ाइल सिस्टम पहले। लेकिन यह वास्तव में उपयोगकर्ता के अनुभव को नकारात्मक रूप से प्रभावित करता है क्योंकि डाउनलोड की प्रगति अज्ञात है। तब अधीर डाउनलोड डाउनलोड रद्द कर सकता है और साथ में आगे बढ़ सकता है।

सामग्री लंबाई पहले से जानने का एक अन्य लाभ यह है कि डाउनलोड फिर से शुरू करने की क्षमता है मैं आपके पोस्ट इतिहास में देखता हूं कि आपकी मुख्य प्रोग्रामिंग भाषा जावा है; आप यहां अधिक तकनीकी पृष्ठभूमि की जानकारी और एक जावा सर्वोलेट उदाहरण के साथ एक लेख पा सकते हैं जो ऐसा करता है

मैं अपने सर्वर से [संभवतः] बड़ी फ़ाइलों को वापस करने के लिए चंकेड एन्कोडिंग का उपयोग करते हुए Content-Length HTTP हैडर बनाकर पेशेवरों और विपक्षों का वजन करने की कोशिश कर रहा हूं। लगातार कनेक्शनों का उपयोग करते हुए एक या दूसरे को HTTP 1.1 चश्मा के अनुरूप होना जरूरी है। मैं Content-Length शीर्ष लेख का लाभ देख रहा हूं:

  • डाउनलोड संवाद सटीक प्रगति बार दिखा सकते हैं
  • क्लाइंट बहुत पहले से जानता है कि फाइल उनके लिए निगलना बहुत बड़ी नहीं हो सकती है

डाउनसाइड को ऑब्जेक्ट वापस करने से पहले आकार की गणना करना पड़ता है जो हमेशा व्यावहारिक नहीं होता है और सर्वर / डाटाबेस उपयोग में जोड़ सकता है। चंकेड एन्कोडिंग के नकारात्मक पक्ष प्रत्येक चोका और डाउनलोड प्रगति पट्टी से पहले आकार का आकार जोड़ने के छोटे से ऊपर का है। कोई विचार? दोनों तरीकों के लिए कोई अन्य HTTP विचार जो मुझे नहीं सोचा हो सकता है?


सामग्री-लंबाई का उपयोग करें, निश्चित रूप से इस से सर्वर का उपयोग लगभग निरर्थक होगा और आपके उपयोगकर्ताओं के लिए लाभ बड़े होगा।

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

आंशिक सामग्री / बाइट-रेंज सेविंग के लिए सहायता भी शामिल करने पर विचार करें - जो है, डाउनलोड को पुनः आरंभ करने की क्षमता एक बाइट रेंज उदाहरण के लिए यहां देखें (उदाहरण PHP में है, लेकिन यह किसी भी भाषा में लागू है)। आंशिक सामग्री की सेवा करते समय आपको सामग्री-लंबाई की आवश्यकता होती है।

बेशक, ये सिल्वर की गोलियां नहीं हैं: स्ट्रीमिंग मीडिया के लिए, आउटपुट बफरिंग या रिस्पॉन्स आकार का उपयोग करना व्यर्थ नहीं है; बड़ी फ़ाइलों के लिए, आउटपुट बफ़रिंग का मतलब नहीं है, लेकिन सामग्री-लंबाई और बाइट सर्विसिंग बहुत सारी भावनाएं बनाता है (एक असफल डाउनलोड को पुनरारंभ करना संभव है)।

निजी तौर पर, मैं सामग्री-लंबाई प्रदान करता हूं जब भी मैं इसे जानता हूं; फ़ाइल डाउनलोड करने के लिए, संसाधनों के संदर्भ में फाइलसिझ की जांच करना बेहद महत्वपूर्ण है। परिणाम: उपयोगकर्ता के पास एक निश्चित प्रगति पट्टी है (और डायनामिक पृष्ठएं ज़ीप के लिए तेज़ धन्यवाद डाउनलोड करती हैं)।





content-length