http HEAD बनाम GET प्रदर्शन


111

मैं एक REST वेब सेवा स्थापित कर रहा हूं, जिसे बस यस या NO का उत्तर देने की आवश्यकता है, जितनी जल्दी हो सके।

एक HEAD सेवा को डिजाइन करना सबसे अच्छा तरीका है, लेकिन मैं यह जानना चाहूंगा कि क्या मुझे वास्तव में GET अनुरोध करने में कुछ समय लगेगा।

मुझे लगता है कि मैं अपने सर्वर (लगभग 1 मिलीसेकंड?) पर खुला / बंद नहीं होना चाहता हूं। चूंकि बाइट्स की वापसी की मात्रा बहुत कम है, क्या मुझे आईपी पैकेट नंबर में, परिवहन में कोई समय मिलता है?

तुम्हारी प्रतिक्रिया के लिए अग्रिम धन्यवाद!

संपादित करें:

संदर्भ को और समझाने के लिए:

  • मेरे पास कुछ प्रक्रियाओं को निष्पादित करने वाली आरईएस सेवाओं का एक सेट है, अगर वे एक सक्रिय स्थिति में हैं।
  • मेरे पास एक और REST सेवा है जो इन सभी पहली सेवाओं की स्थिति को दर्शाती है।

चूँकि उस अंतिम सेवा को ग्राहकों के एक बहुत बड़े समूह द्वारा बहुत बार कहा जाएगा (प्रत्येक 5ms पर एक कॉल की उम्मीद है), मैं सोच रहा था कि क्या HEAD पद्धति का उपयोग करना एक मूल्यवान अनुकूलन हो सकता है? प्रतिक्रिया निकाय में लगभग 250 चार्ट लौटाए गए हैं। हेड विधि कम से कम इन 250 वर्णों के परिवहन को प्राप्त करती है, लेकिन इसका क्या प्रभाव है?

मैंने दो तरीकों (HEAD vs GET) के बीच अंतर को बेंचमार्क करने की कोशिश की, जो 1000 बार कॉल चला रहा है, लेकिन कोई फायदा नहीं हुआ (<1ms) ...


2
यह उस दृष्टिकोण पर भी निर्भर करता है जिसका आप सर्वर-साइड का उपयोग करते हैं। आमतौर पर GET अनुरोध या HEAD अनुरोध को संसाधित करने के लिए एक ही सर्वर समय लग सकता है, क्योंकि Content-Lengthहेडर मान की गणना करने के लिए सर्वर को अंतिम निकाय को जानना पड़ सकता है , जो एक HEAD अनुरोध की प्रतिक्रिया में एक महत्वपूर्ण जानकारी है। जब तक कुछ और अधिक अनुकूलित सर्वर-साइड दृष्टिकोण नहीं होता है, एकमात्र लाभ यह है कि बैंडविड्थ सहेजा जाता है और ग्राहक को प्रतिक्रिया शरीर को पार्स करने की आवश्यकता नहीं होती है। तो मूल रूप से अनुकूलन लाभ सर्वर और क्लाइंट कार्यान्वयन दोनों पर निर्भर करते हैं।
इसका तजवी

जवाबों:


173

RESTful URI को सर्वर पर "संसाधन" का प्रतिनिधित्व करना चाहिए। संसाधनों को अक्सर डेटाबेस में रिकॉर्ड या फाइल सिस्टम पर एक फाइल के रूप में संग्रहीत किया जाता है। जब तक संसाधन बड़ा नहीं होता है या सर्वर पर पुनर्प्राप्त करने के लिए धीमा होता है, तो आप HEADइसके बजाय का उपयोग करके एक औसत दर्जे का लाभ नहीं देख सकते हैं GET। यह हो सकता है कि मेटा डेटा पुनर्प्राप्त करना पूरे संसाधन को पुनर्प्राप्त करने की तुलना में कोई तेज़ नहीं है।

आप दोनों विकल्पों को लागू कर सकते हैं और उन्हें देखने के लिए बेंचमार्क कर सकते हैं जो तेज है, लेकिन माइक्रो-ऑप्टिमाइजेशन के बजाय, मैं आदर्श रीस्ट इंटरफेस को डिजाइन करने पर ध्यान केंद्रित करूंगा। एक क्लीन REST API आमतौर पर लंबे समय तक कुल्डी एपीआई की तुलना में अधिक मूल्यवान होता है जो तेज हो सकता है या नहीं भी। मैं इसके उपयोग को हतोत्साहित नहीं कर रहा हूं HEAD, केवल यह सुझाव देता हूं कि यदि आप इसे "सही" डिज़ाइन का उपयोग करते हैं।

