PyCon PL 2015: K. Łagowski, M. Wróbel "Kiedy ostatnio zrobiłeś coś dla 15 milionów ludzi?"

Post on 16-Apr-2017

179 views 1 download

Transcript of PyCon PL 2015: K. Łagowski, M. Wróbel "Kiedy ostatnio zrobiłeś coś dla 15 milionów ludzi?"

Pierwsza myśl

http://www.warbud.pl/pl/realizacje/d-313-serwerownia-onet-plKonkurs Budowa Roku http://www.inzynierbudownictwa.pl/images/magda/galerie/onet/onet5.JPG

Kolejna myśl

Synchroniczność?

Mark Harkin https://www.flickr.com/photos/41153475@N04/19843960018

Asynchroniczność?

Mark Harkin https://www.flickr.com/photos/41153475@N04/20037312081

Asynchroniczna praca?

www.flickr.com/photos/99731349@N07/16522410947

www.flickr.com/photos/99731349@N07/16522410947

Select

PollEpoll

http://www.intelliproject.net/articles/showArticle/index/io_multiplexing

Blokujące I/O

Aplikacja Kernel

I/O odczyt Zapytanie systemoweInicjalizacja odczytu I/O

OdpowiedźTransport danych z kernela do

aplikacji

Apl

ikac

ja z

ablo

kow

ana

Asynchroniczne I/O

Aplikacja Kernel

I/O odczyt Zapytanie systemoweInicjalizacja odczytu I/O

Odpowiedź

Przekazanie danych do aplikacji za pomocą callback

Inne

zap

ytan

ia

Zapytanie systemowe

Zapytanie systemowe

Zapytanie systemowe

Odpowiedź

Odpowiedź

MattysFlicks https://www.flickr.com/photos/68397968@N07/13555161843

Jak programowaćasynchronicznie?

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()))

Kod asynchroniczny - callbacki

from tornado.httpclient import AsyncHTTPClient

def print_page_size(url='http://www.dreamlab.pl/'): client = AsyncHTTPClient() client.fetch(url, callback=done_callback)

def done_callback(result): print('bytes=%s' % len(result.body))

Kod asynchroniczny - callbacki

event loop print_page_size

zlecenie I/O

innefunkcje

done_callback

odpowiedźI/O

wysłanieI/O

coroutineod 1963 roku

Kod asynchroniczny - coroutine

from tornado.gen import coroutinefrom tornado.httpclient import AsyncHTTPClient

@coroutinedef print_page_size(url='http://www.dreamlab.pl/'): client = AsyncHTTPClient() result = yield client.fetch(url) print('bytes=%s' % len(result.body))

Kod asynchroniczny - coroutine

event loop print_page_size

zlecenie I/O

innefunkcje

odpowiedźI/O

wysłanieI/O

„I don't like callbacks much”Guido van Rossum

callbackicoroutine@tornado.asynchronousdef get(self, slug): db.posts.find_one({'slug': slug}, callback=self._found_post)def _found_post(self, post, error): if error: raise tornado.web.HTTPError(500, str(error)) elif not post: raise tornado.web.HTTPError(404) else: _id = post['_id'] self.post = post # Two queries in parallel. # Find the previously published post. db.posts.find_one( {'pub_date': {'$lt': post['pub_date']}} sort=[('pub_date', -1)], callback=self._found_prev) # Find subsequently published post. db.posts.find_one( {'pub_date': {'$gt': post['pub_date']}} sort=[('pub_date', 1)], callback=self._found_next)def _found_prev(self, prev_post, error): if error: raise tornado.web.HTTPError(500, str(error)) else: self.prev_post = prev_post if self.next_post: # Done self._render()def _found_next(self, next_post, error): if error: raise tornado.web.HTTPError(500, str(error)) else: self.next_post = next_post if self.prev_post: # Done self._render()def _render(self) self.render( 'post.html', post=self.post, prev_post=self.prev_post, next_post=self.next_post)

@gen.coroutinedef get(self, slug): post = yield db.posts.find_one({'slug': slug}) if not post: raise tornado.web.HTTPError(404) else: future_0 = db.posts.find_one( {'pub_date': {'$lt': post['pub_date']}} sort=[('pub_date', -1)]) future_1 = db.posts.find_one( {'pub_date': {'$gt': post['pub_date']}} sort=[('pub_date', 1)]) prev_post, next_post = yield [future_0, future_1] self.render( 'post.html', post=post, prev_post=prev_post, next_post=next_post)

Źródło: http://emptysqua.re/blog/refactoring-tornado-coroutines/

Jakiego zestawu narzędzi użyć?

PyPy

The U.S. Army, https://www.flickr.com/photos/soldiersmediacenter/1902588273/ Licence at https://creativecommons.org/licenses/by/2.0/

CPython 2.7

Ian Armstrong, https://www.flickr.com/photos/ianz/14762094471/ Licence at https://creativecommons.org/licenses/by-sa/2.0/

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

Frameworkasynchroniczny

twisted

dmytrok, https://www.flickr.com/photos/klimenko/4484977640/ Licence at https://creativecommons.org/licenses/by-nd/2.0/

asyncio

Christian Senger, https://www.flickr.com/photos/30928442@N08/5332775890/ License at https://creativecommons.org/licenses/by-sa/2.0/

gevent

http://www.commentsyard.com/gangsta-girl-swag/

tornado

Veronica538, https://commons.wikimedia.org/wiki/File:Truckdriver.jpg License at https://creativecommons.org/licenses/by-sa/3.0/deed.en

CPython 3.x+

Tornado

ponad 200 aplikacjiponad 800 instancji

Architektura

Architektura monolityczna

https://www.flickr.com/photos/grant_subaru/14385751972/in/photostream/Grant.C

Architektura mikroserwisów

Gil Abrantes https://commons.wikimedia.org/wiki/File:Catalunya_test_2011_-_36.jpg

Back-end

Front-end

Konfiguracja profilu

Przetwarzaniedanych online

DB

Wysyłanie powiadomień System szablonów

Powiadomienia HTML5

Uwierzytelnienie

Rejestracja

Przetwarzaniedanych offline

Konfiguracja profilu Uwierzytelnienie

Przetwarzaniedanych on-line

Online DB

Offline DBPrzetwarzanie danych off-line

Wysyłanie powiadomień

System szablonówWysyłanie e-mail

Powiadomienia przeglądarkowe

http://martinfowler.com/bliki/MicroservicePremium.htmlMartin Fowler

Mikroserwisy iasynchroniczność

Jerry https://www.flickr.com/photos/78897321@N00/122866496

Konfiguracja profilu Uwierzytelnienie

Przetwarzaniedanych on-line

Online DB

Offline DBPrzetwarzanie danych off-line

Wysyłanie powiadomień

System szablonówWysyłanie e-mail

Powiadomienia przeglądarkowe

Jak to wszystko ogarnąć?

„When you use microservices you have to work on automated deployment, monitoring, dealing with failure, eventual

consistency…”

Martin Fowler

Pytania?