Oferta Realizacje Stała opieka CRM i AI Blog O mnie Kontakt
Zadzwoń: 501 178 850 Napisz wiadomość

Cloudflare wdraża Origin Range Requests dla wszystkich planów

Cloudflare udostępnił funkcję Origin Range Requests dla wszystkich planów usługowych. Nowy mechanizm eliminuje potrzebę ręcznej konfiguracji rozmiarów zakresów w pamięci podręcznej i automatycznie dzieli pliki na stałe bloki w architekturze Pingora. Warunkiem poprawnego działania jest obsługa zapytań o zakresy bajtów po stronie serwera źródłowego.

Cloudflare wdraża Origin Range Requests dla wszystkich planów

Przejście z architektonicznych ograniczeń nginx na serwer Pingora

Pobieranie obszernych plików w sieci internetowej opiera się na żądaniach zakreślających wyłącznie fragment całkowitej objętości danych. Odtwarzacze wideo proszą o bajty w otoczeniu wybranego momentu filmu, menedżery pobierania wznawiają przerwane połączenia, a narzędzia do obsługi pakietów lub wag modeli sztucznej inteligencji pobierają niezbędne nagłówki i sekcje. Odpowiedzi na takie zapytania wykorzystują nagłówek Range, na który serwer źródłowy odpowiada kodem 206 Partial Content oraz nagłówkiem Content-Range określającym zwracany odcinek.

Wcześniejsza architektura pamięci podręcznej Cloudflare była oparta na oprogramowaniu nginx i technice dzielenia zasobów na stałe przedziały. Konfiguracja wymuszała ręczne przypisywanie wielkości zakresu do konkretnych rozszerzeń plików w danej strefie. Tworzyło to kompromis architektoniczny. Niewielkie rozmiary bloków prowadziły do powstawania dużej liczby pojedynczych zapytań do serwera źródłowego oraz obciążały pamięć operacyjną węzłów brzegowych, które musiały łączyć spływające fragmenty. Z kolei ustawienie obszernych zakresów powodowało pobieranie wielokrotnie większej ilości danych niż ta, której faktycznie żądał klient.

Zmiana wyznaczonego rozmiaru zakresu unieważniała wpisy w pamięci podręcznej, ponieważ parametr ten stanowił element klucza buforowania. Zapytania współbieżne trafiające w ten sam przedział blokowały się wzajemnie, niezależnie od odległości między wybranymi bajtami. System oparty na nginx nie potrafił także łączyć buforowania zakresów z jednoczesnym strumieniowaniem do wielu odbiorców. Aby dostarczyć plik, cała porcja danych musiał zostać najpierw w pełni pobrana na dysk lokalny. Przejście Cloudflare na własny serwer pamięci podręcznej Pingora pozwoliło wyeliminować ręczne parametryzowanie wielkości przedziałów przez użytkowników.

Koordynacja pętli pobierania i obsługa nagłówków HTTP

Nowe rozwiązanie Origin Range Requests wykorzystuje fakt, że serwer Pingora zapisuje pobrane pliki na dysku w postaci stałych bloków. Umieszczanie danych w stałych strukturach dyskowych sprawia, że rozmiar buforowanego bloku staje się naturalną jednostką podziału. W momencie odebrania zapytania o zakres brzegowy węzeł Cloudflare weryfikuje, które bajty znajdują się już w lokalnej pamięci podręcznej. Brakujące odcinki są pobierane z serwera źródłowego w wyrównanych granicach bloków, zapisywane na dysku i zwracane klientowi wyłącznie w zakresie, o który prosił.

Procesem dostarczania danych zarządza wewnętrzny koordynator. Po odebraniu żądania wykonuje następujące kroki:

  • Sprawdza nagłówki zasobu oraz metadane dotyczące zapisanych na dysku zakresów.
  • Odczytuje dostępne fragmenty pliku z dysku lub z trwającego strumienia w pamięci operacyjnej.
  • Wysyła żądanie do serwera źródłowego o brakujące bajty wyrównane do granic stałych bloków.
  • Zapisuje nowe bajty na dysku i aktualizuje metadane ukończonych zakresów.
  • Skompletowane fragmenty łączy w jedną odpowiedź z nagłówkami Content-Range oraz Content-Length.