यदि आपको जिस जानकारी की वास्तव में आवश्यकता है वह मेटा डेटा है एक संसाधन के बारे में जो HTTP हेडर में अच्छी तरह से प्रतिनिधित्व किया जा सकता है, या यह जांचने के लिए कि संसाधन मौजूद है या नहीं, HEADशायद अच्छी तरह से काम कर सकता है।

उदाहरण के लिए, मान लें कि आप जाँचना चाहते हैं कि संसाधन 123 मौजूद है या नहीं। एक का 200अर्थ "हाँ" और एक 404साधन का "नहीं":

HEAD /resources/123 HTTP/1.1
[...]

HTTP/1.1 404 Not Found
[...]

हालाँकि, यदि आपकी REST सेवा से "हाँ" या "नहीं" आप चाहते हैं, तो मेटा डेटा के बजाय संसाधन का ही एक हिस्सा है, आपको इसका उपयोग करना चाहिए GET


2
सबसे अच्छी चीजें हमेशा सरल होती हैं, बस इस उत्तर की तरह। देखा!
अफजल एसएच

अद्भुत जवाब! मुझे एक प्रश्न मिला है: touchसर्वर पर पोस्ट के दृश्य गणना को अपडेट करने के लिए कमांड के रूप में इसका उपयोग करने के बारे में क्या ? पोस्ट डेटा पहले ही एक सामान्य /postsकॉल के माध्यम से पुनर्प्राप्त कर लिया गया है , इसलिए मैं बस उपयोगकर्ता को किसी तरह से पोस्ट के साथ बातचीत करने के बाद व्यू काउंट को अपडेट करना चाहता हूं।
आलाप

1
@ आलाप यदि आप HEADअनुरोधों के लिए एक दृश्य काउंटर अपडेट करने जा रहे हैं , तो आपको GETअनुरोधों के लिए भी ऐसा करना चाहिए । उपयोग करने का निर्णय GETया HEADअंततः HTTP क्लाइंट तक है। आपके सर्वर को दोनों अनुरोध प्रकारों के लिए एक ही तरह से व्यवहार करना चाहिए, सिवाय इसके कि कोई प्रतिक्रिया दे रहा है जब प्रतिक्रिया देनी हो HEAD। इस बात के लिए कि क्या यह एक अच्छा तरीका है कि किसी व्यू काउंटर की तरह लागू किया जाए, मैं अनिश्चित हूं।
आंद्रे डी

-1 किसी भी जानकारी को नाम दिया जा सकता है जो एक संसाधन हो सकता है। इसलिए यूनिफ़ॉर्म रिसोर्स लोकेटर। HTTP प्रोटोकॉल के भाग का उपयोग करते हुए, जैसा कि डिजाइन किया गया है, यह विचार "kludgey" या "अशुद्ध" विचित्र है।
फ्रेजर

1
@ सिद्धार्थ, यह बहुत बार सच है, लेकिन हमेशा नहीं। Content-Lengthका उपयोग करते समय छोड़ा जा सकता है Transfer-Encoding: chunked। इसके साथ भी Content-Length, यह संभव है कि सर्वर वास्तविक संसाधन प्राप्त किए बिना हेडर में उपयोग किए जाने वाले संसाधन आकार और अन्य मेटाडेटा प्राप्त कर सकता है। हो सकता है कि मेटाडेटा बहुत तेज पहुंच के लिए मेमोरी में कैश्ड भी हो। यह सब बहुत विशिष्ट कार्यान्वयन है।
आंद्रे डी

38

मुझे यह उत्तर तब मिला जब उसी प्रश्न की तलाश थी, जो आवश्यक रूप से पूछे गए थे। मुझे यह http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html पर भी मिला :

HEAD विधि GET के समान है सिवाय इसके कि सर्वर प्रतिक्रिया में एक संदेश-निकाय नहीं लौटाए। HEAD अनुरोध के जवाब में HTTP हेडर में सम्‍मिलित मेटेनफॉर्मेशन GET अनुरोध के जवाब में भेजी गई सूचना के समान होगा। इस पद्धति का उपयोग निकाय को स्वयं स्थानांतरित किए बिना अनुरोध द्वारा निहित निकाय के बारे में मेटैनफॉर्मेशन प्राप्त करने के लिए किया जा सकता है। इस विधि का उपयोग अक्सर वैधता, पहुंच और हाल ही में संशोधन के लिए हाइपरटेक्स्ट लिंक के परीक्षण के लिए किया जाता है।

