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.

マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

1,492 views

Published on

モノタロウではマイクロサービスを進めており、開発効率の向上など一定の成果を上げております。 マイクロサービスを利用する側もHTTP APIを利用する実装が済んでおり、現在は1リクエストあたりの処理効率を上げる取り組みを進めています。 マイクロサービスを利用する側として、Pythonにおける非同期IOやmultiprocessingを使った場合に、どのくらいリクエストの処理効率が向上するのか、実際に適用した場合にコーディングがどの程度複雑になるのかを説明します。

https://pycon.jp/2016/ja/schedule/presentation/22/

Published in: Software
  • Be the first to comment

マイクロサービスを利用する側のパフォーマンス向上策 (PyCon JP 2016)

  1. 1. https://www.monotaro.com/
  2. 2. https://www.monotaro.com/ 2
  3. 3. https://www.monotaro.com/ 3
  4. 4. https://www.monotaro.com/ 4 

  5. 5. https://www.monotaro.com/ 5 • • • • 
 • 
 •
  6. 6. https://www.monotaro.com/ 6
  7. 7. https://www.monotaro.com/ – 7
  8. 8. https://www.monotaro.com/ – 8
  9. 9. https://www.monotaro.com/ 9 
 MonotaRO http://www.slideshare.net/monotaro-itd-pr/monotaro-20150320-devlove
  10. 10. https://www.monotaro.com/ 10
  11. 11. https://www.monotaro.com/ 11 
 

  12. 12. https://www.monotaro.com/ 12 

  13. 13. https://www.monotaro.com/ 13
  14. 14. https://www.monotaro.com/ 14 12 API
  15. 15. https://www.monotaro.com/ 15
  16. 16. https://www.monotaro.com/ 16 APIAPIAPI API AP Server
  17. 17. https://www.monotaro.com/ 17 APIAPIAPI API AP Server
  18. 18. https://www.monotaro.com/ 18
  19. 19. https://www.monotaro.com/ 19 
 

  20. 20. https://www.monotaro.com/ 20
  21. 21. https://www.monotaro.com/ 21
  22. 22. https://www.monotaro.com/ 22 Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 3.330 3.330 run_web.py:134(application) 1 0.000 0.000 3.330 3.330 (フレームワーク初期化) 1 0.000 0.000 3.249 3.249 (フレームワーク初期化) 1 0.000 0.000 3.180 3.180 (フレームワーク初期化) 1 0.000 0.000 3.180 3.180 (画面実装部分) 19 0.000 0.000 2.991 0.157 (画面実装部分) 19 0.000 0.000 2.920 0.154 (画面実装部分) 10 0.000 0.000 2.865 0.286 (画面実装部分) 7591 2.784 0.000 2.784 0.000 {method 'recv' of '_socket.socket' objects} 19 0.000 0.000 2.275 0.120 liburllib2.py:122(urlopen) 19 0.000 0.000 2.275 0.120 liburllib2.py:373(open) 19 0.000 0.000 2.274 0.120 liburllib2.py:401(_open) (略)
  23. 23. https://www.monotaro.com/ 23
  24. 24. https://www.monotaro.com/ 24 Boost application performance using asynchronous I/O http://www.ibm.com/developerworks/library/l-async/
  25. 25. https://www.monotaro.com/ 25 Boost application performance using asynchronous I/O http://www.ibm.com/developerworks/library/l-async/
  26. 26. https://www.monotaro.com/ 26 
 

  27. 27. https://www.monotaro.com/ 27
  28. 28. https://www.monotaro.com/ 28 # 標準ライブラリにモンキーパッチ # 必ず標準ライブラリの前に書くこと! from gevent import monkey
 monkey.patch_all()
 # urllib2が非同期IO版に置換される import urllib2 import gevent

  29. 29. https://www.monotaro.com/ 29 def get_json(self, url, params): response = urllib2.urlopen(url).read()
 return json.loads(response) # 変更前 (urlopenで待たされる) result = self.get_json(any_url, any_params)
  30. 30. https://www.monotaro.com/ 30 def get_json(self, url, params): response = urllib2.urlopen(url).read()
 return json.loads(response) # get_jsonはすぐには実行しない future = gevent.spawn(self.get_json, any_url, any_params) (他の処理を実行できる) # future.get()実行結果が来るまでブロック result = future.get()
  31. 31. https://www.monotaro.com/ 31 
 future1 = gevent.spawn(self.get_json, url1, param1) future2 = gevent.spawn(self.get_json, url2, param2) future3 = gevent.spawn(self.get_json, url3, param3) future4 = gevent.spawn(self.get_json, url4, param4) future5 = gevent.spawn(self.get_json, url5, param5) …
  32. 32. https://www.monotaro.com/ 32 from gevent.lock import Semaphore
 # セマフォを用いて同時処理数を50に制限 semaphore = Semaphore(50) def get_json(self, url, params): # このコンテキスト内には同時に最大50しか入れない
 with semaphore: response = urllib2.urlopen(url).read() return json.loads(response)
  33. 33. https://www.monotaro.com/ 33 from gevent.pywsgi import WSGIServer
 http_server = WSGIServer(('', 5000), app)
 http_server.serve_forever()
  34. 34. https://www.monotaro.com/ 34 gevent.spawn
  35. 35. https://www.monotaro.com/ 35 APIAPIAPI API AP Server
  36. 36. https://www.monotaro.com/ API [ms]
  37. 37. https://www.monotaro.com/ 37 APIAPIAPI API AP Server
  38. 38. https://www.monotaro.com/ 38
  39. 39. https://www.monotaro.com/ 
 APIAPIAPI API AP Server 39
  40. 40. https://www.monotaro.com/ 
 40 APIAPIAPI API AP Server
  41. 41. https://www.monotaro.com/ 41
  42. 42. https://www.monotaro.com/ 42
  43. 43. https://www.monotaro.com/ 43
  44. 44. https://www.monotaro.com/ 44
  45. 45. https://www.monotaro.com/ 45
  46. 46. https://www.monotaro.com/ 46
  47. 47. https://www.monotaro.com/ 47

×