Architektura aplikacji wielowątkowych

Post on 02-Jan-2016

40 views 0 download

description

Architektura aplikacji wielowątkowych. Jakub Binkowski. Jakub Binkowski. 2008-2011. Lead .NET Developer. jakub@binkowski.com.pl. 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?. - PowerPoint PPT Presentation

Transcript of Architektura aplikacji wielowątkowych

Architektura aplikacji wielowątkowych

Jakub Binkowski

Jakub Binkowski

Lead .NET Developer 2008-2011

jakub@binkowski.com.pl

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?