यह मुझे प्रतीत होगा कि अनुरोधकर्ता के प्रश्न का सही उत्तर यह है कि यह निर्भर करता है कि आरईएसटी प्रोटोकॉल द्वारा क्या दर्शाया गया है। उदाहरण के लिए, मेरे विशेष मामले में, मेरे REST प्रोटोकॉल का उपयोग काफी बड़ी (10K से अधिक) छवियों को पुनः प्राप्त करने के लिए किया जाता है। यदि मेरे पास निरंतर आधार पर बड़ी संख्या में ऐसे संसाधनों की जाँच की जा रही है, और यह देखते हुए कि मैं अनुरोध शीर्षलेखों का उपयोग करता हूं, तो यह HE3 अनुरोध, प्रति w3.org की सिफारिशों का उपयोग करने के लिए समझ में आएगा।


14

मैं इस तरह के दृष्टिकोण को दृढ़ता से हतोत्साहित करता हूं।

Restful सेवा को HTTP verbs शब्दार्थ का सम्मान करना चाहिए। जीईटी क्रिया संसाधन की सामग्री को पुनः प्राप्त करने के लिए होती है, जबकि हेड क्रिया किसी भी सामग्री को वापस नहीं करेगी और इसका उपयोग किया जा सकता है, उदाहरण के लिए, यह देखने के लिए कि क्या संसाधन बदल गया है, इसके आकार या इसके प्रकार को जानने के लिए, यह जाँचने के लिए कि क्या है। मौजूद है, और इसी तरह।

और याद रखें: प्रारंभिक अनुकूलन सभी बुराई की जड़ है।


8

GET अनुरोध के बजाय HEAD अनुरोध का उपयोग करके आपका प्रदर्शन शायद ही बदल जाएगा।

इसके अलावा जब आप चाहते हैं कि यह REST-ful हो और आप डेटा प्राप्त करना चाहते हैं तो आपको HEAD अनुरोध के बजाय GET अनुरोध का उपयोग करना चाहिए।


8

जाओ सिर + शरीर, सिर केवल सिर मिलता है। यह विचार का विषय नहीं होना चाहिए कि कौन सा तेज है। मैं ऊपर के उत्तोलन को कम नहीं करता। यदि आप HEAD के लिए जाने की तुलना में META जानकारी की तलाश कर रहे हैं, जो इस उद्देश्य के लिए है।


3

मैं 'बॉडी स्ट्रीम के खुले / बंद होने' की आपकी चिंता को नहीं समझता। प्रतिक्रिया निकाय http प्रतिक्रिया हेडर के रूप में एक ही स्ट्रीम पर होगा और दूसरा कनेक्शन नहीं बना रहा होगा (जो वैसे 3-6ms की सीमा में अधिक है)।

ऐसा लगता है कि एक बहुत ही परिपक्व अनुकूलन प्रयास पर कुछ है कि सिर्फ एक महत्वपूर्ण या औसत दर्जे का अंतर नहीं होगा। वास्तविक अंतर सामान्य रूप से REST के अनुरूप है, जो डेटा प्राप्त करने के लिए GET का उपयोग करने की सलाह देता है।

मेरा जवाब नहीं है, अगर समझ में आता है तो GET का उपयोग करें, HEAD के उपयोग से कोई प्रदर्शन लाभ नहीं है।


मान लीजिए सामग्री 100MB है। निश्चित रूप से सिर आकार में सामग्री से कम होगा। अब जब हम आपकी राय में GET या HEAD विधि द्वारा उस संसाधन का अनुरोध करते हैं, तो उनके बीच कोई प्रदर्शन अंतर नहीं है ?!
मोहम्मद अफ्रशतेह

3
ओपी ने कहा कि प्रतिक्रिया के शरीर में 250 वर्ण हैं। 100 एमबी नहीं। यह एक अलग सवाल है।
शाम

1

HEAD अनुरोध GET अनुरोधों की तरह ही हैं , सिवाय प्रतिक्रिया के निकाय के खाली है। इस तरह के अनुरोध का उपयोग तब किया जा सकता है जब आप चाहते हैं कि सभी मेटाडेटा किसी फ़ाइल के बारे में हो, लेकिन फ़ाइल के सभी डेटा को ट्रांसपोर्ट करने की आवश्यकता न हो।


-1

प्रदर्शन को मापने के लिए आप आसानी से एक छोटा परीक्षण कर सकते हैं। मुझे लगता है कि प्रदर्शन अंतर नगण्य होगा, क्योंकि यदि आप केवल शरीर में 'Y' या 'N' लौटा रहे हैं, तो यह पहले से खुली स्ट्रीम में संलग्न एक अतिरिक्त बाइट है।

मैं GET के साथ भी जाऊंगा क्योंकि यह अधिक सही है। आपको केवल HTTP मेटाडेटा में HTTP हेडर में सामग्री लौटाने की आवश्यकता नहीं है।


प्राप्त करें - यह न केवल रहस्यमय है "एकल अतिरिक्त बाइट"। बस पूरा शरीर! बड़े दस्तावेज़ के मामले में यह कुछ मेगाबाइट हो सकता है।
पेर्फिरियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.