11
#4: Architektura serwera Mikołaj Olszewski Jakieś pytania po lekturze? Dotychczasowy styl Aplikacja w terminalu (konsola/screen) Komunikaty na standardowym wyjściu Jeden proces, jeden wątek Obsługa pojedynczego klienta

Programowanie w Internecie: #4 Architektura serwera

Embed Size (px)

DESCRIPTION

O czym warto wiedzieć tworząc serwer sieciowy

Citation preview

  • #4: Architektura serweraMikoaj Olszewski

    Jakie pytania po lekturze?

    Dotychczasowy styl

    Aplikacja w terminalu (konsola/screen)Komunikaty na standardowym wyjciuJeden proces, jeden wtekObsuga 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')

    Poziomy logowania

    DEBUGINFOWARNINGERRORCRITICAL

    DemonizacjaDemon proces dziaajcy w tle, niezaleny od terminala i uytkownika

    pena lista funkcjonalnociBiblioteka python-daemon$$ pip install python-daemon

    Prosty przykad

    ERROR:__main__:the system is down

  • import daemon

    with daemon.DaemonContext(): do_main_program()

    Peny przykad

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

    Obsuga klientw

    Przykadowy problemKlient: pytanie (?)Serwer: odpowied (. lub !)Katechizm polskiego dzieckaCz wsplna

    Klient1. Poczenie z serwerem2. Wysanie pytania3. Oczekiwanie na pen odpowied4. Wypisanie odpowiedzi5. Zamknicie poczenia

    rda

    Prosty serwer1. Akceptacja poczenia2. Oczekiwanie na zakoczenie pytania3. Znalezienie odpowiedzi4. Wysanie odpowiedzi5. 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 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)34.229963 sock.connect((hostname, port))34.230056 answers = []34.230059 for row in katechizm.qa:34.230062 sock.sendall(row[0])34.230092 answer = katechizm.recv_until(sock, ['.', '!']) 34.230201 question = katechizm.recv_until(client_sock, ['?']) 34.230243 answer = katechizm.qadict[question] 34.230246 client_sock.sendall(answer)34.230381 answers.append(answer)

    tunel

    ssh -N -R 4445:localhost:4444 ja@zdalnyssh -N -L 4445:localhost:4445 ja@zdalny

    21.760634 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)21.760674 sock.connect((hostname, port))21.761172 answers = []21.761175 for row in katechizm.qa:21.761178 sock.sendall(row[0])21.761205 answer = katechizm.recv_until(sock, ['.', '!']) 21.762027 question = katechizm.recv_until(client_sock, ['?']) 21.762964 answer = katechizm.qadict[question] 21.762967 client_sock.sendall(answer)21.763361 answers.append(answer)

    Benchmark

    (venv)$ pip install funkloadTest(venv)$ fl-run-bench tests.py TestKatechizm.test_dialogKonfiguracja 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 zdarzeniowo1. Akceptacja poczenia2. Nasuchiwanie informacji od wszystkich przyaczonych klientw w sposb nieblokujcy3. Obsuga aktualnego zdarzenia

    przychodzce dane odczyt a do zakoczenia, nastpnie wysykawychodzce dane wysyka a do zakoczenia, nastpnie odbirzamknicie poczenia usunicie z listy

    rda

    Serwer zdarzeniowy wyniki

  • Zakrcony serwerTwistedSerwer zdarzeniowyPodobny do node.jsDua liczba dodatkw / protokow

    rda

    Zakrcony serwer wyniki

  • Sewer na zielonych wtkachgeventmonkey patching gniazd sieciowychzdarzeniawspprogramy

    rda

    Serwer zielonowtkowy wyniki

  • Serwer wielo- (-wtkowy)/(-procesowy)Wykorzystanie podejcia jednowtkowegoWielokrotne kopie wtkw / procesw

    po jednym dla kadego klientaew. ograniczona pula zasobw

    Moliwo wykorzystania operacji blokujcychWspdzielone gniazdo nasuchujceSposoby tworzenia wtkw / procesw

    na starcie serweraprzy podczeniu klienta

    rda

    Serwer wielo... wyniki

  • SocketServerModu SocketServerTCPServer / UDPServerForkingMixIn / ThreadingMixInAutomatyczna kreacja wtkw / procesw przy akceptacji poczenia

    rda

    SocketServer wyniki

  • PodsumowanieProfesjonalny serwer

    zdemonizowanyz logowaniemobsugujcy wielu klientw na raz

    Zwikszenie wydajnoci serweramechanizm zdarzewtki / procesyload balancing

  • #4: Architektura serweraMikoaj OlszewskiJakie pytania po lekturze?Dotychczasowy styl

    rodowisko uruchomienioweLogowaniePoziomy logowania

    DemonizacjaProsty przykadPeny przykad

    Obsuga klientwPrzykadowy problemKlientProsty serwerPorwnanieledzenielocalhosttunelBenchmarkProsty serwer wyniki

    Sewer zorientowany zdarzeniowoSerwer zdarzeniowy wyniki

    Zakrcony serwerZakrcony serwer wyniki

    Sewer na zielonych wtkachSerwer zielonowtkowy wyniki

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

    SocketServerSocketServer wyniki

    Podsumowanie