Czy dobrym pomysłem jest połączenie wielu żądań HTTP w celu zaoszczędzenia przepustowości?

16

Przygotowuję jednostronicową aplikację, która czasami byłaby używana przy wolnym połączeniu mobilnym. Część z nich jest dość ciężka pod względem żądań API (pobieranie dziesięciu różnych zasobów na nowy ekran).

Czy warto połączyć te usługi z usługą, która zapewnia wszystkie wymagane dane, ale nie jest tak „czysta” pod względem zasad REST? Czy można oczekiwać znacznego wzrostu wydajności?

Lukáš Lánský
źródło
3
„Dobry pomysł” to taki, który odpowiednio spełnia wymagania dotyczące wydajności i łatwości konserwacji oprogramowania.
Robert Harvey,
1
Korzyść z łączenia odpowiedzi może w rzeczywistości nie być aż tak znacząca, jednak po upewnieniu się, że użyjesz trybu utrzymywania aktywności i upewnisz się, że żądania, które mogą być ładowane równolegle, są ładowane bez wzajemnego blokowania się. Mierz, mierz, mierz. Nie zgaduj
Lie Ryan,
ZRÓB to, nie tylko oszczędza przepustowość, ale także pozwala na zmianę kolejności operacji we / wy, aby poprawić wydajność we / wy. Często będzie to szyjka butelki w systemie i znacznie poprawi przepustowość.
Poinformowano

Odpowiedzi:

18

Jedną z zalet REST jest możliwość buforowania żądań za pomocą tradycyjnych buforów HTTP (przy założeniu, że są to żądania buforowane).

Kiedy masz pojedyncze, większe, rzadziej używane i prawdopodobnie różne żądania ( a,b,c,dtym razem zamierzam pobrać elementy, a przedmioty a,b,d,enastępnym razem), zwiększysz prawdopodobieństwo, że żądanie będzie brakowało w pamięci podręcznej i wygasnie z pamięci podręcznej, która może być siedząc gdzieś między tobą a źródłem.

Biorąc pod uwagę wspomniane powyżej dwa zestawy żądań, drugie żądanie może mieć 75% trafień w pamięci podręcznej i może być znacznie szybsze pobieranie e, a nie wszystkich czterech rzeczy.

Pamiętaj, że może nie być to od razu widoczne dla osób, które go używają, ponieważ osoba, która wykona pierwszy zestaw żądań pominięcia pamięci podręcznej, nadal będzie miała tę pamięć.

Nie oznacza to, że byłoby to idealne rozwiązanie w przypadku mobilnego połączenia sieciowego, w którym istnieje mniejsze prawdopodobieństwo nielokalnych trafień w pamięci podręcznej. Ale w przypadku hot spotów lub innych sytuacji Wi-Fi trafienia w pamięć podręczną mogą być znacznie bardziej przydatne.

Wiele z nich zależy od tego, jak działa twoja aplikacja. Czy pyta o wszystkie te dane przy uruchomieniu? czy mówimy o ładowaniu strony, gdzie oczekiwania na czas reakcji są różne?

Idealnym rozwiązaniem byłoby przetestowanie tego, aby zobaczyć, jak aplikacja działa w różnych sytuacjach. Zastanów się nad sytuacją, w której urządzenie mobilne jest połączone z lokalną siecią Wi-Fi, którą możesz monitorować (to tylko pierwsze trafienie w Google) i symulować złe połączenie internetowe, aby zobaczyć, jak rzeczy faktycznie działają (lub nie) i który ma najlepszą wydajność.

Społeczność
źródło
1
+1 za wzmiankę o buforowaniu. Im więcej zasobów poprosisz w żądaniu, tym większa szansa na brak pamięci podręcznej, ale mniejszy narzut HTTP.
Brandon
8

Twoja intuicja jest nieco poprawna - z reguły preferowanie mniejszej liczby próśb; masywne interfejsy API są zwykle lepsze. Zwłaszcza w przypadku niejednolitej łączności, w której widać trochę pracy, a niektórym nie udaje się stworzyć koszmarnych scenariuszy awaryjnych, ponieważ nic nie może polegać na niczym.

Jest jedno duże zastrzeżenie - możesz stać się zbyt masywny, a twoje połączenia i odpowiedzi stają się rozdęte. Na przykład sensowne może być jedno duże wywołanie przy pierwszym wejściu na stronę, a następnie przesyłanie strumieniowe aktualizacji w mniejszych kęsach niż wymuszanie odświeżania dużej strony za każdym razem, gdy potrzebujesz danych.

Lub możesz to zrobić na dwa sposoby z dużym prawdopodobieństwem.

Wyatt Barnett
źródło
5

Sprawdź ten artykuł na blogu Dropbox Tech .

Tam szczegółowo opisują, dlaczego i jak wdrożyli dokładnie zaproponowane przez Ciebie rozwiązanie do pobierania miniatur wszystkich zdjęć. Trzeba powiedzieć, że mierzą wydajność, aby sprawdzić, czy jest to warte kłopotu i najwyraźniej tak jest.

Krótkie podsumowanie:

Witryna Dropbox musi załadować setki miniatur. Z powodu ograniczeń niektórych przeglądarek nie wszystkie miniatury są ładowane równolegle (żądania są w kolejce). Chcieli używać SPDY , ale nie mogli tego zrobić, ponieważ niektóre elementy ich systemu jeszcze nie obsługują. W końcu wykorzystali żądania wsadowe przez HTTP, które zwracają wiele miniatur na odpowiedź w formie skompresowanej. Ogólna poprawa czasu ładowania strony wyniosła 40% zgodnie z ich wynikami.

jmiserez
źródło
Ale mówią, że to tymczasowe rozwiązanie.
ymajoros
3

W skrócie: Twoje podejście jest nieco poprawne i może skorzystać z usługi pakowania.

Ta usługa połączy istniejące pojedyncze połączenia w jedną metodę po stronie usługi. Robi to, łącząc połączenia od klienta do strony usługi i wykorzystując wszystkie pojedyncze, atomowe i relaksujące połączenia, które prawdopodobnie już masz.

W ten sposób nadal będziesz mógł czerpać korzyści z REST jako możliwości buforowania żądań.

Jednak w punkcie końcowym wszystko sprowadza się do wydajności infrastruktury usług / serwerów i środowiska klienta, które powinno z niej korzystać.

Jusubow
źródło