Your SlideShare is downloading. ×
NonBlocking and Asynchronous<br />Norio Kobota @nori0428<br />
自己紹介<br />小保田 規生(こぼた のりお)と申します幼少のころから、こくぼくん、くぼたくんと呼ばれるのがデフォルトになってます<br />Lighttpd用のwebsocket module作ってます# 最近リファクタリング、メンテや更...
はじめに<br />WebSocket<br />JavaScriptのLayerからみると、一般的なイベント駆動型のTCPsocketを扱えるようになる仕組み※1<br />詳細は他の講師の方が説明してくださっているとおり:)<br />We...
と、思って調べてたら・・・<br />
既に素晴らしい資料がありました!<br />Node.js 入門<br />http://d.hatena.ne.jp/forest1040/<br />
Node.js入門<br />素晴らしく纏まっている・・・これは勝てない<br />発見したのが資料事前UP前日<br />急病を理由に逃げようか、本気で考える<br />・・・参照させてもらおう、と開き直って本日に至る<br />
forest1040さんの素晴らしい資料公開に大感謝<br />forest1040さん、オープンソースカンファレンス2011 Kansai/Kobeに参加された皆さま、ごめんなさい<br />ごめんなさい・・・otz<br />
言葉の定義<br />
並行処理<br />マルチスレッドによる並行処理<br />呼び出し元と並行して処理が行われる<br />シングルスレッドによる並行処理<br />呼び出し元がプロセッサを利用していないときに処理が行われる<br />処理2開始!<br />処...
同期呼び出し、非同期呼び出し<br />同期呼び出し(Synchronous Call)<br />メソッドを呼び出すとメソッド内処理が完了するまで呼び出し元に戻ってこない<br />非同期呼び出し(Asynchronous Call)<br ...
ブロッキングI/O、ノンブロッキングI/O<br />ブロッキングI/O<br />データ読み込み、書き込みなどの処理が完了するまで待たされること<br />ノンブロッキングI/O<br />データ読み込み、書き込みなどの処理が完了するのを待た...
I/O Model<br />非常によく引用される図<br />Boost application performance using asynchronous I/O<br />
非同期呼び出しやノンブロッキングI/Oが必要なのは何故か?<br />
C10K problem<br />サーバ1台に対して、クライアントが1万台繋がったらどうなる?と言う問題<br />The C10Kproblem<br />解決方法(The C10K problemの中で記述されています)<br />各スレ...
WebSocket Server実装<br />Apache - pywebsocket<br />解決方法4番各スレッドが1つのクライアントを受け付けるブロッキングI/Oを利用する<br />Node.js他、殆どのWebSocketServ...
アプリケーションが気をつけることは?<br />
注意することは、1つだけ<br />1つのスレッドが、複数のクライアントを処理->イベントハンドラ内はシングルスレッド<br />libev etc.<br />clientA<br />Application<br />clientB<br ...
今後の展望<br />
ボトルネックはネットワーク?シングルスレッド?<br />リアルタイム性を追求したい、マルチコア時代の高並列性I/Oアーキテクチャ – Wavy<br />http://d.hatena.ne.jp/viver/20090131/p1<br /...
WebSocketApplicationをスケールさせるには?<br />WebSocketはCross Domain通信が可能WebSocketを用いたApplicationには別のサーバを!<br />httpd<br />browser<...
スケールのさせ方(将来?)<br />WebSocket ProxyWebSocketのセッション管理、バックエンドのサーバ負荷分散を行う為のproxyが必要になる<br />browser<br />browser<br />websocke...
mod_websocket for lighttpdのご紹介<br />
mod_websocket for lighttpd<br />WebSocket Proxyでは無い<br />WebSocket とTCP Socketを繋ぐReverse Proxyぽい実装<br />lighttpd<br />Appl...
Pros, Cons<br />Pros<br />外部に公開するポートはLighttpdで利用するポートだけ<br />サーバサイドアプリケーションを作成すること無く、既存TCPサーバと通信が可能<br />Cons<br />サーバサイドア...
地味なデモ(for chrome, safari, firefox 4.x)<br />https://onmessage.ws/demos/ws-smtp.html<br />JavaScript<br />lighttpd<br />pos...
JavaScriptと、lighttpdのconfig fileだけで実現<br />デモの特徴<br />websocket.server  = (“/smtp” => (<br />			“host” => “127.0.0.1”,<br ...
まとめ<br />ノンブロッキング、非同期について覚えておこう<br />イベントハンドラ内処理は短時間で済ませよう<br />WebSocketサーバはもっとリアルタイム性を追求できる<br />WebSocketサーバのスケールのさせ方も変...
Thank You!<br />資料作成にあたり大変なご協力をいただいた@nmiyo氏に感謝<br />
Upcoming SlideShare
Loading in...5
×

Non blocking and asynchronous

5,254

Published on

for WebSocket Study

Published in: Technology

Transcript of "Non blocking and asynchronous"

  1. 1. NonBlocking and Asynchronous<br />Norio Kobota @nori0428<br />
  2. 2. 自己紹介<br />小保田 規生(こぼた のりお)と申します幼少のころから、こくぼくん、くぼたくんと呼ばれるのがデフォルトになってます<br />Lighttpd用のwebsocket module作ってます# 最近リファクタリング、メンテや更新出来てなくてごめんなさい https://github.com/nori0428/mod_websocket<br />本業は組み込みや、ネットワーク周りのソフトウェアエンジニアですが、最近はJavaScriptも書いてます<br />
  3. 3. はじめに<br />WebSocket<br />JavaScriptのLayerからみると、一般的なイベント駆動型のTCPsocketを扱えるようになる仕組み※1<br />詳細は他の講師の方が説明してくださっているとおり:)<br />WebSocketの利用方法やアプリケーションは良く説明されている。一方、サーバ側の動きはあまり説明されることが無い?<br />※1:現時点では無理です<br />
  4. 4. と、思って調べてたら・・・<br />
  5. 5. 既に素晴らしい資料がありました!<br />Node.js 入門<br />http://d.hatena.ne.jp/forest1040/<br />
  6. 6. Node.js入門<br />素晴らしく纏まっている・・・これは勝てない<br />発見したのが資料事前UP前日<br />急病を理由に逃げようか、本気で考える<br />・・・参照させてもらおう、と開き直って本日に至る<br />
  7. 7. forest1040さんの素晴らしい資料公開に大感謝<br />forest1040さん、オープンソースカンファレンス2011 Kansai/Kobeに参加された皆さま、ごめんなさい<br />ごめんなさい・・・otz<br />
  8. 8. 言葉の定義<br />
  9. 9. 並行処理<br />マルチスレッドによる並行処理<br />呼び出し元と並行して処理が行われる<br />シングルスレッドによる並行処理<br />呼び出し元がプロセッサを利用していないときに処理が行われる<br />処理2開始!<br />処理1<br />処理2<br />処理2開始!<br />処理1<br />処理2<br />Node.js 入門 page.7<br />
  10. 10. 同期呼び出し、非同期呼び出し<br />同期呼び出し(Synchronous Call)<br />メソッドを呼び出すとメソッド内処理が完了するまで呼び出し元に戻ってこない<br />非同期呼び出し(Asynchronous Call)<br />メソッドを呼び出した瞬間に呼び出し元に処理が戻ってくる<br />呼びだした処理は先の並行処理モデルによって処理されるタイミングが異なる<br />Node.js 入門 page.10<br />
  11. 11. ブロッキングI/O、ノンブロッキングI/O<br />ブロッキングI/O<br />データ読み込み、書き込みなどの処理が完了するまで待たされること<br />ノンブロッキングI/O<br />データ読み込み、書き込みなどの処理が完了するのを待たず、次の処理が行えること<br />Node.js 入門 page.11<br />
  12. 12. I/O Model<br />非常によく引用される図<br />Boost application performance using asynchronous I/O<br />
  13. 13. 非同期呼び出しやノンブロッキングI/Oが必要なのは何故か?<br />
  14. 14. C10K problem<br />サーバ1台に対して、クライアントが1万台繋がったらどうなる?と言う問題<br />The C10Kproblem<br />解決方法(The C10K problemの中で記述されています)<br />各スレッドが複数のクライアントを受け付けるノンブロッキングI/Oとレベルトリガ型通知※1を利用する<br />各スレッドが複数のクライアントを受け付けるノンブロッキングI/Oとエッジトリガ型通知※1を利用する<br />各スレッドが複数のクライアントを受け付けるAIOを利用する<br />各スレッドが1つのクライアントを受け付けるブロッキングI/Oを利用する<br />サーバコードをカーネルに組み込む<br />※1:http://d.hatena.ne.jp/kazuhooku/20080707/1215385159<br />Node.js 入門 page.15<br />
  15. 15. WebSocket Server実装<br />Apache - pywebsocket<br />解決方法4番各スレッドが1つのクライアントを受け付けるブロッキングI/Oを利用する<br />Node.js他、殆どのWebSocketServer実装<br />解決方法3番各スレッドが複数のクライアントを受け付けるAIO(相当するlibev + libeioなど)を利用する<br />
  16. 16. アプリケーションが気をつけることは?<br />
  17. 17. 注意することは、1つだけ<br />1つのスレッドが、複数のクライアントを処理->イベントハンドラ内はシングルスレッド<br />libev etc.<br />clientA<br />Application<br />clientB<br />Event callback<br />ここはシングルスレッド<br />で逐次処理<br />この間、clientBは待たされる<br />Event callback<br />イベントハンドラ内の処理は、出来る限りシンプルに、短時間で終わらせましょう<br />
  18. 18. 今後の展望<br />
  19. 19. ボトルネックはネットワーク?シングルスレッド?<br />リアルタイム性を追求したい、マルチコア時代の高並列性I/Oアーキテクチャ – Wavy<br />http://d.hatena.ne.jp/viver/20090131/p1<br />並列イベント駆動I/Oフレームワーク – mpio<br />http://d.hatena.ne.jp/viver/20100412/p1<br />clientA<br />AIO<br />Application<br />clientB<br />イベントハンドラもマルチスレッド化<br />
  20. 20. WebSocketApplicationをスケールさせるには?<br />WebSocketはCross Domain通信が可能WebSocketを用いたApplicationには別のサーバを!<br />httpd<br />browser<br />browser<br />websocketd<br />browser<br />Cross Domain<br />HTTPはWebServerへ<br />WebSocketは別Serverへ<br />websocketd<br />
  21. 21. スケールのさせ方(将来?)<br />WebSocket ProxyWebSocketのセッション管理、バックエンドのサーバ負荷分散を行う為のproxyが必要になる<br />browser<br />browser<br />websocketd<br />browser<br />WebSocket Proxy<br />ProxyServerで別Serverへ<br />振り分け<br />httpd<br />websocketd<br />proxy<br />
  22. 22. mod_websocket for lighttpdのご紹介<br />
  23. 23. mod_websocket for lighttpd<br />WebSocket Proxyでは無い<br />WebSocket とTCP Socketを繋ぐReverse Proxyぽい実装<br />lighttpd<br />Application<br />browsers<br />WebSocket<br />Internet<br />TCP Socket<br />TCP Socket<br />WebSocket<br />
  24. 24. Pros, Cons<br />Pros<br />外部に公開するポートはLighttpdで利用するポートだけ<br />サーバサイドアプリケーションを作成すること無く、既存TCPサーバと通信が可能<br />Cons<br />サーバサイドアプリケーションが作りづらい<br />version-07には対応してません<br />mod_websocketの出来が悪い・・・いや、ほんとにごめんなさい<br />
  25. 25. 地味なデモ(for chrome, safari, firefox 4.x)<br />https://onmessage.ws/demos/ws-smtp.html<br />JavaScript<br />lighttpd<br />postfix<br />Browsers<br />WebSocket(wss scheme)<br />new WebSocket<br />connect<br />TCP Socket<br />send<br />SMTPTerminal<br />onmessage<br />disconnect<br />onclose<br />
  26. 26. JavaScriptと、lighttpdのconfig fileだけで実現<br />デモの特徴<br />websocket.server = (“/smtp” => (<br /> “host” => “127.0.0.1”,<br /> “port” => 25,<br /> “origins” => (“onmessage.ws”))<br />browser<br />Any Client<br />lighttpd.conf<br />mod_websocket for Lighttpd<br />Local Area※1<br />Internet<br />lighttpd<br />postfix<br />※1: デモではローカルループバックです<br />
  27. 27. まとめ<br />ノンブロッキング、非同期について覚えておこう<br />イベントハンドラ内処理は短時間で済ませよう<br />WebSocketサーバはもっとリアルタイム性を追求できる<br />WebSocketサーバのスケールのさせ方も変わるはず<br />mod_websocket for lighttpdは頑張って開発します<br />
  28. 28. Thank You!<br />資料作成にあたり大変なご協力をいただいた@nmiyo氏に感謝<br />

×