એક હાઈ-ટ્રાફિક વિડિયો સાઇટે તેના ટ્રેન્ડિંગ-પેજ ફીડ માટેના ડેટાબેઝ ક્વેરીઝને પ્રતિ મિનિટ 4,000 થી ઘટાડીને 50 થી પણ ઓછી કરી દીધી અને તેના 95th-percentile રિસ્પોન્સ ટાઈમને 380 ms થી ઘટાડીને 40 ms કરી દીધો. આ સફળતા Varnish અને Edge Side Includes (ESI) સાથે વ્હોલ-પેજ કેશિંગ (whole-page caching) થી ફ્રેગમેન્ટ કેશિંગ (fragment caching) પર સ્થાનાંતરિત થવાથી મળી છે.
સાઇટે શા માટે અલગ કેશ વ્યૂહરચનાની જરૂર હતી
દિવસના સૌથી વધુ જોવાયેલા ક્લિપ્સ બતાવતું ફ્રન્ટ પેજ એક જ પ્રદેશના લગભગ દરેક મુલાકાતી માટે સમાન દેખાય છે: લાખો વપરાશકર્તાઓ માટે લગભગ 95 ટકા HTML સમાન હોય છે, જ્યારે બાકીના 5 ટકામાં લોગ-ઇન થયેલ વપરાશકર્તાનું નામ અથવા સર્ચ બોક્સ જેવો વ્યક્તિગત ડેટા હોય છે. એન્જિનિયરિંગ ટીમને બે અપ્રિય વિકલ્પોનો સામનો કરવો પડ્યો:
- આખું પેજ કેશ કરવું અને લોગ-ઇન થયેલ વપરાશકર્તાઓને જૂનો (stale) વ્યક્તિગત ડેટા બતાવવાનું જોખમ લેવું.
- કેશને સંપૂર્ણપણે બાયપાસ કરવું અને દરેક રિક્વેસ્ટને ડેટાબેઝ પર ભાર આપવા દેવું.
બંને અભિગમોએ યુઝર એક્સપિરિયન્સ બગાડ્યો. ટીમ ESI તરફ વળી, જે એક એવી ટેકનિક છે જે રિવર્સ-પ્રોક્સીને નેટવર્ક એજ પર સ્વતંત્ર રીતે કેશ કરેલા ફ્રેગમેન્ટ્સમાંથી પેજ તૈયાર કરવાની મંજૂરી આપે છે.
ફ્રેગમેન્ટ કેશિંગ કેવી રીતે સેટ કરવામાં આવ્યું
Varnish, જે એક ઓપન-સોર્સ HTTP એક્સિલરેટર છે, તેણે પેજને ત્રણ બદલી શકાય તેવા ભાગો ધરાવતા એક સ્કેલેટન (skeleton) તરીકે ગણ્યું:
- Video grid – ટ્રેન્ડિંગ વિડિયોઝની મોંઘી (resource-intensive), પ્રદેશ-વ્યાપી યાદી. તેને 60 સેકન્ડ માટે કેશ કરવામાં આવે છે કારણ કે તે વારંવાર બદલાય છે પરંતુ દરેક અનામી (anonymous) મુલાકાતી માટે સમાન હોય છે.
- Language switcher – એક સ્ટેટિક UI એલિમેન્ટ જે ભાગ્યે જ બદલાય છે. તેને 24 કલાક માટે કેશ કરવામાં આવે છે.
- Header – એકમાત્ર સાચો વ્યક્તિગત ફ્રેગમેન્ટ (વપરાશકર્તાનું નામ, અવતાર, નોટિફિકેશન). તેને ક્યારેય કેશ કરવામાં આવતો નથી; Varnish દરેક વખતે રિક્વેસ્ટને એપ્લિકેશન સર્વર પર ફોરવર્ડ કરે છે.
જ્યારે રિક્વેસ્ટ આવે છે, ત્યારે Varnish કેશ કરેલ સ્કેલેટન સર્વ કરે છે, તેના લોકલ સ્ટોર માંથી બે કેશ કરેલા ફ્રેગમેન્ટ્સ મેળવે છે, અને બેકએન્ડમાંથી લાઈવ હેડર ઉમેરે છે.
મહત્વના આંકડા
બદલાવ પછી:
- ટ્રેન્ડિંગ પેજ માટેનો ડેટાબેઝ લોડ પ્રતિ મિનિટ 4,000 ક્વેરીઝથી ઘટીને 50 થી પણ ઓછી થઈ ગયો.
- 95th-percentile લેટન્સી (latency) 380 ms થી ઘટીને 40 ms થઈ ગઈ.
રોલઆઉટમાંથી ત્રણ વ્યવહારુ પાઠ
1. ગ્રેસ પિરિયડ્સ (Grace periods) કેશ મિસને સરળ બનાવે છે જ્યારે ફ્રેગમેન્ટનો TTL એક્સપાયર થાય છે, ત્યારે Varnish સામાન્ય રીતે તાજું કન્ટેન્ટ મેળવવા માટે અટકી જાય છે, જેનાથી લેટન્સીમાં વધારો થાય છે જે એકસાથે અનેક બેકએન્ડ કોલ્સના “થંડરિંગ હર્ડ” (thundering herd) માં પરિણમી શકે છે. ગ્રેસ પિરિયડ કોન્ફિગર કરીને, Varnish બેકગ્રાઉન્ડમાં શાંતિથી કેશ રિફ્રેશ કરતી વખતે જૂનો (stale) ફ્રેગમેન્ટ સર્વ કરવાનું ચાલુ રાખે છે. વપરાશકર્તાઓને કોઈ વિલંબ દેખાતો નથી; બેકએન્ડ એક સ્થિર, વ્યવસ્થિત રિક્વેસ્ટ રેટ જુએ છે.
2. અનામી ફ્રેગમેન્ટ્સ માટે કુકીઝ (cookies) દૂર કરો દરેક રિક્વેસ્ટ સાથે જોડાયેલી કુકીઝ Varnish ને દરેક રિક્વેસ્ટને યુનિક તરીકે ગણવા માટે મજબૂર કરે છે, જેનાથી કેશ હિટ્સ (cache hits) નકામા થઈ જાય છે. ટીમે વિડિયો ગ્રીડ અને લેંગ્વેજ સ્વિચર માટે કુકીઝ દૂર કરી દીધી, જેનાથી તે ફ્રેગમેન્ટ્સને આક્રમક રીતે (aggressively) કેશ કરવાની મંજૂરી મળી. માત્ર હેડર ફ્રેગમેન્ટમાં જ કુકીઝ હોય છે, જે કેશ કાર્યક્ષમતા સાથે સમાધાન કર્યા વિના પર્સનલાઇઝેશન જાળવી રાખે છે.
3. સરોગેટ કીઝ (Surrogate keys) ઇન્સ્ટન્ટ પર્જિંગ (purging) સક્ષમ બનાવે છે ક્યારેક કોઈ વિડિયો તાત્કાલિક દૂર કરવો જરૂરી હોય છે—દા.ત., કોપીરાઈટના કારણોસર. 60-સેકન્ડના TTL એક્સપાયર થવાની રાહ જોવી અસ્વીકાર્ય છે. દરેક કેશ કરેલા ફ્રેગમેન્ટને સરોગેટ કી સાથે ટેગ કરીને જે અન્ડરલાઇંગ વિડિયો ID દર્શાવે છે, ટીમ એક સિંગલ પર્જ કમાન્ડ ઇશ્યુ કરે છે જે દરેક એજ નોડ પર ચોક્કસ વિડિયોની તમામ નકલોને તરત જ અમાન્ય (invalidate) કરી દે છે. આ આખા કેશને સ્વીપ કરવાનું ટાળે છે અને સાઇટને નિયમોનું પાલન કરવામાં મદદ કરે છે.
સારાંશ: Varnish અને ESI સાથેનું ફ્રેગમેન્ટ કેશિંગ એક મોનોલિથિક, ડેટાબેઝ-બાઉન્ડ પેજને હળવા, ફરીથી ઉપયોગ કરી શકાય તેવા ટુકડાઓના સેટમાં ફેરવે છે, જે યુઝર પર્સનલાઇઝેશન જાળવી રાખીને બેકએન્ડ લોડ અને લેટન્સીમાં મોટો ઘટાડો કરે છે.
