Przeniesienie generowania miniatur z backendu PHP do Cloudflare Workers wyeliminowało całkowite obciążenie procesora (CPU) serwera źródłowego dla serwisu hostingowego wideo, który obsługuje miliony obrazów dziennie. Zmiana ta przesunęła również opóźnienia przetwarzania obrazów z centrum danych na krawędź sieci (edge), co drastycznie skróciło czas odpowiedzi i uczyniło koszty pasma przewidywalnymi.

Dlaczego stary model przestał działać

Serwis, będący platformą wyświetlającą dziesiątki tysięcy filmów, osadza do 40 miniatur na pojedynczej stronie. Każda miniatura jest zmieniana na żądanie przez skrypt PHP, który odczytuje oryginalny plik i zmienia jego skalę. Gdy roboty indeksujące (crawlers) odwiedzały stronę, serwer backendowy ulegał zawieszeniu.

Przetwarzanie na krawędzi (edge) rozwiązuje pięć kluczowych wymagań

API do miniatur klasy produkcyjnej musi obsługiwać:

  • Fan-in – pobieranie obrazów źródłowych z wielu zewnętrznych hostów.
  • Fan-out – generowanie kilku rozmiarów (np. karty 320 px, obrazy typu hero 640 px).
  • Format negotiation – serwowanie formatów WebP lub AVIF, gdy przeglądarka je obsługuje, aby zmniejszyć zużycie pasma.
  • Cache – zapewnienie, że pierwsze żądanie może być kosztowne, ale każde kolejne jest darmowe.
  • Security – zapobieganie nadużyciom usługi w celu przetwarzania dowolnych obrazów.

Cloudflare Workers rozwiązują każdy z tych punktów bez obciążania procesora serwera źródłowego:

  1. Proximity – Workers działają w centrach danych blisko użytkownika, dzięki czemu przetworzony obraz pokonuje krótszą drogę.
  2. Built-in Image Resizing – Funkcja Image Resizing platformy wykonuje pracę na pikselach, eliminując potrzebę stosowania własnej biblioteki.
  3. Cache API – Workers przechowują zmienioną skalę obrazu na krawędzi; po pierwszym żądaniu krawędź serwuje go bezpośrednio.
  4. Programmable security – Mały skrypt weryfikuje podpisy HMAC, wymusza listę dozwolonych (allow-list) nazw hostów i szerokości oraz normalizuje klucze cache, aby zapobiec zatruciu pamięci podręcznej (cache poisoning).

Jak działa system

  1. Origin tworzy podpisane adresy URL – Backend przechowuje tajny klucz i dołącza podpis HMAC do każdego żądania miniatury. Adres URL zawiera również pożądaną szerokość i format.
  2. Worker weryfikuje podpis – Po otrzymaniu żądania Worker ponownie oblicza HMAC przy użyciu współdzielonego sekretu. Jeśli podpis jest nieobecny lub błędny, żądanie zostaje odrzucone, co zapobiega nadużyciom.
  3. Wymuszanie listy dozwolonych (allow-list) – Skrypt sprawdza, czy nazwa hosta źródłowego znajduje się na zdefiniowanej liście oraz czy żądana szerokość jest jednym z obsługiwanych rozmiarów. Zapobiega to buforowaniu złośliwych hostów.
  4. Normalizacja klucza cache – Sam podpis jest usuwany z klucza cache; klucz zawiera jedynie adres URL źródła, szerokość i format. Zwiększa to szansę, że różni użytkownicy żądający tego samego obrazu trafią na ten sam wpis w pamięci podręcznej.
  5. Pobieranie i zmiana rozmiaru na krawędzi – Jeśli obraz nie jest jeszcze w pamięci podręcznej, Worker pobiera oryginał z zewnętrznego hosta, uruchamia Image Resizing API i zapisuje wynik w pamięci podręcznej krawędziowej (edge cache).
  6. Rozgrzewanie cache (cache warming) – Po każdym skanowaniu lekki skrypt Python wysyła wyprzedzające żądania dla najnowszych miniatur. Dzięki temu pierwszy rzeczywisty użytkownik otrzymuje odpowiedź z pamięci podręcznej, zamiast czekać na operację zmiany rozmiaru.

Mierzalny wpływ po jednym miesiącu

  • Obciążenie CPU serwera źródłowego dla obrazów – Spadło do zera; backend nigdy więcej nie przetwarza bajtów obrazów.
  • Szybkość serwowania HTML – Wyraźnie się poprawiła, ponieważ serwer nie blokuje się już na operacjach związanych z obrazami.
  • Wskaźnik trafień w cache na krawędzi (edge cache hit rate) – Osiągnął 96%, co oznacza, że prawie każde żądanie zostało obsłużone z krawędzi bez konieczności pobierania danych z backendu.
  • Opóźnienia (latency) – Spadły, ponieważ obrazy są teraz serwowane z centrum danych blisko użytkownika, a nie z centralnego serwera źródłowego.
  • Przewidywalność pasma – Dzięki buforowaniu na krawędzi ruch wychodzący z serwera źródłowego jest stabilny i łatwy do prognozowania.

Podsumowanie

Przeniesienie generowania miniatur do Cloudflare Workers przekształciło wąskie gardło ograniczone wydajnością procesora w niemal bezkosztową pamięć podręczną na krawędzi sieci. Serwer źródłowy generuje teraz jedynie podpisane adresy URL, podczas gdy krawędź zajmuje się pobieraniem, zmianą rozmiaru, negocjacją formatów i serwowaniem wyników z cache. Dla każdego serwisu silnie polegającego na obrazach – zwłaszcza platform wideo wyświetlających dziesiątki miniatur na stronie – podejście „edge-first” zapewnia szybsze ładowanie stron, przewidywalne koszty i czystszy podział między „tym, co pokazać” (origin), a „sposobem dostarczenia” (edge).