2010-02-18 11 views
32

मैं एक पुस्तक पढ़ रहा हूं और मेरे पास ईटाग अध्याय के बारे में एक विशेष प्रश्न है। लेखक कहते हैं कि ईटीएजी प्रदर्शन को नुकसान पहुंचा सकता है और आपको उन्हें बारीकी से ट्यून करना होगा या उन्हें पूरी तरह अक्षम करना होगा।ईटैग सही प्राप्त करना

मुझे पहले से ही पता है कि ईटीएजी क्या हैं और जोखिमों को समझते हैं, लेकिन क्या ईटीएजी सही है?

मैंने अभी एक ऐसा एप्लिकेशन बनाया है जो ईटाग भेजता है जिसका मूल्य प्रतिक्रिया निकाय का एमडी 5 हैश है। यह एक सरल समाधान है, जो कई भाषाओं में हासिल करना आसान है।

  • ईटीएजी गलत के रूप में प्रतिक्रिया निकाय के एमडी 5 हैश का उपयोग कर रहा है? यदि हां, तो क्यों?

  • लेखक (जो स्पष्ट रूप से मुझे परिमाण के कई आदेशों से बाहर निकाल देता है) ऐसा सरल समाधान प्रस्तावित नहीं करता है?

यह आखिरी सवाल का जवाब के लिए कठिन है जब तक आप लेखक :) कर रहे हैं, तो मैं एक ETag के रूप में एक MD5 हैश का उपयोग कर के कमजोर अंक खोजने की कोशिश कर रहा हूँ।

+6

यह मानना ​​कभी सुरक्षित नहीं है कि एक लेखक आपको थोड़ा सा बहिष्कार करता है। – spender

+13

@ स्पेंडर: सहमत है, लेकिन लेखक को आउटमार्ट करने के लिए यह कम सुरक्षित है। – Oddthinking

+7

और हम वेब कमेंटेटर, एक तरफ या दूसरे के स्मारकों को भी स्पर्श नहीं करेंगे ;-) –

उत्तर

39

ईटाग अंतिम-संशोधित शीर्षलेख के समान है। यह ग्राहक द्वारा परिवर्तन निर्धारित करने के लिए एक तंत्र है।

तर्कसंगत रूप से, एक ईटाग जो कि अंतिम संशोधित तिथि (यानी एक ही पाठ) होना चाहिए, ईटाग के लिए आवश्यक सभी मानदंडों को पूरा करता है। यह केवल संसाधन की स्थिति का प्रतिनिधित्व करने वाला एक अद्वितीय मूल्य होना चाहिए। संसाधनों के पूरे डोमेन में, अद्वितीय रूप से संसाधन के भीतर अद्वितीय नहीं है।

अब, तकनीकी रूप से, एक ईटाग में अंतिम-संशोधित शीर्षलेख की तुलना में "अनंत" संकल्प है। अंतिम-संशोधित केवल 1 सेकंड की ग्रैन्युलरिटी में बदलता है, जबकि एक ईटाग उप सेकेंड हो सकता है।

आप ईटाग और अंतिम-संशोधित, या बस एक या दूसरे (या बिल्कुल कोई नहीं) दोनों को कार्यान्वित कर सकते हैं। यदि आप अंतिम संशोधित पर्याप्त नहीं हैं, तो एक ईटीएजी पर विचार करें।

दिमाग, मैं "हर" संसाधन के लिए ईटाग सेट नहीं करता। असल में, मैं इसे किसी भी चीज़ के लिए सेट नहीं करता जिसके पास कैश होने की कोई उम्मीद नहीं है (विशेष रूप से गतिशील सामग्री)। उस मामले में कोई बात नहीं है, बस काम बर्बाद कर दिया।

संपादित करें: मैं आपका संपादन देखता हूं, और स्पष्टीकरण देता हूं।

MD5 ठीक है। केवल नकारात्मक पक्ष एमडी 5 की गणना कर रहा है। एक 200 के पीडीएफ फाइल कहें, एमडी 5 चलाना महंगा है। एक संसाधन पर एमडी 5 चला रहा है जिसमें कैश होने की कोई उम्मीद नहीं है, वह केवल अपर्याप्त है (यानी गतिशील सामग्री)।

चाल यह है कि आप जो भी तंत्र उपयोग करते हैं, यह उतना ही सस्ता होना चाहिए जितना अंतिम-संशोधित है। अंतिम संशोधित, फिर, आम तौर पर, संसाधन की एक संपत्ति है, और आमतौर पर पहुंच के लिए बहुत सस्ता है।

ईटीएजी समान रूप से सस्ते होना चाहिए। यदि आप एमडी 5 का उपयोग कर रहे हैं, और आप संसाधन और एमडी 5 हैश के बीच एसोसिएशन को कैश/स्टोर कर सकते हैं, तो यह एक अच्छा समाधान है। हालांकि, ईटीएजी आवश्यक होने पर हर बार एमडी 5 का पुनर्मूल्यांकन करना मूल रूप से समग्र सर्वर प्रदर्शन में सुधार के लिए ईटीएजी का उपयोग करने के विचार से मुकाबला करता है।

+0

धन्यवाद। मेरे विशेष मामले में मेरे पास पहले से ही MD5 है क्योंकि मैं डिजिटल हस्ताक्षर पर हस्ताक्षर कर रहा हूं, लेकिन मुझे लगता है कि यह अन्य परिदृश्यों के लिए एक प्रदर्शन समस्या हो सकती है। धन्यवाद! –

+11

