TTFB rośnie z 200 ms do 2 s, gdy rośnie ruch
Serwis informacyjny renderuje każdą stronę na serwerze przy każdym żądaniu. Przy normalnym ruchu TTFB to 200 ms, ale gdy artykuł trafia na Facebooka, rośnie do 2 s, a CPU serwerów Node jest na 100%. Dodawanie maszyn pomaga tylko trochę.
Zanim rozwiniesz: powiedz na głos, jak byś to rozwiązał, i nazwij co najmniej jeden kompromis.
Moje rozwiązanie
Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.
Pokaż, czego szuka rekruter, i modelową odpowiedź
Co sprawdza rekruter
- Czy wiesz, że SSR jest operacją CPU i blokuje event loop
- Czy szukasz cache zamiast samego skalowania
- Czy umiesz zmierzyć, gdzie idzie czas renderowania
Odpowiedź seniora
renderToString jest synchroniczny i obciąża CPU, a Node ma jeden wątek na proces, więc przy dużej liczbie jednoczesnych renderów żądania stoją w kolejce. Najpierw mierzę: czas pobierania danych a czas renderowania (Server-Timing, profilowanie --cpu-prof, APM).
Artykuł jest taki sam dla wszystkich, więc nie powinien być renderowany przy każdym żądaniu. Cache na CDN z s-maxage i stale-while-revalidate albo ISR z revalidacją na żądanie z CMS-a po publikacji lub edycji. Wtedy serwer renderuje artykuł raz na kilka minut, a nie tysiące razy. Personalizację (zalogowany, licznik powiadomień) dociągam na kliencie albo w osobnym fragmencie, żeby nie psuła cache.
Do tego: streaming (renderToPipeableStream) skraca czas do pierwszego bajtu, cięższe części za Suspense, deduplikacja zapytań do API w obrębie żądania, a gdy skalujemy, to po liczbie żądań, nie tylko CPU. Cel: p95 TTFB poniżej 300 ms przy 10-krotnym ruchu, sprawdzony testem obciążeniowym.
Typowe wpadki
- Tylko dokładanie serwerów
- Cache całej strony z danymi zalogowanego użytkownika
- Brak pomiaru, czy czas idzie w render, czy w API
Dopytają o
- Jak unieważnisz cache po poprawce literówki w artykule?
- Kiedy SSG byłoby lepsze niż cache SSR?
- Jak wykryjesz komponent, który renderuje się najwolniej?