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