Przepraszam, jeśli to nowe pytanie ...
Słyszałem historie o tym, że Netflix i Twitter mogą powielać ruch internetowy pomiędzy dwiema oddzielnymi infrastrukturami: jedna to autorytatywna / zaufana, która wraca do użytkownika; a druga to „cień” lub testowa infrastruktura, która myśli, że wraca do użytkownika, ale tego nie robi. Chodzi o to, aby przetestować infrastrukturę pomocniczą przy rzeczywistym obciążeniu i czasie.
Jestem pewien, że jest na to słowo, ale „most” wydaje się być niewłaściwy, podobnie jak „powtórka”.
Czy ktoś może mi pomóc, jak nazywa się ta technika i / lub jakich narzędzi można użyć do tego?
Wydaje mi się, że powinienem dodać, że słyszałem o technikach, które skutecznie „odtwarzają logi”, ale naprawdę trudno jest uzyskać rzeczywiste prędkości / rozkłady.
I nie próbujemy weryfikować „poprawności” danych wyjściowych, ale tylko upewnij się, że nie widzimy błędów / stacktraces / etc w nowej infrastrukturze.
źródło
Odpowiedzi:
Osobiście nazwałbym to „testowaniem obciążenia poprzez odtwarzanie sesji”. Nie znam żadnego prostego terminu dla tego rodzaju techniki testowania.
Podstawową strategią, jaką widziałem przy tego rodzaju testach obciążenia, jest pobieranie plików dziennika z systemu produkcyjnego i odtwarzanie ich w systemie testowym.
Za pomocą narzędzi takich jak JMeter lub Apache Bench można odtwarzać żądania z plików dziennika. Jeśli chcesz odtworzyć bardzo złożone interakcje klient / serwer (z konkretnymi szczegółami czasowymi opartymi na oryginalnym strumieniu dziennika) w nadziei, że naprawdę sprawdzisz wnętrze swojej aplikacji (szukasz warunków wyścigu, błędów związanych z czasem itp.), Możesz przyjrzyj się pisaniu narzędzi testujących specyficznych dla aplikacji, które symulują klientów na dużą skalę.
Nie będziesz w stanie po prostu przechwycić dużej ilości surowego ruchu sieciowego i „odtworzyć” go za pomocą dowolnego protokołu opartego na TCP lub IP. Numery sekwencji TCP nie będą pasować do pierwotnie przechwyconego ruchu i nie zadziała. Przechwytywanie warstwy IP będzie problematyczne, ponieważ symulowani klienci będą musieli odpowiedzieć na adres IP przechwyconego nadawcy. Lepiej byłoby przechwytywać ruch bliżej warstwy 7 i używać go do odtwarzania sesji, ponieważ w przeciwnym razie chcesz też napisać symulator TCP. (Mógłbym sobie wyobrazić użycie czegoś takiego jak
tshark
wyeliminowanie danych warstwy 7 i czasu ze strumienia TCP i odtworzenie tego, na przykład.)Samo odtworzenie ruchu sieciowego symuluje obciążenie, ale niekoniecznie wychwytuje wady. Symulowany klient musiałby odbierać odpowiedzi z serwera testowego i analizować je pod kątem poprawności, jeśli chcesz przetestować obciążenie dowolnego testu, na który aplikacja reaguje poprawnie. Ponieważ twoja aplikacja będzie generować dynamiczne dane odpowiedzi, jest mało prawdopodobne, że symulowany klient może po prostu porównać odpowiedź serwera testowego z zarejestrowaną odpowiedzią z serwera produkcyjnego. Tutaj zaczniesz pisać uprząż testową specyficzną dla twojej aplikacji i jej wyników.
źródło
Korzystasz z usługi takiej jak BrowserMob, która symuluje wiele osób jednocześnie uzyskujących dostęp do Twojej witryny. Usługi te nie odtwarzają zarejestrowanego ruchu, ponieważ wtedy brakowało by strony klienta po rozmowie. Na przykład twoje serwery będą próbowały wysyłać pakiety do komputerów w Internecie, które nie oczekują ich otrzymania. Ale firmy te badają dzienniki (ogólnie na poziomie aplikacji, a nie na poziomie pakietu) i wykorzystują te informacje, aby dowiedzieć się, które strony klikają użytkownicy, jak często i w jakiej kolejności. Te dane służą do pisania skryptów / makr, które następnie BrowserMob powtarza.
Jak wspomniał inny użytkownik, ApacheBench nie jest obecnie tak często używany. Przydało się to 10 lat temu, gdy trzeba było dowiedzieć się, jak szybko można załadować statyczny dokument HTML lub JPEG przy dużym obciążeniu. Nie różni się niczym od grupy ludzi, którzy klikają przycisk Załaduj ponownie, Załaduj ponownie, Załaduj ponownie w swojej przeglądarce internetowej. Potrzebujesz czegoś mądrzejszego podczas testowania aplikacji internetowej o bardziej złożonym przepływie pracy.
źródło
Nie sądzę, że można to zrobić w warstwie sieciowej, chociaż można uzyskać specjalne jądro dla sprzętowego modułu równoważenia obciążenia do obsługi drugiego serwera. Zasadniczo ruch internetowy (TCP) wymaga potwierdzenia każdego wysłanego / odebranego pakietu. Więc jeśli użytkownik wyśle pakiet do twojej sieci, zostanie on zduplikowany zarówno do twojej sieci prod, jak i twojej sieci shadow. Serwery w każdej odpowiedzi sieciowej, a pakiet serwera prod jest przesyłany z powrotem do komputera, który odbiera potwierdzenie i wesoło kontynuuje rozmowę. Jeśli jednak upuścisz pakiet serwera w tle, nie zobaczy on potwierdzenia. Spróbuje więc wysłać go ponownie, a jednocześnie spowolni prędkość transmisji dla całej aktywności sieci (nazywa się to okienkowaniem). Będzie próbował ponownie wysłać, dopóki nie przekroczy limitu czasu, i sesja jest zburzona. Szczerze mówiąc, nie byłbyś nawet w stanie ukończyć uścisku dłoni, aby nawiązać połączenie.
Najbliżej tego można byłoby przekazać oryginalny pakiet synchronizacji na serwer w tle, a następnie ustawić domyślną bramę dla tych skrzynek jako jakąś nieistniejącą lokalizację. Wtedy za każdym razem, gdy użytkownik spróbuje nawiązać połączenie, uzyska prawdziwy serwer w Twojej sieci produkcyjnej, a przynajmniej wyślesz pakiet syn do sieci w tle. Cholera, teraz zastanawiam się, jak możesz sprawić, by to zadziałało :)
źródło
Mogłem zapytać o to @adrianco na spotkaniu Netflix.
Odpowiedzią było to, że napisali własne narzędzie, które jest w zasadzie ServletFilter (przepraszam, terminologia specyficzna dla języka Java), które odtwarza bieżące żądanie i wykonuje asynchroniczne wywołanie typu „odpal i zapomnij” na serwerze docelowym.
Korzyści to:
Wada:
źródło