एक हाई-ट्रैफ़िक वीडियो साइट ने अपने ट्रेंडिंग-पेज फ़ीड के लिए डेटाबेस क्वेरीज़ को प्रति मिनट 4,000 से घटाकर 50 से भी कम कर दिया और Varnish और Edge Side Includes (ESI) के साथ होल-पेज कैशिंग (whole-page caching) से फ़्रैगमेंट कैशिंग (fragment caching) पर स्विच करके अपने 95वें-परसेंटाइल रिस्पॉन्स टाइम को 380 ms से घटाकर 40 ms कर दिया।
साइट को एक अलग कैश रणनीति की आवश्यकता क्यों थी
वह फ्रंट पेज जो दिन के सबसे ज़्यादा देखे जाने वाले क्लिप्स दिखाता है, एक क्षेत्र के लगभग हर विज़िटर के लिए एक जैसा ही दिखता है: दस लाख उपयोगकर्ताओं के लिए लगभग 95 प्रतिशत HTML समान होता है, जबकि शेष 5 प्रतिशत में व्यक्तिगत डेटा होता है जैसे कि लॉग-इन किए गए उपयोगकर्ता का नाम या सर्च बॉक्स। इंजीनियरिंग टीम के सामने दो अवांछनीय विकल्प थे:
- पूरे पेज को कैश करना और लॉग-इन किए गए उपयोगकर्ताओं को पुराना (stale) व्यक्तिगत डेटा दिखाने का जोखिम उठाना।
- कैश को पूरी तरह से बायपास करना और हर रिक्वेस्ट को डेटाबेस पर बोझ डालने देना।
दोनों ही दृष्टिकोणों से यूजर एक्सपीरियंस खराब हो रहा था। टीम ने ESI का रुख किया, जो एक ऐसी तकनीक है जो एक रिवर्स-प्रॉक्सी को नेटवर्क के एज (edge) पर स्वतंत्र रूप से कैश किए गए फ़्रैगमेंट्स से एक पेज असेंबल करने की अनुमति देती है।
फ़्रैगमेंट कैशिंग को कैसे लागू किया गया
Varnish, जो एक ओपन-सोर्स HTTP एक्सेलेरेटर है, ने पेज को तीन रिप्लेसेबल (replaceable) हिस्सों वाले एक स्केलेटन (skeleton) के रूप में माना:
- वीडियो ग्रिड – ट्रेंडिंग वीडियो की महंगी, क्षेत्र-व्यापी सूची। इसे 60 सेकंड के लिए कैश किया जाता है क्योंकि यह बार-बार बदलता है लेकिन हर गुमनाम (anonymous) विज़िटर के लिए एक समान होता है।
- लैंग्वेज स्विचर – एक स्टैटिक UI एलिमेंट जो शायद ही कभी बदलता है। इसे 24 घंटों के लिए कैश किया जाता है।
- हेडर – एकमात्र वास्तव में व्यक्तिगत फ़्रैगमेंट (यूज़र नेम, अवतार, नोटिफिकेशन)। इसे कभी कैश नहीं किया जाता; Varnish हर बार रिक्वेस्ट को एप्लिकेशन सर्वर पर फॉरवर्ड कर देता है।
जब कोई रिक्वेस्ट आती है, तो Varnish कैश किए गए स्केलेटन को सर्व करता है, अपने लोकल स्टोर से दो कैश किए गए फ़्रैगमेंट्स निकालता है, और बैकएंड से लाइव हेडर को इसमें जोड़ देता है।
महत्वपूर्ण आंकड़े
स्विच करने के बाद:
- ट्रेंडिंग पेज के लिए डेटाबेस लोड प्रति मिनट 4,000 क्वेरीज़ से घटकर 50 से भी कम हो गया।
- 95वें-परसेंटाइल लेटेंसी 380 ms से घटकर 40 ms हो गई।
रोलआउट से तीन व्यावहारिक सबक
1. ग्रेस पीरियड (Grace periods) कैश मिस को सुचारू बनाते हैं जब किसी फ़्रैगमेंट का TTL समाप्त हो जाता है, तो Varnish आमतौर पर ताज़ा कंटेंट लाने के लिए रुक जाता है, जिससे लेटेंसी में अचानक उछाल (spike) आता है जो एक साथ होने वाली बैकएंड कॉल्स की "थंडरिंग हर्ड" (thundering herd) समस्या पैदा कर सकता है। एक ग्रेस पीरियड कॉन्फ़िगर करके, Varnish पुराने फ़्रैगमेंट को सर्व करना जारी रखता है जबकि वह बैकग्राउंड में चुपचाप कैश को रिफ्रेश करता रहता है। यूज़र्स को कोई रुकावट महसूस नहीं होती; बैकएंड को एक स्थिर और प्रबंधनीय रिक्वेस्ट रेट मिलता है।
2. गुमनाम फ़्रैगमेंट्स के लिए कुकीज़ हटा दें (Strip cookies) हर रिक्वेस्ट के साथ जुड़ी कुकीज़ के कारण Varnish हर रिक्वेस्ट को यूनिक मानता है, जिससे कैश हिट्स (cache hits) बेकार हो जाते हैं। टीम ने वीडियो ग्रिड और लैंग्वेज स्विचर के लिए कुकीज़ हटा दीं, जिससे उन फ़्रैगमेंट्स को आक्रामक रूप से कैश किया जा सका। केवल हेडर फ़्रैगमेंट में कुकीज़ होती हैं, जिससे कैश दक्षता से समझौता किए बिना पर्सनलाइजेशन बना रहता है।
3. सरोगेट कीज़ (Surrogate keys) इंस्टेंट पर्जिंग को सक्षम बनाती हैं कभी-कभी किसी वीडियो को तुरंत हटाना आवश्यक होता है—उदाहरण के लिए, कॉपीराइट कारणों से। 60-सेकंड के TTL के समाप्त होने का इंतज़ार करना स्वीकार्य नहीं है। प्रत्येक कैश किए गए फ़्रैगमेंट को एक सरोगेट की (surrogate key) के साथ टैग करके जो अंतर्निहित वीडियो आईडी को दर्शाती है, टीम एक सिंगल पर्ज कमांड जारी करती है जो हर एज नोड पर एक विशिष्ट वीडियो की सभी प्रतियों को तुरंत अमान्य (invalidate) कर देती है। इससे पूरे कैश को स्कैन करने की ज़रूरत नहीं पड़ती और साइट नियमों का पालन करती रहती है।
निष्कर्ष (Takeaway): Varnish और ESI के साथ फ़्रैगमेंट कैशिंग एक मोनोलिथिक (monolithic) और डेटाबेस-बाउंड पेज को हल्के, पुन: प्रयोज्य (reusable) टुकड़ों के सेट में बदल देती है, जिससे प्रति-उपयोगकर्ता पर्सनलाइजेशन को बनाए रखते हुए बैकएंड लोड और लेटेंसी में भारी कमी आती है।
