Sebuah laman video trafik tinggi mengurangkan pertanyaan pangkalan data untuk suapan halaman trending daripada 4,000 seminit kepada kurang daripada 50 dan menurunkan masa tindak balas persentil ke-95 daripada 380 ms kepada 40 ms dengan beralih daripada caching keseluruhan halaman kepada caching fragmen menggunakan Varnish dan Edge Side Includes (ESI).
Mengapa laman tersebut memerlukan strategi cache yang berbeza
Halaman utama yang memaparkan klip paling banyak ditonton pada hari tersebut kelihatan sama bagi hampir setiap pelawat di sesebuah wilayah: kira-kira 95 peratus HTML adalah serupa bagi sejuta pengguna, manakala baki 5 peratus membawa data peribadi seperti nama pengguna yang telah log masuk atau kotak carian. Pasukan kejuruteraan menghadapi dua pilihan yang tidak menarik:
- Cache keseluruhan halaman dan berisiko memaparkan data peribadi yang lapuk kepada pengguna yang telah log masuk.
- Langkau cache sepenuhnya dan biarkan setiap permintaan membebankan pangkalan data.
Kedua-dua pendekatan tersebut menjejaskan pengalaman pengguna. Pasukan beralih kepada ESI, satu teknik yang membolehkan reverse-proxy menyusun halaman daripada fragmen yang di-cache secara bebas di bahagian edge rangkaian.
Bagaimana caching fragmen disambungkan
Varnish, pemecut HTTP sumber terbuka, melayan halaman tersebut sebagai rangka dengan tiga bahagian yang boleh diganti:
- Grid video – senarai video trending yang mahal dan merangkumi seluruh wilayah. Di-cache selama 60 saat kerana ia kerap berubah tetapi adalah sama bagi setiap pelawat tanpa nama.
- Penukar bahasa – elemen UI statik yang jarang berubah. Di-cache selama 24 jam.
- Header – satu-satunya fragmen yang benar-benar peribadi (nama pengguna, avatar, pemberitahuan). Tidak pernah di-cache; Varnish memajukan permintaan ke pelayan aplikasi setiap kali.
Apabila permintaan tiba, Varnish menyediakan rangka yang di-cache, mengambil dua fragmen yang di-cache daripada stor tempatannya, dan memasukkan header secara langsung daripada backend.
Angka yang penting
Selepas peralihan:
- Beban pangkalan data untuk halaman trending jatuh daripada 4,000 pertanyaan seminit kepada kurang daripada 50.
- Latensi persentil ke-95 turun daripada 380 ms kepada 40 ms.
Tiga pengajaran praktikal daripada pelaksanaan
1. Tempoh ihsan (grace periods) melicinkan kegagalan cache (cache misses) Apabila TTL fragmen tamat tempoh, Varnish biasanya akan berhenti seketika untuk mengambil kandungan segar, mewujudkan lonjakan latensi yang boleh mencetuskan fenomena “thundering herd” (serangan serentak) panggilan backend yang serentak. Dengan mengkonfigurasi tempoh ihsan, Varnish terus menyediakan fragmen yang lapuk sementara ia menyegarkan cache secara senyap di latar belakang. Pengguna tidak melihat sebarang gangguan; backend melihat kadar permintaan yang stabil dan terkawal.
2. Buang cookie untuk fragmen tanpa nama Cookie yang disertakan pada setiap permintaan menyebabkan Varnish melayan setiap permintaan sebagai unik, sekali gus membatalkan keberkesanan cache hit. Pasukan membuang cookie untuk grid video dan penukar bahasa, membolehkan fragmen tersebut di-cache secara agresif. Hanya fragmen header yang membawa cookie, mengekalkan personalisasi tanpa mengorbankan kecekapan cache.
3. Kunci surogasi (surrogate keys) membolehkan pembersihan (purging) segera Kadangkala sesebuah video mesti dikeluarkan dengan segera—contohnya, atas sebab hak cipta. Menunggu TTL 60 saat tamat tempoh adalah tidak boleh diterima. Dengan menandakan setiap fragmen yang di-cache dengan kunci surogasi yang mencerminkan ID video berkaitan, pasukan mengeluarkan satu arahan pembersihan tunggal yang membatalkan semua salinan video tertentu secara serta-merta di setiap nod edge. Ini mengelakkan pembersihan cache secara menyeluruh dan memastikan laman tersebut mematuhi peraturan.
Rumusan: Caching fragmen dengan Varnish dan ESI menukarkan halaman monolitik yang terikat dengan pangkalan data kepada set komponen ringan yang boleh digunakan semula, sekali gus mengurangkan beban backend dan latensi sambil mengekalkan personalisasi bagi setiap pengguna.
