pycon pl 2015: k. Łagowski, m. wróbel "kiedy ostatnio zrobiłeś coś dla 15 milionów...
TRANSCRIPT
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
[email protected] 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?