Popularny serwis wideo o dużym natężeniu ruchu zredukował liczbę zapytań do bazy danych dla kanału ze stroną trendów z 4000 na minutę do mniej niż 50 i obniżył czas odpowiedzi dla 95. percentyla z 380 ms do 40 ms, przechodząc z buforowania całych stron na buforowanie fragmentów przy użyciu Varnish i Edge Side Includes (ESI).

Dlaczego serwis potrzebował innej strategii buforowania

Strona główna wyświetlająca najchętniej oglądane klipy z danego dnia wygląda niemal identycznie dla prawie każdego użytkownika w danym regionie: około 95 procent kodu HTML jest identyczne dla miliona użytkowników, podczas gdy pozostałe 5 procent zawiera dane osobowe, takie jak nazwa zalogowanego użytkownika czy pole wyszukiwania. Zespół inżynierski stanął przed dwiema mało korzystnymi opcjami:

  • Buforować całą stronę i ryzykować serwowanie nieaktualnych danych osobowych zalogowanym użytkownikom.
  • Całkowicie omijać buforowanie i pozwalać, aby każde zapytanie obciążało bazę danych.

Oba podejścia negatywnie wpływały na doświadczenia użytkowników. Zespół zdecydował się na ESI – technikę, która pozwala serwerowi typu reverse-proxy składać stronę z niezależnie buforowanych fragmentów na brzegu sieci (edge).

Jak skonfigurowano buforowanie fragmentów

Varnish, otwartoźródłowy akcelerator HTTP, traktował stronę jako szkielet składający się z trzech wymiennych elementów:

  • Siatka wideo – kosztowna, regionalna lista popularnych filmów. Buforowana przez 60 sekund, ponieważ często się zmienia, ale jest taka sama dla każdego anonimowego użytkownika.
  • Przełącznik języka – statyczny element interfejsu użytkownika, który rzadko ulega zmianie. Buforowany przez 24 godziny.
  • Nagłówek – jedyny prawdziwie osobisty fragment (nazwa użytkownika, awatar, powiadomienia). Nigdy nie jest buforowany; Varnish za każdym razem przekazuje zapytanie do serwera aplikacji.

Gdy przychodzi zapytanie, Varnish serwuje buforowany szkielet, pobiera dwa buforowane fragmenty ze swojego lokalnego magazynu i wstawia aktualny nagłówek z backendu.

Liczby, które mają znaczenie

Po zmianie:

  • Obciążenie bazy danych dla strony z trendami spadło z 4000 zapytań na minutę do poniżej 50.
  • Opóźnienie dla 95. percentyla spadło z 380 ms do 40 ms.

Trzy praktyczne lekcje z wdrożenia

1. Okresy łagodzące (grace periods) niwelują skutki braku danych w buforze (cache misses) Gdy wygasa czas TTL fragmentu, Varnish normalnie wstrzymuje pracę, aby pobrać świeżą treść, co powoduje skok opóźnienia, który może przerodzić się w efekt „thundering herd” – lawinę jednoczesnych wywołań do backendu. Dzięki skonfigurowaniu okresu łagodzącego (grace period), Varnish nadal serwuje nieaktualny fragment, podczas gdy po cichu odświeża bufor w tle. Użytkownicy nie odczuwają żadnego opóźnienia, a backend otrzymuje stałą, możliwą do opanowania liczbę żądań.

2. Usuwanie ciasteczek dla anonimowych fragmentów Ciasteczka (cookies) dołączane do każdego zapytania sprawiają, że Varnish traktuje każde żądanie jako unikalne, co uniemożliwia trafienia w bufor (cache hits). Zespół usunął ciasteczka dla siatki wideo i przełącznika języka, co pozwoliło na agresywne buforowanie tych fragmentów. Tylko fragment nagłówka zawiera ciasteczka, co pozwala zachować personalizację bez poświęcania wydajności buforowania.

3. Klucze zastępcze (surrogate keys) umożliwiają natychmiastowe czyszczenie bufora Czasami film musi zostać usunięty natychmiast – np. z powodów praw autorskich. Czekanie na wygaśnięcie 60-sekundowego czasu TTL jest niedopuszczalne. Poprzez tagowanie każdego buforowanego fragmentu kluczem zastępczym (surrogate key), który odzwierciedla identyfikatory wideo, zespół może wydać pojedynczą komendę czyszczenia (purge), która natychmiast unieważnia wszystkie kopie konkretnego filmu na każdym węźle brzegowym (edge node). Pozwala to uniknąć pełnego czyszczenia bufora i zapewnia zgodność serwisu z przepisami.

Wniosek: Buforowanie fragmentów przy użyciu Varnish i ESI zmienia monolityczną stronę, zależną od bazy danych, w zestaw lekkich, wielokrotnego użytku elementów, drastycznie redukując obciążenie backendu i opóźnienia, przy jednoczesnym zachowaniu personalizacji dla każdego użytkownika.