Tworzymy portal, który odwiedzają miliony użytkowników. Do zapewnienia wysokiej wydajności potrzebujemy architektury opartej o nieblokujące połączenia sieciowe. W ostatnich latach powstało wiele frameworków webowych w języku Python wspomagających programowanie asynchroniczne. Który zatem wybrać? Tornado? Gevent? Pokażemy jak asynchroniczność działa na poziomie systemu operacyjnego, przedstawimy różne modele programowania, po czym przejdziemy do porównania najpopularniejszych frameworków webowych. Na koniec zaprezentujemy jak przy wykorzystaniu asynchroniczności w architekturze "Microservices" zrobić system dla milionów użytkowników.
Kamil Łagowski
IT Systems Architect w firmie DreamLab Onet.pl. Odpowiedzialny m.in. za tworzenie wysokowydajnych aplikacji w oparciu o język programowania Python oraz technologie NoSQL.
Marcin Wróbel
Z DreamLab Onet.pl związany od ponad 5 lat. Programuje głównie część aplikacyjną w Pythonie i bazy danych. Zajmuje się także rozwojem i utrzymaniem środowiska Python w firmie. Ostatnio przetwarza dane na Hadoopie na potrzeby systemów rekomendacyjnych oraz do celów analitycznych.
20. Kod synchroniczny
from urllib import request
def print_page_size(url='http://www.dreamlab.pl/'):
result = request.urlopen(url)
print('bytes=%s' % len(result.read()))
29. PyPy
The U.S. Army, https://www.flickr.com/photos/soldiersmediacenter/1902588273/ Licence at https://creativecommons.org/licenses/by/2.0/
30. CPython 2.7
Ian Armstrong, https://www.flickr.com/photos/ianz/14762094471/ Licence at https://creativecommons.org/licenses/by-sa/2.0/
31. CPython 3.x
David van der Mark, https://commons.wikimedia.org/wiki/File:Blue_Tesla_Model_S_Zoutelande_dunes_Holland.jpg Licence at https://creativecommons.org/licenses/by-sa/2.0/deed.en
Przedstawienie się
Dzisiaj chcieliśmy Wam powiedzieć kiedy ostatnio zrobiliśmy system dla 15 mln ludzi.
Przedstawimy Wam różne pomysły na asynchroniczna budowanie wydajnych systemów obsługujących miliony użytkowników.
Pokażemy na czym polega praca systemu, jakich narzędzi użyć, żeby móc wygodnie programować asynchronicznie.
Po czym przejdziemy do budowania architektury wysoko wydajnych i stabilnych systemów.
Z czym się nam kojarzy wysokowydajny system:
Nasza serwerownia
Duży koszt
Jeżeli nie skalowanie serwerami
to może zwiększenie wydajności samej aplikacji, ale jak to zrobić, zanim powiem jak to zrobić wyjaśnijmy sobie pojęcia.
Znaczenie słowa asynchronczność: arytmiczny, nie zbiegający się w czasie, niejednoczesny, niemiarowy, nieregularny, nierównoczesny,niewspółczesny
Synchroniczny: jednoczesny, koincydencyjny, paralelny, równoczesny, równoległy, symultaniczny, współrzędny,zsynchronizowany,
Ma przyszłość
Koszty na końcu
Ma przyszłość
Koszty na końcu
Ma przyszłość
Koszty na końcu
Ma przyszłość
Koszty na końcu
Asynchroniczność – pierwszy krok do tworzenia systemu dla milionów ludzi.
Co nam daje asynchroniczność?
Co przedstawia ten wykres
Skąd pochodzi
Tabela w bazie danych
Wiemy już na pewno, że asynchroniczność ma moc, że duża liczba zdarzeń wykonywana asynchronicznie ma większą wydajność niż zdarzenia synchroniczne.
Wiemy, że mechanik pracujący asynchronicznie jest w stanie wykonać większą liczbę zadań.
Czemu widzimy takie memy w internecie?
Często słyszymy, że programowanie asynchroniczne jest chaotyczne.
Często programowanie asynchroniczne postrzegane jest jako trudne, bałaganiarskie. Jak wcześniej
Mam nadzieję, że wytłumaczyłem na czym polega asynchroniczne praca mechanika jak i systemu operacyjengo.
Przedstawiłem same zalety asynchroniczności, ale w życiu zawsze jest trudniej. Programowanie asynchroniczne jest na pewno trudniejsze od tradycyjnego programowania.
Jednak są metody jak sobie życie uprościć i pomoże nam w tym kolega Marcin:
chcemy 100req/s gdy usługa zależna ma 0.1 – 1 s.
wiemy jak ma działać
- jak ma wyglądać kod?
najpierw sync
co robi, to co przeglądarka
synchronicznie, jak django
jaką ma wydajność/przepustowość?
gdzie jest blokowanie?
tornado
rozdzielamy funkcje na kawałki
do klienta HTTP callback
co wywoła callback? pętla zdarzeń
a co gdy wyjątek
jak wykonuje się callback?
mamy event loop, ioloop, pętle zdarzeń
funkcja done_callback niezależnie
a co gdy print_page_size długo oblicza?
jest jakaś alternatywa?
co termin znaczy
zatrzymanie i wznowienie w niektórych punktach
w literaturze już od 1963, ale na asemblerze
twisted (inlineDefer) od lipca 2011
asyncio(tulip) od grudnia 2012
w tornado od marca 2013
coroutine w tornado, podobne do asyncio
struktura jak kod synchroniczny
dodany dekorator
funkcję (coroutine) asynch zwraca future
trzeba użyć yield aby poczekać async na zakończenie
- właściwość generatorów do wznawiania wykorzystana
- wyjątki
- przerwanie tylko w miejscach wyznaczonych przez programistę
coroutine wstrzymane
yield może zwrócić wyjątek lub wynik
co jest lepsze?
- co Guido ma do powiedzenia?
jak jeszcze ktoś nie widział prezentacji o asyncio to warto
coroutine i callback jak python i perl, te same osiągnięcia
coś bardziej skomplikowanego
nie próbujcie przeczytać
wady i zalety
trochę wolniejsze, narzut CPU, rzędu kilka procent
coroutine czytelniejsze, zachowana struktura, prościej przy błędach
brak spagetti
ktoś nie przekonany, żeby nie używać callbacków, mam argument
Jacka, Stefan to teraz zaprogramuj, ale czego użyć?
musimy wybrać framework, wersja pythona też kluczowa
firma stanęła przed tym wyborem 2 lata temu,
potrzeby: HTTP
jak byście podeszli? przegląd
zacznijmy od pythona
dragster, szybki na prostej
w zakrętach gorzej, opony, serwis
jedziesz a czasem wybucha
jaka byłaby to implementacja?
CPU, IO, biblioteki bindingi C,
SegFault 600 conc, nie wiemy
sprawdzony, stabilny,
serwis, stacja paliw
rozwoj? async?
jest coś lepszego?
elektryczny Tesla
prostsza konstrukcja,
twórca mówi że to przyszłość,
wielu nawet się zgadza, ale mało korzysta
wyższy koszt wejścia, mniej kompatybilnych stacji ładowania
uporządkowanie języka i stdlib, stringi i byte,
rozwój wspiera async, yield from, return in generator
kompatybilność, już w 2013 ponad 50% lib wspierało
zasadnicza cześć
framework odpowiada za komunikację z sys
ioloop i styl programowania
solidny Pan Li, lata doświadczeń,
tylko nie mówimy w jego języku, mówi po kantońsku a my po mandaryńsku
takie wrażenie sprawiał twisted
solidny framework, dowolny protokół, raczej niższy poziom,
trudniej, choć podobne inlineCalbacks ~ coroutine
nie wspierał py3 w 2013
a może jest coś bardziej nowoczesnego?
dziecko Guida
od py3.3 jako asyncio, std 3.4
fajny, uproszczony model programowania
ale projekt dość młody, biblioteki
- a może inny framework w którym łatwo się programuje?
gevent załatwi sprawę szybko i sprawnie,
kod bez zmian
jak to robi?
niezbyt legalnie, monkey patching
2 lata temu wyciek pamięci RAM, niestabilny, bez py3
framework do long polingu
sprawdzony przez nas,
stabilny, profesjonalny, dowozi
Facebook przejął firmę która napisała
ciągły rozwój
wspiera coroutine i py3
- wady: lib połączeniowe
- co byście wybrali?
do HTTP wybraliśmy py3 i tornado
dlaczego
zalety coroutine, stabilność
zaleta/wada biblioteki, dla nas wystarczyło
rozwój
niedługo wyjdzie py3.5 z nowymi słowami kluczowymi
co mogę powiedzieć po 2 latach korzystania?
- sprawdza się
mamy aplikacje
nie ugrzęźlismy w starej technologii
liczba bibliotek do py3 znacznie się powiększyła,
zapewniliśmy sobie narzędzia do robienie 50-500req/s z procesu
a jak teraz zbudować coś więcej?
Kolejny krok do systemu dla milionów ludzi
Dobra architektura
Wiemy już jak działają asynchroniczne zapytania na poziomie systemu operacyjnego, wiemy jakich narzędzi użyć, żeby programować asynchronicznie.
Czyli asynchroniczne aplikacje są dużym krokiem ku systemowi dla wielu milionów użytkowników.
Żeby cały system dobrze działał potrzebna jest przemyślana architektura.
Jakiego typu architektury użyć?
Jeden komponent
Brak widocznych modułów
Problem z udoskonaleniem
Problem z wymianą
Łatwa rozbudowa
Możliwość szybkiej wymiany
Łatwa rozbudowa funkcjonalności
System powiadomień składa się z odrębnych produktów
- System podzielony na mikroserwisy
każdy produkt ma właściciela
każdy produkt może być dowolnie skalowany
System powiadomień składa się z odrębnych produktów
- System podzielony na mikroserwisy
każdy produkt ma właściciela
każdy produkt może być dowolnie skalowany
Jaki wpływ na produktywność systemu ma jego złożoność i
jak produktywność zmienia wraz ze złożonością przy Microserwisach i systemach Monolitycznych
Mamy wydajny system ale jak zwiększyć stabilność
Powiedzieliśmy już sobie że asynchroniczność na poziomie aplikacji zwiększa wydajność, że architektura mikroserwisów ułatwia nam systemu.
Pokazalismy też że asynchroniczność na poziomie architektury zapewnia nam stabilność działania systemu. Wiemy też jakich narzędzi użyć żeby łatwiej utrzymywać systemy złożone z wielu komponentów. My taką drogą poszliśmy co pozwala nam budować takie portale jak.