Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Pierwsza myśl
http://www.warbud.pl/pl/realizacje/d-313-serwerownia-onet-pl
Konkurs Budowa Roku http://www.inzynierbudownictwa.pl/images/...
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
Poll
Epoll
http://www.intelliproject.net/articles/showArticle/index/io_multiplexing
Blokujące I/O
Aplikacja Kernel
I/O odczyt Zapytanie systemowe
Inicjalizacja
odczytu I/O
Odpowiedź
Transport danych z kerne...
Asynchroniczne I/O
Aplikacja Kernel
I/O odczyt Zapytanie systemowe
Inicjalizacja
odczytu I/O
Odpowiedź
Przekazanie danych ...
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(...
Kod asynchroniczny - callbacki
from tornado.httpclient import AsyncHTTPClient
def print_page_size(url='http://www.dreamlab...
Kod asynchroniczny - callbacki
event loop print_page_size
zlecenie I/O
inne
funkcje
done_callback
odpowiedź
I/O
wysłanie
I...
coroutine
od 1963 roku
Kod asynchroniczny - coroutine
from tornado.gen import coroutine
from tornado.httpclient import AsyncHTTPClient
@coroutine...
Kod asynchroniczny - coroutine
event loop print_page_size
zlecenie I/O
inne
funkcje
odpowiedź
I/O
wysłanie
I/O
„I don't like callbacks much”
Guido van Rossum
callbackicoroutine
@tornado.asynchronous
def get(self, slug):
db.posts.find_one({'slug': slug}, callback=self._found_post)...
Jakiego zestawu narzędzi użyć?
PyPy
The U.S. Army, https://www.flickr.com/photos/soldiersmediacenter/1902588273/ Licence at https://creativecommons.org/l...
CPython 2.7
Ian Armstrong, https://www.flickr.com/photos/ianz/14762094471/ Licence at https://creativecommons.org/licenses...
CPython 3.x
David van der Mark, https://commons.wikimedia.org/wiki/File:Blue_Tesla_Model_S_Zoutelande_dunes_Holland.jpg Li...
Framework
asynchroniczny
twisted
dmytrok, https://www.flickr.com/photos/klimenko/4484977640/ Licence at https://creativecommons.org/licenses/by-nd/...
asyncio
Christian Senger, https://www.flickr.com/photos/30928442@N08/5332775890/ License at https://creativecommons.org/li...
gevent
http://www.commentsyard.com/gangsta-girl-swag/
tornado
Veronica538, https://commons.wikimedia.org/wiki/File:Truckdriver.jpg License at https://creativecommons.org/licens...
CPython 3.x
+
Tornado
ponad 200 aplikacji
ponad 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
Przetwarzanie
danych online
DB
Wysyłanie
powiadomień
System szablonów
Powiadomieni...
Konfiguracja
profilu
Uwierzytelnienie
Przetwarzanie
danych on-line
Online DB
Offline DB
Przetwarzanie
danych off-line
Wysy...
http://martinfowler.com/bliki/MicroservicePremium.htmlMartin Fowler
Mikroserwisy i
asynchroniczność
Jerry https://www.flickr.com/photos/78897321@N00/122866496
Konfiguracja
profilu
Uwierzytelnienie
Przetwarzanie
danych on-line
Online DB
Offline DB
Przetwarzanie
danych off-line
Wysy...
Jak to wszystko ogarnąć?
„When you use microservices you have to work on automated
deployment, monitoring, dealing with failure, eventual
consisten...
Pytania?
PyCon PL 2015: K. Łagowski, M. Wróbel "Kiedy ostatnio zrobiłeś coś dla 15 milionów ludzi?"
PyCon PL 2015: K. Łagowski, M. Wróbel "Kiedy ostatnio zrobiłeś coś dla 15 milionów ludzi?"
PyCon PL 2015: K. Łagowski, M. Wróbel "Kiedy ostatnio zrobiłeś coś dla 15 milionów ludzi?"
PyCon PL 2015: K. Łagowski, M. Wróbel "Kiedy ostatnio zrobiłeś coś dla 15 milionów ludzi?"
PyCon PL 2015: K. Łagowski, M. Wróbel "Kiedy ostatnio zrobiłeś coś dla 15 milionów ludzi?"
Upcoming SlideShare
Loading in …5
×

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

229 views

Published on

Tworzymy portal, który odwiedzają miliony użytkowników. Do zapewnienia wysokiej wydajności potrzebujemy architektury opartej o nieblokujące połączenia sieciowe. W ostatnich latach powstało wiele frameworków webowych w języku Python wspomagających programowanie asynchroniczne. Który zatem wybrać? Tornado? Gevent? Pokażemy jak asynchroniczność działa na poziomie systemu operacyjnego, przedstawimy różne modele programowania, po czym przejdziemy do porównania najpopularniejszych frameworków webowych. Na koniec zaprezentujemy jak przy wykorzystaniu asynchroniczności w architekturze "Microservices" zrobić system dla milionów użytkowników.

Kamil Łagowski
IT Systems Architect w firmie DreamLab Onet.pl. Odpowiedzialny m.in. za tworzenie wysokowydajnych aplikacji w oparciu o język programowania Python oraz technologie NoSQL.

Marcin Wróbel
Z DreamLab Onet.pl związany od ponad 5 lat. Programuje głównie część aplikacyjną w Pythonie i bazy danych. Zajmuje się także rozwojem i utrzymaniem środowiska Python w firmie. Ostatnio przetwarza dane na Hadoopie na potrzeby systemów rekomendacyjnych oraz do celów analitycznych.

Published in: Software
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Pierwsza myśl
  2. 2. http://www.warbud.pl/pl/realizacje/d-313-serwerownia-onet-pl Konkurs Budowa Roku http://www.inzynierbudownictwa.pl/images/magda/galerie/onet/onet5.JPG
  3. 3. Kolejna myśl
  4. 4. Synchroniczność?
  5. 5. Mark Harkin https://www.flickr.com/photos/41153475@N04/19843960018
  6. 6. Asynchroniczność?
  7. 7. Mark Harkin https://www.flickr.com/photos/41153475@N04/20037312081
  8. 8. Asynchroniczna praca?
  9. 9. www.flickr.com/photos/99731349@N07/16522410947
  10. 10. www.flickr.com/photos/99731349@N07/16522410947
  11. 11. Select Poll Epoll
  12. 12. http://www.intelliproject.net/articles/showArticle/index/io_multiplexing
  13. 13. Blokujące I/O Aplikacja Kernel I/O odczyt Zapytanie systemowe Inicjalizacja odczytu I/O Odpowiedź Transport danych z kernela do aplikacji
  14. 14. Asynchroniczne I/O Aplikacja Kernel I/O odczyt Zapytanie systemowe Inicjalizacja odczytu I/O Odpowiedź Przekazanie danych do aplikacji za pomocą callback Zapytanie systemowe Zapytanie systemowe Zapytanie systemowe Odpowiedź Odpowiedź
  15. 15. MattysFlicks https://www.flickr.com/photos/68397968@N07/13555161843
  16. 16. Jak programować asynchronicznie?
  17. 17. 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()))
  18. 18. 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))
  19. 19. Kod asynchroniczny - callbacki event loop print_page_size zlecenie I/O inne funkcje done_callback odpowiedź I/O wysłanie I/O
  20. 20. coroutine od 1963 roku
  21. 21. Kod asynchroniczny - coroutine from tornado.gen import coroutine from tornado.httpclient import AsyncHTTPClient @coroutine def print_page_size(url='http://www.dreamlab.pl/'): client = AsyncHTTPClient() result = yield client.fetch(url) print('bytes=%s' % len(result.body))
  22. 22. Kod asynchroniczny - coroutine event loop print_page_size zlecenie I/O inne funkcje odpowiedź I/O wysłanie I/O
  23. 23. „I don't like callbacks much” Guido van Rossum
  24. 24. callbackicoroutine @tornado.asynchronous def 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.coroutine def 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/
  25. 25. Jakiego zestawu narzędzi użyć?
  26. 26. PyPy The U.S. Army, https://www.flickr.com/photos/soldiersmediacenter/1902588273/ Licence at https://creativecommons.org/licenses/by/2.0/
  27. 27. CPython 2.7 Ian Armstrong, https://www.flickr.com/photos/ianz/14762094471/ Licence at https://creativecommons.org/licenses/by-sa/2.0/
  28. 28. 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
  29. 29. Framework asynchroniczny
  30. 30. twisted dmytrok, https://www.flickr.com/photos/klimenko/4484977640/ Licence at https://creativecommons.org/licenses/by-nd/2.0/
  31. 31. asyncio Christian Senger, https://www.flickr.com/photos/30928442@N08/5332775890/ License at https://creativecommons.org/licenses/by-sa/2.0/
  32. 32. gevent http://www.commentsyard.com/gangsta-girl-swag/
  33. 33. tornado Veronica538, https://commons.wikimedia.org/wiki/File:Truckdriver.jpg License at https://creativecommons.org/licenses/by-sa/3.0/deed.en
  34. 34. CPython 3.x + Tornado
  35. 35. ponad 200 aplikacji ponad 800 instancji
  36. 36. Architektura
  37. 37. Architektura monolityczna https://www.flickr.com/photos/grant_subaru/14385751972/in/photostream/Grant.C
  38. 38. Architektura mikroserwisów Gil Abrantes https://commons.wikimedia.org/wiki/File:Catalunya_test_2011_-_36.jpg
  39. 39. Back-end Front-end Konfiguracja profilu Przetwarzanie danych online DB Wysyłanie powiadomień System szablonów Powiadomienia HTML5 Uwierzytelnienie Rejestracja Przetwarzanie danych offline
  40. 40. Konfiguracja profilu Uwierzytelnienie Przetwarzanie danych on-line Online DB Offline DB Przetwarzanie danych off-line Wysyłanie powiadomień System szablonów Wysyłanie e-mail Powiadomienia przeglądarkowe
  41. 41. http://martinfowler.com/bliki/MicroservicePremium.htmlMartin Fowler
  42. 42. Mikroserwisy i asynchroniczność
  43. 43. Jerry https://www.flickr.com/photos/78897321@N00/122866496
  44. 44. Konfiguracja profilu Uwierzytelnienie Przetwarzanie danych on-line Online DB Offline DB Przetwarzanie danych off-line Wysyłanie powiadomień System szablonów Wysyłanie e-mail Powiadomienia przeglądarkowe
  45. 45. Jak to wszystko ogarnąć?
  46. 46. „When you use microservices you have to work on automated deployment, monitoring, dealing with failure, eventual consistency…” Martin Fowler
  47. 47. Pytania?

×