You are on page 1of 11

#4: Architektura serwera

Mikoaj Olszewski

Jakie pytania po lekturze?

Dotychczasowy styl
Aplikacja w terminalu (konsola/screen) Komunikaty na standardowym wyjciu Jeden proces, jeden wtek Obsuga pojedynczego klienta

rodowisko uruchomieniowe
Logowanie
In [1]: import logging logging.basicConfig(filename='example.log',level=logging.DEBUG) log = logging.getLogger(__name__) log.error('the system is down') ERROR:__main__:the system is down

Poziomy logowania
DEBUG INFO WARNING ERROR CRITICAL

Demonizacja
Demon proces dziaajcy w tle, niezaleny od terminala i uytkownika pena lista funkcjonalnoci Biblioteka python-daemon $$ pip install python-daemon

Prosty przykad

import daemon with daemon.DaemonContext(): do_main_program()

Peny przykad
rda $$ python demon.py start|stop|restart

Obsuga klientw
Przykadowy problem
Klient: pytanie ( ?) Serwer: odpowied ( . lub !) Katechizm polskiego dziecka Cz wsplna

Klient
1. Poczenie z serwerem 2. Wysanie pytania 3. Oczekiwanie na pen odpowied 4. Wypisanie odpowiedzi 5. Zamknicie poczenia rda

Prosty serwer
1. Akceptacja poczenia 2. Oczekiwanie na zakoczenie pytania 3. Znalezienie odpowiedzi 4. Wysanie odpowiedzi 5. Po zakoczeniu danego poczenia obsuenie nowego rda

Porwnanie

ledzenie
my_trace.py $python my_trace.py handle_client simple_server.py $ python my_trace.py client client.py host

localhost
34.229911 34.229963 34.230056 34.230059 34.230062 34.230092 34.230201 34.230243 34.230246 34.230381 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((hostname, port)) answers = [] for row in katechizm.qa: sock.sendall(row[0]) answer = katechizm.recv_until(sock, ['.', '!']) question = katechizm.recv_until(client_sock, ['?']) answer = katechizm.qadict[question] client_sock.sendall(answer) answers.append(answer)

tunel
ssh -N -R 4445:localhost:4444 ja@zdalny ssh -N -L 4445:localhost:4445 ja@zdalny 21.760634 21.760674 21.761172 21.761175 21.761178 21.761205 21.762027 21.762964 21.762967 21.763361 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((hostname, port)) answers = [] for row in katechizm.qa: sock.sendall(row[0]) answer = katechizm.recv_until(sock, ['.', '!']) question = katechizm.recv_until(client_sock, ['?']) answer = katechizm.qadict[question] client_sock.sendall(answer) answers.append(answer)

Benchmark
(venv)$ pip install funkload Test (venv)$ fl-run-bench tests.py TestKatechizm.test_dialog Konfiguracja benchmarku (venv)$$ KATECHIZM_SERVER=host fl-run-bench tests.py TestKatechizm.test_dialog (venv)$$ fl-build-report --html -o output bench.xml

Prosty serwer wyniki

Sewer zorientowany zdarzeniowo


1. Akceptacja poczenia 2. Nasuchiwanie informacji od wszystkich przyaczonych klientw w sposb nieblokujcy 3. Obsuga aktualnego zdarzenia przychodzce dane odczyt a do zakoczenia, nastpnie wysyka wychodzce dane wysyka a do zakoczenia, nastpnie odbir zamknicie poczenia usunicie z listy rda

Serwer zdarzeniowy wyniki

Zakrcony serwer
Twisted Serwer zdarzeniowy Podobny do node.js Dua liczba dodatkw / protokow rda

Zakrcony serwer wyniki

Sewer na zielonych wtkach


gevent monkey patching gniazd sieciowych zdarzenia wspprogramy rda

Serwer zielonowtkowy wyniki

Serwer wielo- (-wtkowy)/(-procesowy)


Wykorzystanie podejcia jednowtkowego Wielokrotne kopie wtkw / procesw po jednym dla kadego klienta ew. ograniczona pula zasobw Moliwo wykorzystania operacji blokujcych Wspdzielone gniazdo nasuchujce Sposoby tworzenia wtkw / procesw na starcie serwera przy podczeniu klienta rda

Serwer wielo... wyniki

SocketServer
Modu SocketServer TCPServer / UDPServer ForkingMixIn / ThreadingMixIn Automatyczna kreacja wtkw / procesw przy akceptacji poczenia rda

SocketServer wyniki

Podsumowanie
Profesjonalny serwer zdemonizowany z logowaniem obsugujcy wielu klientw na raz Zwikszenie wydajnoci serwera mechanizm zdarze wtki / procesy load balancing

You might also like