Architektura aplikacji wielowątkowych
-
Upload
consuela-arcelia -
Category
Documents
-
view
40 -
download
0
description
Transcript of Architektura aplikacji wielowątkowych
Architektura aplikacji wielowątkowych
Jakub Binkowski
Cel prezentacji Alternatywne podejście przy projektowaniu
aplikacji wielowątkowych Częste błędy
Przykładowe rozwiązanie – silnik giełdy
Jak działa giełda?
Sprzedający KupującyProdukty
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena Cena Ilość Osoba
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena
Jan 50 szt. 100,00 zł
Cena Ilość Osoba
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena
Jan 50 szt. 100,00 zł
Ewa 100 szt. 95,00 zł
Cena Ilość Osoba
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena
Jan 50 szt. 100,00 zł
Ewa 100 szt. 95,00 zł
Cena Ilość Osoba
110,00 zł 20 szt. Jerzy
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena
Jan 50 szt. 100,00 zł
Ewa 100 szt. 95,00 zł
Cena Ilość Osoba
100,00 zł 30 szt. Anna
110,00 zł 20 szt. Jerzy
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena
Jan 50 szt. 100,00 zł
Ewa 100 szt. 95,00 zł
Cena Ilość Osoba
100,00 zł 30 szt. Anna
110,00 zł 20 szt. Jerzy
TransakcjaAnna sprzedaje Janowi30 szt. w cenie 100,00
zł/szt.
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena
Jan 20 szt. 100,00 zł
Ewa 100 szt. 95,00 zł
Cena Ilość Osoba
110,00 zł 20 szt. Jerzy
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena
Jan 20 szt. 100,00 zł
Ewa 100 szt. 95,00 zł
Cena Ilość Osoba
90,00 zł 200 szt. Zenon
110,00 zł 20 szt. Jerzy
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena
Jan 20 szt. 100,00 zł
Ewa 100 szt. 95,00 zł
Cena Ilość Osoba
90,00 zł 200 szt. Zenon
110,00 zł 20 szt. Jerzy
TransakcjaZenon sprzedaje Janowi20 szt. w cenie 100,00
zł/szt.
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena
Ewa 100 szt. 95,00 zł
Cena Ilość Osoba
90,00 zł 180 szt. Zenon
110,00 zł 20 szt. Jerzy
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena
Ewa 100 szt. 95,00 zł
Cena Ilość Osoba
90,00 zł 180 szt. Zenon
110,00 zł 20 szt. Jerzy
TransakcjaZenon sprzedaje Ewie100 szt. w cenie 95,00
zł/szt.
Jak działa rynek?
Oferty zakupu Oferty sprzedaży
Osoba Ilość Cena Cena Ilość Osoba
90,00 zł 80 szt. Zenon
110,00 zł 20 szt. Jerzy
Architektura z lotu ptaka
Silnik rynkuOferty sprzedaży
Oferty zakupu
Transakcje
Aktualizacje ofert
Przetworzenie oferty1. Odebranie wiadomości2. Audyt (zapis na dysk)3. Deserializacja (byte[] object)4. Umieszczenie na rynku
Silnik rynkuOferty sprzedaży
Oferty zakupu
Przetworzenie transakcji1. Wygenerowanie przez rynek2. Serializacja (object byte[])3. Audyt (zapisanie na dysk)4. Wysłanie do strony kupującej i sprzedającej
Silnik rynku Transakcje
Przetworzenie aktualizacji oferty1. Wygenerowanie przez rynek2. Serializacja (object byte[])3. Audyt (zapisanie na dysk)4. Wysłanie do składającego ofertę
Silnik rynku
Aktualizacje ofert
Wymagania Niezawodność / bezbłędność
Wysoka testowalność rozwiązania
Pełny audyt Możliwość odtworzenia dowolnej sytuacji
Wysoka wydajność Optymalizacja kodu
Architektura „standardowa” Przychodząca wiadomość = 1 wątek Wątki brane z puli (ThreadPool)
Pula wątków w .NET: Zbiór wątków dostępnych dla aplikacji Minimalna ilość wątków = ilość procesorów
logicznych Maksymalna – zależy od środowiska
Obsługa wiadomości przychodzących
Wiadomościprzychodzące
Dedykowany wątek Pula wątków
Składanie oferty
Zdarzenia na rynku
Podsumowanie
Demo:Wielowątkowo vs jednowątkowo
W czym jest problem?
lock
SerializacjaAudyt
W czym jest problem?
lock
Tylko tutaj potrzebnyjest lock!
„lock leak”lock (sync){ //... _eventConsumer.ProcessOfferUpdated(/*...*/);
//...}
lock (sync){ //... var handler = OfferUpdated; if (handler != null) { handler(this, EventArgs.Empty); } //...}
Przekazanie kontroli dozewnętrznego kodu
„lock leak” - konsekwencje Utrata wydajności
Możliwe deadlocki
Możliwe zapchanie się puli wątków OutOfMemoryException
„lock leak” - jak uniknąć?bool offerUpdated = false;lock (sync){ //... offerUpdated = true; //...}if (offerUpdated) _eventConsumer.ProcessOfferUpdated(/*..*/);
Uwaga! Wywoływanie powiadomień za sekcją krytyczną może wpłynąć na logikę działania aplikacji.
Demo:Unikanie „lock leak”
Czy spełniliśmy wymagania? Niezawodność / bezbłędność
Wysoka testowalność rozwiązania Czy nasz kod można dobrze przetestować?
Pełny audyt Możliwość odtworzenia dowolnej sytuacji Czy wykonanie nie jest losowe?
Wysoka wydajność Optymalizacja kodu Czy nie da się szybciej?
Co zrobić, aby spełnić te wymagania?
Architektura oparta o kolejki
Wysokowydajne kolejki wielowątkowe
Architektura oparta o kolejki
Wątki wykonujące kolejne operacje
Architektura oparta o kolejki
Wiadomości przychodzące Audyt Deserializacja
Przetwarzanieprzez rynek
SerializacjaAudytWiadomości wychodzące
Jak to zrealizować (w .NET 4)? ConcurrentQueue<T>
wielowątkowo bezpieczna kolejka wysoko zoptymalizowana
BlockingCollection<T> opakowanie na kolekcje wspiera scenariusz producent-konsument pozwala na blokowanie odczytu (kolekcja pusta) pozwala na blokowanie zapisu (kolekcja pełna)
BlockingCollection<T> - przykład Deklaracja:
var queue = new BlockingCollection<int>(100);
Maksymalna pojemnośćkolekcji
BlockingCollection<T> - przykład Producent:
queue.Add(1);queue.Add(2);queue.Add(3);
queue.CompleteAdding();
Wstawianieelementów
Zakończeniedodawania
BlockingCollection<T> - przykład Konsument:
var consumer = queue.GetConsumingEnumerable();foreach (var number in consumer){ Console.WriteLine(number);}
Enumeracjajak przy zwykłej kolekcji
Oczekiwaniena elementy(przy pustej kolekcji)
Demo:Czy kolejki się sprawdzą?
Architektura oparta o kolejkiZalety Eliminacja wielowątkowości
Wiele wątków, ale kolejki zajmują się synchronizacją
Kod łatwy do testowania
Przewidywalność zachowania Powtórzenie danych wejściowych zawsze da taki
sam rezultat
Wyższa wydajność Mniej wątków = mniejsza konieczność
synchronizacji Możliwość grupowego przetwarzania
Architektura oparta o kolejkiZalety Bardziej przejrzysty design
Jasno określone wątki aplikacji Dobrze zdefiniowane punkty interakcji pomiędzy
wątkami (kolejki)
Pełny wgląd w aktualny stan aplikacji Ilość elementów w kolejce Łatwa lokalizacja wąskich gardeł
Architektura oparta o kolejkiWady Trudniejsze debugowanie
Bardziej pracochłonna
Wymaga dokumentacji
Gdzie taka architektura się sprawdzi?Aplikacje: przetwarzające niewiele rodzajów zdarzeń o relatywnie prostej logice mocno obciążone (wymagana wysoka
wydajność)
Na przykład: systemy giełdowe systemy agregujące/przetwarzające dane aplikacje dostarczające dane „na żywo”
Podsumowanie Klasyczne podejście „operacja = wątek” nie
zawsze najwydajniejsze
Uwaga na wywołania zewnętrzne wewnątrz lock!
Kolejki mogą rozwiązać problem synchronizacji pomiędzy wątkami
Dziękuję za uwagę. Pytania?