pycon pl 2015: k. Łagowski, m. wróbel "kiedy ostatnio zrobiłeś coś dla 15 milionów...

52

Upload: kamil-lagowski

Post on 16-Apr-2017

179 views

Category:

Software


1 download

TRANSCRIPT

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

Pierwsza myśl

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

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

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

Kolejna myśl

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

Synchroniczność?

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

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

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

Asynchroniczność?

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

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

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

Asynchroniczna praca?

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

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

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

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

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

Select

PollEpoll

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

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

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

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

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

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ź

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

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

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

Jak programowaćasynchronicznie?

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

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

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

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

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

Kod asynchroniczny - callbacki

event loop print_page_size

zlecenie I/O

innefunkcje

done_callback

odpowiedźI/O

wysłanieI/O

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

coroutineod 1963 roku

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

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

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

Kod asynchroniczny - coroutine

event loop print_page_size

zlecenie I/O

innefunkcje

odpowiedźI/O

wysłanieI/O

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

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

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

[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/

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

Jakiego zestawu narzędzi użyć?

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

PyPy

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

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

CPython 2.7

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

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

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

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

Frameworkasynchroniczny

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

twisted

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

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

asyncio

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

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

gevent

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

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

tornado

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

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

CPython 3.x+

Tornado

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

ponad 200 aplikacjiponad 800 instancji

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

Architektura

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

Architektura monolityczna

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

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

Architektura mikroserwisów

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

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

Back-end

Front-end

Konfiguracja profilu

Przetwarzaniedanych online

DB

Wysyłanie powiadomień System szablonów

Powiadomienia HTML5

Uwierzytelnienie

Rejestracja

Przetwarzaniedanych offline

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

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

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

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

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

Mikroserwisy iasynchroniczność

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

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

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

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

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

Jak to wszystko ogarnąć?

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

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

consistency…”

Martin Fowler

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

Pytania?

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