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. Następnie wydawana jest jej wersja produkcyjna i aplikacja rozpoczyna obsługiwać rzeczywiste obciążenia. W tym momencie zaczyna działać źle — odrzucanie żądań użytkowników, zatrzymanie lub zgłaszanie wyjątków. Zespół deweloperów może zadać sobie wtedy dwa pytania:
- Dlaczego to zachowanie nie zostało ujawnione podczas testowania?
- Jak możemy to naprawić?
Odpowiedź na pierwsze pytanie jest prosta. W środowisku testowym trudno zasymulować działania rzeczywistych użytkowników, wzorce ich zachowań i woluminy pracy, którą mogą oni wykonywać. Jedynym pewnym sposobem na zrozumienie, w jaki sposób system zachowuje się pod obciążeniem, jej obserwowanie go w środowisku produkcyjnym. Oczywiście nie sugerujemy, że należy pominąć testowanie wydajności. Testowanie wydajności ma kluczowe znaczenie dla uzyskiwania podstawowych metryk wydajności. Należy jednak być przygotowanym do obserwowania i rozwiązywania problemów, gdy wystąpią one w systemie produkcyjnym.
Odpowiedź na drugie pytanie — jak rozwiązać problem — nie jest już taka prosta. Może mieć na to wpływ dowolna liczba czynników, a czasami problem występuje tylko w pewnych okolicznościach. Instrumentacja i rejestrowanie są kluczowe do znalezienia głównej przyczyny, ale należy również wiedzieć, gdzie jej szukać.
W oparciu o nasze interakcje z klientami platformy Microsoft Azure określiliśmy pewne najbardziej typowe problemy z wydajnością spotykane przez klientów w środowisku produkcyjnym. Dla każdego antywzorca opisano powód jego występowania, jego symptomy i sposoby 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ł w środowisku lokalnym, ale nie skaluje się do chmury. Możliwe jest również, że projekt aplikacji był na początku bardzo przejrzysty, ale po dodaniu nowych funkcji wystąpiły niektóre z wymienionych antywzorców. Bez względu na wszystko ten przewodnik pomoże Ci zidentyfikować te antywzorce i rozwiązać związane z nimi problemy.
Wykaz antywzorców
Oto lista antywzorców, które zidentyfikowaliśmy:
Antywzorzec | opis |
---|---|
Obciążona baza danych | Przeniesienie zbyt dużej ilości operacji przetwarzania do magazynu danych. |
Obciążony fronton | Przeniesienie zadań używających dużej ilości zasobów do wątków w tle. |
Duża liczba operacji we/wy | Stałe wysyłanie wielu małych żądań sieciowych. |
Nadmiarowe pobieranie | Pobieranie większej ilości danych niż jest to potrzebne, co powoduje występowanie niepotrzebnych operacji we/wy. |
Niewłaściwy sposób tworzenia wystąpień | Wielokrotnie tworzenie i niszczenie obiektów, które zostały zaprojektowane do współużytkowania i ponownego wykorzystywania. |
Monolityczna trwałość | Używanie tego samego magazynu danych na potrzeby danych z zupełnie różnymi wzorcami użycia. |
Brak buforowania | Brak buforowania danych. |
Hałaśliwy sąsiad | Jedna dzierżawa używa nieproporcjonalnej ilości zasobów. |
Ponów próbę burzy | Ponawianie nieudanych żądań do serwera zbyt często. |
Synchroniczne operacje we/wy | Blokowanie wątku wywołującego do momentu wykonania operacji we/wy. |
Następne kroki
Aby dowiedzieć się więcej o dostosowywaniu wydajności, zobacz Dostosowywanie wydajności aplikacji rozproszonej