"एक ईटाग जो कि अंतिम संशोधित तिथि (यानी एक ही पाठ) होने के लिए होता है, वह ईटाग के लिए आवश्यक सभी मानदंडों को पूरा करता है"। यह सच नहीं है क्योंकि एक Gzipped और unGzipped प्रतिक्रिया दोनों एक ही संशोधित तारीख होगी; हालांकि उनके पास अलग-अलग Etags होना चाहिए: https://issues.apache.org/bugzilla/show_bug.cgi?id=39727 – johnstok

+11

"कहें, एक 200 के पीडीएफ फाइल पर एमडी 5 चलाना महंगा है" - आमतौर पर नहीं, आधुनिक प्रोसेसर एमडी 5 पर यहां तक ​​कि जीबीटी ईथरनेट की तुलना में कई गुना तेज है, अकेले अंत उपयोगकर्ता इंटरनेट कनेक्शन दें। यदि आपके ईटैग्स में 1% स्थानान्तरण से परहेज करने का मौका है, तो यह प्रोबली इस्तेमाल किए गए CPU समय के लिए बनाता है। – intgr

0

मुझे लगता है कि perceived problem ईजीएसएस के साथ शायद यह है कि आपके ब्राउज़र को यह सुनिश्चित करने के लिए आपके पृष्ठ पर प्रत्येक संसाधन के लिए एक (सरल और छोटा) अनुरोध/प्रतिक्रिया देना है और यह निर्धारित करने के लिए कि ईटैग मान सर्वर पक्ष बदल गया है या नहीं।

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

+0

पुस्तक में उल्लिखित समस्या यह है कि आपको एक विशेष और शायद __smart__ रणनीति के साथ आने की आवश्यकता है (यदि लेखक आपको अच्छी रणनीति नहीं मिल पा रहे हैं तो लेखक भी ईटैग से समर्थन छोड़ने के लिए प्रोत्साहित करते हैं)। यही वह है जो मुझे अजीब लगता है, क्या एमडी 5 एक अच्छा समाधान है? यदि ऐसा है तो बस इतना क्यों नहीं कहें? –

+0

उचित 'अधिकतम आयु' या 'समाप्ति' ग्राहक को यह जानने के लिए कितना इंतजार करना होगा कि वह कितना छोटा है "क्या कोई नया है?" निवेदन। तो आप roundtrips भी बचा सकते हैं। –

+0

@ पाब्लो फर्नांडीज: एमडी 5 ठीक है, लेकिन मैं व्यक्तिगत रूप से फ़ाइल की पूरी सामग्री को नहीं रखूंगा। 'अंतिम फ़ाइल संशोधन दिनांक' को धक्का देना पर्याप्त साबित होना चाहिए। 'क्यों न सिर्फ यह कहें?' बिट: शायद किताब शीर्षक (उच्च प्रदर्शन वेब साइटों) में जवाब सही है। इटैग (और उनके राउंडट्रिप्स) कुछ ओवरहेड जोड़ते हैं और भारी लोड किए गए वेबसर्वर पर विचार करने के लिए एक महत्वपूर्ण कारक हो सकते हैं (लेकिन साथ ही वे लचीलापन जोड़ते हैं) ... – ChristopheD

1

पुस्तक को पढ़ने के बाद, मैं लेखक की सटीक चिंताओं पर बात नहीं कर सकता।

हालांकि, ईटैग की पीढ़ी ऐसी होनी चाहिए कि एक ईटाग केवल एक पृष्ठ बदल जाने पर ही उत्पन्न हो। वेब पेज के एमडी 5 हैश को सर्वर पर प्रसंस्करण शक्ति और समय की लागत उत्पन्न करना; यदि आपके पास कई क्लाइंट कनेक्ट हैं, तो यह प्रदर्शन समस्याओं का कारण बन सकता है।

इस प्रकार, आपको आवश्यक होने पर ईटैग केवल उत्पन्न करने के लिए एक अच्छी तकनीक की आवश्यकता है और संबंधित पेज में परिवर्तन होने तक सर्वर पर उन्हें कैशिंग करना।

+1

मुझे साझा साझा रहस्य के साथ प्रत्येक सर्वर प्रतिक्रिया पर डिजिटल हस्ताक्षर करना होगा। तो ईटाग एक अच्छा दुष्प्रभाव था :) –

4

हम इंस्टेला में हमारी गतिशील सामग्री के लिए ईटैग का उपयोग कर रहे हैं।

हमारी रणनीति सामग्री के md5 हैश को उत्पन्न करने के आउटपुट के अंत में है और यदि if-none-match हेडर मौजूद है, तो हम जेनरेटेड हैश के साथ हेडर की तुलना करते हैं। यदि दो मान समान हैं तो हम 304 कोड भेजते हैं और किसी भी सामग्री को वापस किए बिना अनुरोध को बाधित करते हैं।

यह सच है कि हम सामग्री को हैश करने के लिए थोड़ा सीपीयू का उपभोग करते हैं लेकिन आखिर में हम बहुत बैंडविड्थ बचा रहे हैं।

हमारे पास एक फेसबुक न्यूजफीड शैली मुख्य पृष्ठ है जिसमें प्रत्येक उपयोगकर्ता के लिए अलग-अलग सामग्री है। चूंकि न्यूजफीड सामग्री प्रति घंटे केवल 3-4 बार बदलती है, मुख्य पृष्ठ रीफ्रेश क्लाइंट पक्ष के लिए बहुत कुशल होते हैं। मोबाइल युग में मुझे लगता है कि बैंडविड्थ खर्च करने से थोड़ा अधिक सीपीयू समय बिताना बेहतर है। बैंडविड्थ अभी भी सीपीयू की तुलना में अधिक महंगा है, और यह ग्राहक के लिए एक बेहतर अनुभव है।

संबंधित मुद्दे