Jedno żądanie klienta może jednocześnie korzystać z buforowanego fragmentu początkowego, trwającego pobierania uruchomionego przez inny proces oraz nowo zainicjowanego zapytania do serwera źródłowego. Jeśli dla danego pliku trwa już pobieranie pokrywające żądane bajty, kolejne zapytanie podłącza się do istniejącego strumienia, redukując obciążenie sieci w momentach gwałtownego wzrostu ruchu.

Poprawność scalania bajtów wymaga weryfikacji spójności wersji pliku. Koordynator sprawdza spójność znacznika ETag oraz całkowitego rozmiaru zasobu. W przypadku użycia nagłówka If-Range, gdy wersja pliku po stronie źródła nie zgadza się ze stanem w pamięci podręcznej, Cloudflare zwraca całą reprezentację obiektu zamiast łączyć niezgodne fragmenty. Buforowanie zakresów jest również pomijane, gdy serwer brzegowy musi dekompresować odpowiedź, ponieważ zakres skompresowanych bajtów różni się od zakresu w tekstowej wersji pliku. Jeżeli zapytanie jest poprawne, klient otrzymuje status 206 Partial Content, a w przypadku błędnych zakreśleń kod 416 Range Not Satisfiable.

Wyniki wydajnościowe na przykładzie usługi Cloudflare R2

Przed publicznym udostępnieniem funkcji Origin Range Requests Cloudflare przeniósł na nową architekturę własne usługi, w tym magazyn obiektowy R2. W dotychczasowym systemie dla R2 skonfigurowany był stały rozmiar zakresu wynoszący 64 MiB. Odczyt niewielkiego fragmentu pliku przeskakującego przez granicę bloków generował transfer na poziomie 128 MiB pomiędzy centrami danych, nawet po rozłączeniu się użytkownika.

Po wdrożeniu nowego mechanizmu koordynacji w usłudze R2 odnotowano następujące rezultaty:

  • Skrócenie czasu do odebrania pierwszego bajtu (TTFB) na poziomie p99 o około 50 procent, zarówno dla trafień w pamięć podręczną, jak i dla zapytań sięgających do serwera źródłowego.
  • Spadek ruchu w wielopoziomowej pamięci podręcznej (tiered cache) o około 6 procent tydzień do tygodnia dla R2 i podobnych obciążeń.
  • Zmniejszenie wolumenu przesyłanych danych między centrami danych o petabajty dziennie.

Wdrożenie funkcji Origin Range Requests w regułach buforowania

Usługa Origin Range Requests została udostępniona dla wszystkich planów w panelu Cloudflare. Konfiguracja nie wymaga ustawiania rozmiarów przedziałów ani kontaktu z pomocą techniczną. Włączenie mechanizmu odbywa się poprzez utworzenie reguły w sekcji Caching > Cache Rules lub za pośrednictwem API z wykorzystaniem parametru origin_range_requests ustawionego na wartość on.

Funkcja jest przeznaczona dla ruchu, w którym klienci naturalnie odwołują się do fragmentów dużych obiektów:

  • Strumieniowe odtwarzanie plików wideo w formacie MP4 z możliwością przewijania.
  • Wznawiane pobieranie obszernych archiwów, obrazów dysków i pakietów oprogramowania.
  • Przesyłanie wag oraz artefaktów modeli używanych w zadaniach sztucznej inteligencji.

Włączenie funkcji nie zmienia ogólnych zasad kwalifikacji zasobów do pamięci podręcznej. Aby mechanizm działał poprawnie, serwer źródłowy musi obsługiwać zapytania o zakresy bajtów.

Opracowanie na podstawie: Cloudflare Blog

Powiązane wpisy

Chcesz, żebym się tym zajął?

Jeśli wolisz nie grzebać w tym samodzielnie, chętnie pomogę. Robię to od 14 lat.

Zobacz, jak mogę pomóc →
Zadzwoń Napisz Awaria / WP