ഉയർന്ന ട്രാഫിക്കുള്ള ഒരു വീഡിയോ സൈറ്റ്, അതിന്റെ ട്രെൻഡിംഗ് പേജ് ഫീഡിനായുള്ള ഡാറ്റാബേസ് ക്വറികൾ മിനിറ്റിൽ 4,000-ൽ നിന്ന് 50-ൽ താഴെയായി കുറയ്ക്കുകയും, 95th-percentile റെസ്പോൺസ് ടൈം 380 ms-ൽ നിന്ന് 40 ms-ലേക്ക് കുറയ്ക്കുകയും ചെയ്തു. Varnish, Edge Side Includes (ESI) എന്നിവ ഉപയോഗിച്ച് 'ഹോൾ-പേജ് കാഷിംഗിൽ' (whole-page caching) നിന്ന് 'ഫ്രാഗ്മെന്റ് കാഷിംഗിലേക്ക്' (fragment caching) മാറിയതാണ് ഈ മാറ്റത്തിന് കാരണം.
സൈറ്റിന് വ്യത്യസ്തമായ ഒരു കാഷ് സ്ട്രാറ്റജി ആവശ്യമായി വന്നത് എന്തുകൊണ്ട്
അന്നേദിവസത്തെ ഏറ്റവും കൂടുതൽ കണ്ട വീഡിയോകൾ കാണിക്കുന്ന ഫ്രണ്ട് പേജ് ഒരു പ്രദേശത്തെ മിക്കവാറും എല്ലാ സന്ദർษകർക്കും ഒരേപോലെയാണ് കാണപ്പെടുന്നത്: പത്തുലക്ഷം ഉപയോക്താക്കൾക്കും ഏകദേശം 95 ശതമാനം HTML-ഉം ഒന്നുതന്നെയാണ്, ബാക്കി 5 ശതമാനത്തിൽ ലോഗിൻ ചെയ്ത ഉപയോക്താവിന്റെ പേര് അല്ലെങ്കിൽ ഒരു സെർച്ച് ബോക്സ് പോലുള്ള വ്യക്തിഗത വിവരങ്ങൾ അടങ്ങിയിരിക്കുന്നു. എഞ്ചിനീയറിംഗ് ടീമിന് മുന്നിൽ രണ്ട് മോശം ഓപ്ഷനുകൾ ഉണ്ടായിരുന്നു:
- മുഴുവൻ പേജും കാഷ് ചെയ്യുക, എന്നാൽ ഇത് ലോഗിൻ ചെയ്ത ഉപയോക്താക്കൾക്ക് പഴയ (stale) വ്യക്തിഗത വിവരങ്ങൾ കാണിക്കാൻ കാരണമായേക്കാം.
- കാഷ് പൂർണ്ണമായും ഒഴിവാക്കുക, ഇത് ഓരോ റിക്വസ്റ്റും ഡാറ്റാബേസിനെ അമിതമായി ബാധിക്കും.
രണ്ട് രീതികളും ഉപയോക്താവിന്റെ അനുഭവം (user experience) തകരാറിലാക്കും. ഇതിന് പരിഹാരമായി ടീം ESI ഉപയോഗിക്കാൻ തീരുമാനിച്ചു. ഒരു റിവേഴ്സ് പ്രോക്സിക്ക് (reverse-proxy) നെറ്റ്വർക്കിന്റെ എഡ്ജിൽ വെച്ച് സ്വതന്ത്രമായി കാഷ് ചെയ്ത ഫ്രാഗ്മെന്റുകൾ ഉപയോഗിച്ച് ഒരു പേജ് നിർമ്മിക്കാൻ ഈ സാങ്കേതികവിദ്യ അനുവദിക്കുന്നു.
ഫ്രാഗ്മെന്റ് കാഷിംഗ് എങ്ങനെ ക്രമീകരിച്ചു
ഓപ്പൺ സോഴ്സ് HTTP ആക്സിലറേറ്ററായ Varnish, പേജിനെ മാറ്റം വരുത്താവുന്ന മൂന്ന് ഭാഗങ്ങളുള്ള ഒരു സ്കെലിറ്റൺ (skeleton) ആയി പരിഗണിച്ചു:
- വീഡിയോ ഗ്രിഡ് (Video grid) – ട്രെൻഡിംഗ് വീഡിയോകളുടെ ലിസ്റ്റ്. ഇത് ഇടയ്ക്കിടെ മാറുന്നതിനാൽ 60 സെക്കൻഡ് നേരത്തേക്ക് കാഷ് ചെയ്യുന്നു, എന്നാൽ ഇത് എല്ലാ അനോനിമസ് സന്ദർษകർക്കും ഒന്നുതന്നെയാണ്.
- ഭാഷാ മാറ്റം (Language switcher) – അപൂർവ്വമായി മാത്രം മാറുന്ന ഒരു സ്റ്റാറ്റിക് UI ഘടകം. ഇത് 24 മണിക്കൂർ നേരത്തേക്ക് കാഷ് ചെയ്യുന്നു.
- ഹെഡർ (Header) – യഥാർത്ഥത്തിൽ വ്യക്തിഗതമായ ഒരേയൊരു ഭാഗം (ഉപയോക്താവിന്റെ പേര്, അവതാർ, നോട്ടിഫിക്കേഷനുകൾ). ഇത് ഒരിക്കലും കാഷ് ചെയ്യുന്നില്ല; ഓരോ തവണയും Varnish റിക്വസ്റ്റ് ആപ്ലിക്കേഷൻ സെർവറിലേക്ക് അയക്കുന്നു.
ഒരു റിക്വസ്റ്റ് വരുമ്പോൾ, Varnish കാഷ് ചെയ്ത സ്കെലിറ്റൺ നൽകുകയും, ലോക്കൽ സ്റ്റോറിൽ നിന്ന് രണ്ട് കാഷ് ചെയ്ത ഫ്രാഗ്മെന്റുകൾ എടുക്കുകയും, ബാക്കെൻഡിൽ നിന്ന് ലൈവ് ഹെഡർ ഉൾപ്പെടുത്തുകയും ചെയ്യുന്നു.
പ്രധാനപ്പെട്ട കണക്കുകൾ
മാറ്റത്തിന് ശേഷം:
- ട്രെൻഡിംഗ് പേജിനായുള്ള ഡാറ്റാബേസ് ലോഡ് മിനിറ്റിൽ 4,000 ക്വറികളിൽ നിന്ന് 50-ൽ താഴെയായി കുറഞ്ഞു.
- 95th-percentile ലേറ്റൻസി 380 ms-ൽ നിന്ന് 40 ms-ലേക്ക് കുറഞ്ഞു.
ഈ പ്രവർത്തനത്തിൽ നിന്നുള്ള മൂന്ന് പ്രായോഗിക പാഠങ്ങൾ
1. ഗ്രേസ് പിരീഡുകൾ (Grace periods) കാഷ് മിസ്സുകൾ ലഘൂകരിക്കുന്നു ഒരു ഫ്രാഗ്മെന്റിന്റെ TTL അവസാനിക്കുമ്പോൾ, പുതിയ വിവരങ്ങൾ ശേഖരിക്കാൻ Varnish സാധാരണയായി നിർത്തിനിൽക്കും, ഇത് ലേറ്റൻസി വർദ്ധിപ്പിക്കുകയും ഒരേസമയം നിരവധി ബാക്കെൻഡ് കോളുകൾ വരാൻ (thundering herd) കാരണമാവുകയും ചെയ്യും. ഒരു ഗ്രേസ് പിരീഡ് കോൺഫിഗർ ചെയ്യുന്നതിലൂടെ, ബാക്ക്ഗ്രൗണ്ടിൽ കാഷ് പുതുക്കുന്നതിനോടൊപ്പം പഴയ ഫ്രാഗ്മെന്റ് തന്നെ നൽകാൻ Varnish-ന് സാധിക്കുന്നു. ഉപയോക്താക്കൾക്ക് തടസ്സങ്ങൾ അനുഭവപ്പെടില്ല; ബാക്കെൻഡിന് നിയന്ത്രിക്കാവുന്ന രീതിയിലുള്ള റിക്വസ്റ്റുകൾ ലഭിക്കുന്നു.
2. അനോനിമസ് ഫ്രാഗ്മെന്റുകളിൽ നിന്ന് കുക്കികൾ ഒഴിവാക്കുക ഓരോ റിക്വസ്റ്റോടുമൊപ്പമുള്ള കുക്കികൾ Varnish-നെ ഓരോ റിക്വസ്റ്റും വ്യത്യസ്തമാണെന്ന് കരുതാൻ പ്രേരിപ്പിക്കുകയും കാഷ് ഉപയോഗം കുറയ്ക്കുകയും ചെയ്യുന്നു. വീഡിയോ ഗ്രിഡിനും ലാംഗ്വേജ് സ്വിച്ചറിനും വേണ്ടി ടീം കുക്കികൾ ഒഴിവാക്കി, ഇത് ആ ഫ്രാഗ്മെന്റുകൾ കൂടുതൽ കാര്യക്ഷമമായി കാഷ് ചെയ്യാൻ സഹായിച്ചു. ഹെഡർ ഫ്രാഗ്മെന്റിൽ മാത്രം കുക്കികൾ നിലനിർത്തിക്കൊണ്ട് കാഷ് കാര്യക്ഷമത നഷ്ടപ്പെടുത്താതെ തന്നെ വ്യക്തിഗത വിവരങ്ങൾ സംരക്ഷിച്ചു.
3. സർഗേറ്റ് കീകൾ (Surrogate keys) ഇൻസ്റ്റന്റ് പർജിംഗ് സാധ്യമാക്കുന്നു ചിലപ്പോൾ ഒരു വീഡിയോ ഉടൻ തന്നെ നീക്കം ചെയ്യേണ്ടി വരാം—ഉദാഹരണത്തിന് കോപ്പിറൈറ്റ് കാരണങ്ങളാൽ. 60 സെക്കൻഡ് TTL കഴിയുന്നതുവരെ കാത്തിരിക്കുന്നത് ശരിയല്ല. ഓരോ കാഷ് ചെയ്ത ഫ്രാഗ്മെന്റിനും വീഡിയോ ഐഡികൾ സൂചിപ്പിക്കുന്ന ഒരു സർഗേറ്റ് കീ നൽകുന്നതിലൂടെ, ഒരു സിംഗിൾ പർജ് കമാൻഡ് വഴി എല്ലാ എഡ്ജ് നോഡുകളിലുമുള്ള ആ വീഡിയോയുടെ എല്ലാ കോപ്പികളും ഉടൻ തന്നെ ഇല്ലാതാക്കാൻ ടീമിന് സാധിക്കുന്നു. ഇത് മുഴുവൻ കാഷും ക്ലിയർ ചെയ്യുന്നത് ഒഴിവാക്കുകയും സൈറ്റിന്റെ നിയമപരമായ കാര്യങ്ങൾ പാലിക്കാൻ സഹായിക്കുകയും ചെയ്യുന്നു.
ചുരുക്കത്തിൽ: Varnish, ESI എന്നിവ ഉപയോഗിച്ചുള്ള ഫ്രാഗ്മെന്റ് കാഷിംഗ്, ഡാറ്റാബേസിനെ ആശ്രയിച്ചുനിൽക്കുന്ന ഒരു വലിയ പേജിനെ ഭാരം കുറഞ്ഞതും വീണ്ടും ഉപയോഗിക്കാവുന്നതുമായ ഭാഗങ്ങളാക്കി മാറ്റുന്നു. ഇത് ഉപയോക്താക്കളുടെ വ്യക്തിഗത വിവരങ്ങൾ നിലനിർത്തിക്കൊണ്ടുതന്നെ ബാക്കെൻഡ് ലോഡും ലേറ്റൻസിയും ഗണ്യമായി കുറയ്ക്കുന്നു.
