{"id":2484,"date":"2026-07-07T10:00:31","date_gmt":"2026-07-07T10:00:31","guid":{"rendered":"https:\/\/news.jurskitech.pl\/blog\/uncategorized\/powolne-api-dlaczego-tracisz-klientow-nawet-nie-wiedzac-o-tym\/"},"modified":"2026-07-07T10:00:31","modified_gmt":"2026-07-07T10:00:31","slug":"powolne-api-dlaczego-tracisz-klientow-nawet-nie-wiedzac-o-tym","status":"publish","type":"post","link":"https:\/\/news.jurskitech.pl\/blog\/warto-wiedziec\/powolne-api-dlaczego-tracisz-klientow-nawet-nie-wiedzac-o-tym\/","title":{"rendered":"Powolne API: dlaczego tracisz klient\u00f3w nawet nie wiedz\u0105c o tym"},"content":{"rendered":"<h3 id=\"powolneapidlaczegotraciszklientwnawetniewiedzcotym\">Powolne API: dlaczego tracisz klient\u00f3w nawet nie wiedz\u0105c o tym<\/h3>\n<p>Znasz to uczucie? Strona dzia\u0142a b\u0142yskawicznie, ale u\u017cytkownicy i tak odchodz\u0105. Dzwonisz do programist\u00f3w, a oni m\u00f3wi\u0105: &#8222;frontend jest szybki, backend te\u017c&#8221;. Tylko \u017ce klienci m\u00f3wi\u0105 co innego. Cz\u0119sto problem le\u017cy nie w szybko\u015bci renderowania, ale w op\u00f3\u017anieniach na poziomie API. Dzi\u015b poka\u017c\u0119 Ci, jak ciche spowolnienia backendu niszcz\u0105 konwersj\u0119 i co z tym zrobi\u0107.<\/p>\n<h2 id=\"1sekwencyjnezapytaniatamgdziepowinnybyrwnolege\">1. Sekwencyjne zapytania tam, gdzie powinny by\u0107 r\u00f3wnoleg\u0142e<\/h2>\n<p>Zdarzy\u0142o mi si\u0119 audytowa\u0107 aplikacj\u0119 e-commerce, kt\u00f3ra \u0142adowa\u0142a stron\u0119 produktu w 3 sekundy. Frontend by\u0142 skompilowany, obrazy skompresowane, ale co\u015b nie gra\u0142o. Okaza\u0142o si\u0119, \u017ce backend wysy\u0142a\u0142 zapytania do API po kolei: najpierw o produkt, potem o cen\u0119, potem o stan magazynowy \u2013 ka\u017cde czeka\u0142o na poprzednie. Zmiana na zapytania r\u00f3wnoleg\u0142e skr\u00f3ci\u0142a czas \u0142adowania do 1,2 sekundy. Konwersja wzros\u0142a o 18%.<\/p>\n<p><strong>Jak to naprawi\u0107?<\/strong><\/p>\n<ul>\n<li>Na froncie u\u017cywaj <code>Promise.all<\/code> lub podobnych mechanizm\u00f3w do niezale\u017cnych wywo\u0142a\u0144.<\/li>\n<li>Po stronie backendu rozwa\u017c agreguj\u0105ce endpointy (GraphQL lub dedykowane endpointy kompozytowe).<\/li>\n<li>Mierz czasy ka\u017cdego wywo\u0142ania osobno \u2013 cz\u0119sto jedno wolne zapytanie blokuje reszt\u0119.<\/li>\n<\/ul>\n<h2 id=\"2zbytduepayloadywysyaszcabazzamiasttegocopotrzebne\">2. Zbyt du\u017ce payloady \u2013 wysy\u0142asz ca\u0142\u0105 baz\u0119 zamiast tego, co potrzebne<\/h2>\n<p>Klient z bran\u017cy SaaS narzeka\u0142 na d\u0142ugie \u0142adowanie listy zam\u00f3wie\u0144. W odpowiedzi z API lecia\u0142o 50 p\u00f3l na zam\u00f3wienie, podczas gdy interfejs potrzebowa\u0142 tylko 5. Payload wa\u017cy\u0142 2 MB \u2013 dla 100 zam\u00f3wie\u0144 na stronie to 200 MB transferu. Po optymalizacji do 10 p\u00f3l, czas odpowiedzi spad\u0142 z 1,5 s do 200 ms.<\/p>\n<p><strong>Jak to naprawi\u0107?<\/strong><\/p>\n<ul>\n<li>Wprowad\u017a paginacj\u0119 z limitem p\u00f3l (np. <code>fields=id,nazwa,data<\/code>).<\/li>\n<li>U\u017cywaj GraphQL lub dedykowanych endpoint\u00f3w do konkretnych widok\u00f3w.<\/li>\n<li>Kompresuj odpowiedzi (gzip, brotli).<\/li>\n<li>Streamuj du\u017ce zbiory danych zamiast wysy\u0142a\u0107 je w jednym kawa\u0142ku.<\/li>\n<\/ul>\n<h2 id=\"3brakcacheowaniakadedaniegenerujenowezapytaniedobazy\">3. Brak cache\u2019owania \u2013 ka\u017cde \u017c\u0105danie generuje nowe zapytanie do bazy<\/h2>\n<p>Widzia\u0142em sklep, gdzie API za ka\u017cdym razem liczy\u0142o dost\u0119pno\u015b\u0107 produktu z bazy danych. Przy 10 000 odwiedzin dziennie to 10 000 zapyta\u0144 SQL, z kt\u00f3rych 90% zwraca\u0142o ten sam wynik. Wdro\u017cenie cache Redis na poziomie API skr\u00f3ci\u0142o \u015bredni czas odpowiedzi z 800 ms do 50 ms.<\/p>\n<p><strong>Jak to naprawi\u0107?<\/strong><\/p>\n<ul>\n<li>Cache\u2019uj odpowiedzi na poziomie CDN i serwera.<\/li>\n<li>Ustaw odpowiednie nag\u0142\u00f3wki <code>Cache-Control<\/code> i <code>ETag<\/code>.<\/li>\n<li>Dla danych dynamicznych u\u017cywaj inwalidacji cache przy zmianach.<\/li>\n<li>W przypadku skomplikowanych oblicze\u0144 rozwa\u017c wst\u0119pne generowanie wynik\u00f3w.<\/li>\n<\/ul>\n<h3 id=\"podsumowanie\">Podsumowanie<\/h3>\n<p>Powolne API to zab\u00f3jca konwersji, ale cz\u0119sto pozostaje niezauwa\u017cone, bo skupiamy si\u0119 na szybko\u015bci frontendu. Warto regularnie mierzy\u0107 czasy odpowiedzi API, audytowa\u0107 payloady i wdra\u017ca\u0107 cache. Pami\u0119taj: ka\u017cda milisekunda ma znaczenie dla Twojego biznesu.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Powolne API: dlaczego tracisz klient\u00f3w nawet nie wiedz\u0105c o tym Znasz to uczucie? Strona dzia\u0142a b\u0142yskawicznie, ale u\u017cytkownicy i tak odchodz\u0105. Dzwonisz do programist\u00f3w, a oni m\u00f3wi\u0105: &#8222;frontend jest szybki, backend te\u017c&#8221;. Tylko \u017ce klienci m\u00f3wi\u0105 co innego. Cz\u0119sto problem le\u017cy nie w szybko\u015bci renderowania, ale w op\u00f3\u017anieniach na poziomie API. Dzi\u015b poka\u017c\u0119 Ci, jak<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[776,826,699,431],"class_list":["post-2484","post","type-post","status-publish","format-standard","hentry","category-warto-wiedziec","tag-ai-e-commerce","tag-ai-w-ux","tag-api-gateway","tag-optymalizacja-wydajnosci"],"_links":{"self":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/posts\/2484","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/comments?post=2484"}],"version-history":[{"count":0,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/posts\/2484\/revisions"}],"wp:attachment":[{"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/media?parent=2484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/categories?post=2484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/news.jurskitech.pl\/blog\/wp-json\/wp\/v2\/tags?post=2484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}