అధిక ట్రాఫిక్ ఉన్న ఒక వీడియో సైట్, తన ట్రెండింగ్-పేజీ ఫీడ్ కోసం నిమిషానికి 4,000గా ఉన్న డేటాబేస్ క్వెరీలను 50 కంటే తక్కువకు తగ్గించింది. అంతేకాకుండా, హోల్-పేజీ క్యాషింగ్ (whole-page caching) నుండి Varnish మరియు Edge Side Includes (ESI) ఉపయోగించి ఫ్రాగ్మెంట్ క్యాషింగ్ (fragment caching) విధానానికి మారడం ద్వారా, దాని 95వ శాతపు (95th-percentile) రెస్పాన్స్ టైమ్ను 380 ms నుండి 40 msకి తగ్గించింది.
ఈ సైట్కు వేరే క్యాష్ వ్యూహం ఎందుకు అవసరమైంది
రోజువారీ అత్యధికంగా చూసిన క్లిప్లను చూపించే ఫ్రంట్ పేజీ, ఒక ప్రాంతంలోని దాదాపు ప్రతి సందర్శకుడికి ఒకేలా కనిపిస్తుంది: ఒక మిలియన్ మంది వినియోగదారులకు దాదాపు 95 శాతం HTML ఒకేలా ఉంటుంది, మిగిలిన 5 శాతం మాత్రమే లాగిన్ అయిన యూజర్ పేరు లేదా సెర్చ్ బాక్స్ వంటి వ్యక్తిగత డేటాను కలిగి ఉంటుంది. ఇంజనీరింగ్ టీమ్ రెండు ఇబ్బందికరమైన ఎంపికలను ఎదుర్కొంది:
- మొత్తం పేజీని క్యాష్ చేయడం మరియు లాగిన్ అయిన యూజర్లకు పాత (stale) వ్యక్తిగత డేటాను చూపించే ప్రమాదం ఉంది.
- క్యాష్ను పూర్తిగా పక్కన పెట్టి, ప్రతి రిక్వెస్ట్ను డేటాబేస్కు పంపడం (hammer the database).
ఈ రెండు పద్ధతులు యూజర్ అనుభవాన్ని దెబ్బతీశాయి. అప్పుడు టీమ్ ESI వైపు మొగ్గు చూపింది. ఇది ఒక రివర్స్-ప్రాక్సీ (reverse-proxy), నెట్వర్క్ ఎడ్జ్ వద్ద స్వతంత్రంగా క్యాష్ చేయబడిన ఫ్రాగ్మెంట్ల నుండి ఒక పేజీని రూపొందించడానికి అనుమతిస్తుంది.
ఫ్రాగ్మెంట్ క్యాషింగ్ ఎలా అమలు చేయబడింది
ఓపెన్-సోర్స్ HTTP యాక్సిలరేటర్ అయిన Varnish, పేజీని మూడు మార్చుకోదగిన భాగాలతో కూడిన ఒక స్కెలిటన్ (skeleton) లాగా పరిగణించింది:
- వీడియో గ్రిడ్ (Video grid) – ఖరీదైన, ప్రాంతవ్యాప్త ట్రెండింగ్ వీడియోల జాబితా. ఇది తరచుగా మారుతూ ఉంటుంది, కానీ ప్రతి అనోనిమస్ విజిటర్కు ఒకేలా ఉంటుంది కాబట్టి, దీనిని 60 సెకన్ల పాటు క్యాష్ చేస్తారు.
- లాంగ్వేజ్ స్విచ్చర్ (Language switcher) – అరుదుగా మారే ఒక స్టాటిక్ UI ఎలిమెంట్. దీనిని 24 గంటల పాటు క్యాష్ చేస్తారు.
- హెడర్ (Header) – ఇది నిజమైన వ్యక్తిగత ఫ్రాగ్మెంట్ (యూజర్ పేరు, అవతార్, నోటిఫికేషన్లు). దీనిని ఎప్పుడూ క్యాష్ చేయరు; Varnish ప్రతిసారీ రిక్వెస్ట్ను అప్లికేషన్ సర్వర్కు ఫార్వార్డ్ చేస్తుంది.
ఒక రిక్వెస్ట్ వచ్చినప్పుడు, Varnish క్యాష్ చేయబడిన స్కెలిటన్ను అందిస్తుంది, తన లోకల్ స్టోర్ నుండి రెండు క్యాష్ చేయబడిన ఫ్రాగ్మెంట్లను తీసుకుంటుంది మరియు బ్యాకెండ్ నుండి లైవ్ హెడర్ను అందులో చేరుస్తుంది.
ముఖ్యమైన గణాంకాలు
మార్పు చేసిన తర్వాత:
- ట్రెండింగ్ పేజీ కోసం డేటాబేస్ లోడ్ నిమిషానికి 4,000 క్వెరీల నుండి 50 కంటే తక్కువకు తగ్గింది.
- 95వ శాతపు (95th-percentile) లేటెన్సీ 380 ms నుండి 40 msకి తగ్గింది.
ఈ రోల్అవుట్ నుండి మూడు ఆచరణాత్మక పాఠాలు
1. గ్రేస్ పీరియడ్స్ క్యాష్ మిస్లను సులభతరం చేస్తాయి ఒక ఫ్రాగ్మెంట్ యొక్క TTL ముగిసినప్పుడు, సాధారణంగా Varnish కొత్త కంటెంట్ను పొందడానికి ఆగుతుంది, దీనివల్ల లేటెన్సీ పెరుగుతుంది. ఇది ఒకేసారి అనేక బ్యాకెండ్ కాల్స్ వచ్చే "thundering herd" సమస్యకు దారితీయవచ్చు. గ్రేస్ పీరియడ్ను కాన్ఫిగర్ చేయడం ద్వారా, Varnish బ్యాక్గ్రౌండ్లో నిశ్శబ్దంగా క్యాష్ను రిఫ్రెష్ చేస్తున్నప్పుడు, పాత ఫ్రాగ్మెంట్ను అందిస్తూనే ఉంటుంది. దీనివల్ల వినియోగదారులకు ఎటువంటి అంతరాయం ఉండదు; బ్యాకెండ్కు స్థిరమైన, నియంత్రించదగిన రిక్వెస్ట్ రేట్ అందుతుంది.
2. అనోనిమస్ ఫ్రాగ్మెంట్ల కోసం కుక్కీలను తొలగించడం ప్రతి రిక్వెస్ట్కు జత చేయబడిన కుక్కీలు, Varnish ప్రతి రిక్వెస్ట్ను ప్రత్యేకమైనదిగా పరిగణించేలా చేస్తాయి, దీనివల్ల క్యాష్ హిట్స్ (cache hits) నిలిపివేయబడతాయి. టీమ్ వీడియో గ్రిడ్ మరియు లాంగ్వేజ్ స్విచ్చర్ కోసం కుక్కీలను తొలగించింది, తద్వారా ఆ ఫ్రాగ్మెంట్లను వేగంగా క్యాష్ చేయడానికి వీలైంది. కేవలం హెడర్ ఫ్రాగ్మెంట్ మాత్రమే కుక్కీలను కలిగి ఉంటుంది, దీనివల్ల క్యాష్ సామర్థ్యాన్ని తగ్గించకుండానే వ్యక్తిగతీకరణను (personalization) కాపాడవచ్చు.
3. సర్రోగేట్ కీలు తక్షణమే పర్జింగ్ (purging) చేయడానికి అనుమతిస్తాయి కొన్నిసార్లు ఒక వీడియోను వెంటనే తొలగించాల్సి రావచ్చు—ఉదాహరణకు, కాపీరైట్ కారణాల వల్ల. 60 సెకన్ల TTL ముగిసే వరకు వేచి ఉండటం అంగీకారం కాదు. ప్రతి క్యాష్ చేయబడిన ఫ్రాగ్మెంట్ను దానిలోని వీడియో IDలను ప్రతిబింబించేలా ఒక సర్రోగేట్ కీతో ట్యాగ్ చేయడం ద్వారా, టీమ్ ఒకే ఒక పర్జ్ కమాండ్ను జారీ చేస్తుంది. ఇది ప్రతి ఎడ్జ్ నోడ్లో ఆ నిర్దిష్ట వీడియో యొక్క అన్ని కాపీలను తక్షణమే చెల్లాచెదురు (invalidate) చేస్తుంది. ఇది పూర్తి క్యాష్ స్వీప్ను నివారించి, సైట్ను నిబంధనలకు అనుగుణంగా ఉంచుతుంది.
సారాంశం: Varnish మరియు ESI తో కూడిన ఫ్రాగ్మెంట్ క్యాషింగ్, ఒక మోనోలిథిక్, డేటాబేస్పై ఆధారపడిన పేజీని తేలికపాటి, తిరిగి ఉపయోగించదగిన భాగాల సమితిగా మారుస్తుంది. ఇది యూజర్ వ్యక్తిగతీకరణను కాపాడుతూనే, బ్యాకెండ్ లోడ్ మరియు లేటెన్సీని గణనీయంగా తగ్గిస్తుంది.
