Udostępnij przez


Testowanie wydajnościowe i antywzorzec dla aplikacji w chmurze

Antywzorce wydajności, podobnie jak wzorce projektowe, są typowymi wadliwymi procesami i implementacjami w organizacjach. Są to typowe rozwiązania, które mogą powodować problemy ze skalowalnością, gdy aplikacja jest pod presją. Świadomość tych praktyk może pomóc uprościć komunikację pojęć wysokiego poziomu wśród praktyków oprogramowania, a wiedza na temat antywzorzec może być przydatna podczas przeglądania kodu lub diagnozowania problemów z wydajnością.

Oto typowy scenariusz: aplikacja działa dobrze podczas testowania wydajnościowego. Jest on udostępniany w środowisku produkcyjnym i zaczyna obsługiwać rzeczywiste obciążenia. W tym momencie zaczyna działać źle — odrzuca żądania użytkowników, zawiesza się lub zgłasza wyjątki. Następnie zespół programistyczny ma do czynienia z dwoma pytaniami:

  • Dlaczego to zachowanie nie zostało wyświetlone podczas testowania?
  • Jak możemy to naprawić?

Odpowiedź na pierwsze pytanie jest prosta. Symulowanie rzeczywistych użytkowników w środowisku testowym wraz ze wzorcami zachowania i ilościami pracy, którą mogą wykonać, jest trudne. Jedynym całkowicie pewnym sposobem zrozumienia, jak system zachowuje się pod obciążeniem, jest obserwowanie go w środowisku produkcyjnym. Aby było jasne, nie sugerujemy, aby pominąć testowanie wydajnościowe. Testowanie wydajności ma kluczowe znaczenie dla uzyskiwania podstawowych metryk wydajności. Należy jednak przygotować się do obserwowania i poprawiania problemów z wydajnością w przypadku wystąpienia ich w systemie na żywo.

Odpowiedź na drugie pytanie, jak rozwiązać ten problem, jest mniej prosta. Każda liczba czynników może przyczynić się, a czasami problem tylko manifestuje się w pewnych okolicznościach. Instrumentacja i rejestrowanie są kluczem do znalezienia głównej przyczyny, ale musisz również wiedzieć, czego szukać.

W oparciu o nasze zaangażowanie z klientami platformy Microsoft Azure zidentyfikowaliśmy niektóre z najczęstszych problemów z wydajnością, które klienci widzą w środowisku produkcyjnym. Dla każdego antywzorca opisujemy, dlaczego zwykle występuje, jakie są jego objawy, oraz techniki rozwiązywania problemu. Udostępniamy również przykładowy kod ilustrujący zarówno antywzorzec, jak i sugerowane rozwiązanie skalowalności.

Niektóre z tych antywzorców mogą wydawać się oczywiste podczas czytania opisów, ale występują częściej niż można myśleć. Czasami aplikacja dziedziczy projekt, który działał lokalnie, ale nie jest skalowany w chmurze. Lub aplikacja może zaczynać się od bardzo czystego projektu, ale w miarę dodawania nowych funkcji co najmniej jeden z tych antywzorców wkradnie się. Niezależnie od tego, ten przewodnik pomoże Ci zidentyfikować i naprawić te antywzorce.

Wykaz antywzorzeców

Oto lista antywzorców, które zidentyfikowaliśmy:

Antywzorzec Opis
Zajęta baza danych Odciążanie zbyt dużej ilości przetwarzania do repozytorium danych.
zajęty frontend Przenoszenie zadań intensywnie korzystających z zasobów na wątki w tle.
Gadatliwe I/O Stale wysyła wiele małych żądań sieciowych.
Nadmiarowe pobieranie Pobieranie większej ilości danych niż jest potrzebne, co powoduje niepotrzebne we/wy.
Niewłaściwa instancjacja Wielokrotne tworzenie i niszczenie obiektów, które mają być współużytkowane i używane ponownie.
Trwałość monolityczna Używanie tego samego magazynu danych dla danych z bardzo różnymi wzorcami użycia.
brak cache'owania Nie udaje się buforować danych.
hałaśliwy sąsiad Jeden najemca korzysta z nieproporcjonalnej ilości zasobów.
Burza ponownych prób Ponawianie nieudanych żądań do serwera zbyt często.
Synchroniczne I/O Blokowanie wątku wywołującego po zakończeniu operacji we/wy.

Następne kroki

Więcej informacji o dostrajaniu wydajności można znaleźć w sekcji Skuteczność wydajności w ramach Well Architected Framework