node.js 実践非同期処理

85
リアルタイムアクションゲームから見る Node.js 実践非同期処理 2015/05/19 Daiki Taniguchi (@kidach1) Akatsuki inc.

Upload: kidach1

Post on 28-Jul-2015

1.163 views

Category:

Internet


3 download

TRANSCRIPT

Page 1: Node.js 実践非同期処理

リアルタイムアクションゲームから見る

Node.js 実践非同期処理

2015/05/19Daiki Taniguchi (@kidach1)

Akatsuki inc.

Page 2: Node.js 実践非同期処理

kidach1

・Github https://github.com/kidach1

・Twitter https://twitter.com/kidach1

・Qiita http://qiita.com/kidach1

・Node / JavaScript / TypeScript  Ruby / Rails Dvorak Keyboard

Page 3: Node.js 実践非同期処理

Agenda

・何を作っているか・Nodeにおける非同期処理手法 ・Promise ・Generator・非同期処理実践・テスト

Page 4: Node.js 実践非同期処理

Products

・2D横スクロールアクション・マルチプレイ ・4人同時対戦 ・座標同期型 ・プレイヤーマッチング (Rating / Keyword)

Page 5: Node.js 実践非同期処理

Architecture

Page 6: Node.js 実践非同期処理

Sequence (rough)

Page 7: Node.js 実践非同期処理

Platform / Protocal / Language

・Node.js・WebSocket・JavaScript / TypeScript

Page 8: Node.js 実践非同期処理

Node.js

・SingleThread・Non-blacking・EventDriven

Page 9: Node.js 実践非同期処理

Node.js

・SingleThread・Non-blacking・EventDriven

→ websocket(双方向通信)との相性 ◎

Page 10: Node.js 実践非同期処理

Node.js

Page 11: Node.js 実践非同期処理

Node.js

Callback Hell

Page 12: Node.js 実践非同期処理

Solution

最近のjs非同期処理 PromiseとGeneratorの共存

http://qiita.com/kidach1/items/d997df84a0ede39d76ad

Page 13: Node.js 実践非同期処理

Promise・非同期処理と操作を抽象化したAPI・then chain ・thenable・もともと初期のNodeには実装されていた →deprecated

 →ブラウザ ( jQuery.Deffered() )

 →ES6でPromiseA+として復活・ES6系機能は--harmony optionが必要(v0.12)  Node.jsのv0.12の時に harmony はdefaultにならないという結論になりました。 - from scratch  http://yosuke-furukawa.hatenablog.com/entry/2014/01/31/153207

Page 14: Node.js 実践非同期処理

Promise

・ある非同期処理

Page 15: Node.js 実践非同期処理

Promise

・Promiseオブジェクトでくるむ

Page 16: Node.js 実践非同期処理

・基本呼び出し

Promise

Page 17: Node.js 実践非同期処理

・基本呼び出し

$ time node --harmony promise.jsSync 1Async 1# node --harmony promise.js 0.05s user 0.05s system 8% cpu 1.179 total

Promise

Page 18: Node.js 実践非同期処理

・直列処理

Promise

Page 19: Node.js 実践非同期処理

・直列処理

$ time node --harmony promise.jsSync 1Sync 2Sync 3# node --harmony promise.js 0.06s user 0.06s system 3% cpu 3.218 total

Promise

Page 20: Node.js 実践非同期処理

・直列処理

$ time node --harmony promise.jsSync 1Sync 2Sync 3# node --harmony promise.js 0.06s user 0.06s system 3% cpu 3.218 total

Promise

Page 21: Node.js 実践非同期処理

・並列処理

Promise

Page 22: Node.js 実践非同期処理

・並列処理

$ time node --harmony promise.jsSync 1[ ‘Async 1’, ‘Async 2’, ‘Async 3’ ]# node --harmony promise.js 0.07s user 0.03s system 8% cpu 1.079 total

Promise

Page 23: Node.js 実践非同期処理

・並列処理

$ time node --harmony promise.jsSync 1[ ‘Async 1’, ‘Async 2’, ‘Async 3’ ]# node --harmony promise.js 0.07s user 0.03s system 8% cpu 1.079 total

Promise

Page 24: Node.js 実践非同期処理

Generator

・ES6・co-routine・非同期処理を同期処理っぽく(縦に)書く・yeild/next で処理の中断/再開  ・yeildables・try~catch

Page 25: Node.js 実践非同期処理

Generator

・yeild/next  ・処理の中断/再開 ・値の送信/受信

Page 26: Node.js 実践非同期処理

Generator

・yeild/next  ・処理の中断/再開 ・値の送信/受信

$ time node --harmony generator.jsSync 1Async 1Async 2Async 3# node --harmony generator.js 0.07s user 0.03s system 2% cpu 3.099 total

Page 27: Node.js 実践非同期処理

Generator

・yeild/next  ・処理の中断/再開 ・値の送信/受信

$ time node --harmony generator.jsSync 1Async 1Async 2Async 3# node --harmony generator.js 0.07s user 0.03s system 2% cpu 3.099 total

Page 28: Node.js 実践非同期処理

・縦に書けて良い!が・・・ ・送信/受信(next / yield)を辿るのは辛い ・generatorオブジェクトを隠蔽したい

Generator

Page 29: Node.js 実践非同期処理

co

https://github.com/tj/co

Page 30: Node.js 実践非同期処理

co

https://github.com/tj/co

Page 31: Node.js 実践非同期処理

Generator

Page 32: Node.js 実践非同期処理

Generator

Page 33: Node.js 実践非同期処理

Generator

・yieldに渡すメソッドのインターフェースは?

Page 34: Node.js 実践非同期処理

cohttps://github.com/tj/co

Page 35: Node.js 実践非同期処理

cohttps://github.com/tj/co

Page 36: Node.js 実践非同期処理

thenable is yieldables.

Page 37: Node.js 実践非同期処理

・直列処理

Generator with co

Page 38: Node.js 実践非同期処理

・直列処理

Generator with co

$ time node --harmony generator.jsSync 1Async 1Async 2Async 3# node --harmony generator.js 0.06s user 0.02s system 2% cpu 3.081 total

Page 39: Node.js 実践非同期処理

・直列処理

Generator with co

Page 40: Node.js 実践非同期処理

・直列処理

Generator with co

$ time node --harmony generator.jsSyncaSyNcASYNCasync# node --harmony generator.js 0.07s user 0.02s system 2% cpu 3.074 total

Page 41: Node.js 実践非同期処理

・Error Handling

Generator

Page 42: Node.js 実践非同期処理

・Error Handling

Generator

Page 43: Node.js 実践非同期処理

・Error Handling

$ time node --harmony generator.jsSync 1Error: err!# node --harmony generator.js 0.08s user 0.03s system 10% cpu 1.103 total

Generator

Page 44: Node.js 実践非同期処理

・Error Handling

Promise

Page 45: Node.js 実践非同期処理

・Error Handling

$ time node --harmony promise.jsSync 1Error: err!# node --harmony promise.js 0.07s user 0.03s system 8% cpu 1.076 total

Promise

Page 46: Node.js 実践非同期処理

非同期処理実例

Page 47: Node.js 実践非同期処理

- ユーザー情報のセット- レーティングごとまたは指定ルームNoごとのユーザー一覧の更新- 同一ルームNoのユーザー/レートの近いユーザー(候補者)の取得- 候補者からマッチング相手の絞込み- マッチングしたことを各ユーザーに通知

・プレイヤーマッチング処理 (Promise ver)

Examples

Page 48: Node.js 実践非同期処理

Examples

・プレイヤーマッチング処理 (callback ver)

Page 49: Node.js 実践非同期処理

・プレイヤーマッチング処理 (Promise ver)

Examples

Page 50: Node.js 実践非同期処理

・プレイヤーマッチング処理 (Promise ver)

Examples

Page 51: Node.js 実践非同期処理

・Promise objcet

Examples

Page 52: Node.js 実践非同期処理

・プレイヤーマッチング処理 (Generator ver)

Examples

Page 53: Node.js 実践非同期処理

・プレイヤーマッチング処理 (Promise ver)

Examples

Page 54: Node.js 実践非同期処理

- roomに終了済ユーザー情報をセット- 全員終了済かどうか判定- 終了済ならroomに通知

・ゲーム終了判定処理

Examples

Page 55: Node.js 実践非同期処理

・ゲーム終了判定処理 (Promise ver)

Examples

Page 56: Node.js 実践非同期処理

・ゲーム終了判定処理 (Generator ver)

Examples

Page 57: Node.js 実践非同期処理

- socket.idからユーザー情報/ルーム情報を取得- ルーム情報からルームメンバーを取得- メンバーにdisconnectを通知- ルーム情報からユーザー情報を除去

・プレイヤーdisconnect時の処理

Examples

Page 58: Node.js 実践非同期処理

・プレイヤーdisconnect時の処理 (Promise ver)

Examples

Page 59: Node.js 実践非同期処理

・プレイヤーdisconnect時の処理 (Promise ver)

Examples

Page 60: Node.js 実践非同期処理

・プレイヤーdisconnect時の処理 (Generator ver)

Examples

Page 61: Node.js 実践非同期処理

非同期処理のテスト

Page 62: Node.js 実践非同期処理

Testing

・接続シーケンスのシミュレート ・Mocha / should http://mochajs.org/

 ・高機能TestingFW & matcher・sinon http://sinonjs.org/

 ・mock, stub

Page 63: Node.js 実践非同期処理

・CONNECTの後にCONNECTEDが返却されること

Testing

Page 64: Node.js 実践非同期処理

・discoonectが同一ルームのメンバーに通知されること

Testing

Page 65: Node.js 実践非同期処理

・discoonectが同一ルームのメンバーに通知されること

Testing

Page 66: Node.js 実践非同期処理

・discoonectが同一ルームのメンバーに通知されること

Testing

Page 67: Node.js 実践非同期処理

Testing

・discoonectが別ルームのメンバーに通知されないこと

Page 68: Node.js 実践非同期処理

Testing

・discoonectが別ルームのメンバーに通知されないこと

Page 69: Node.js 実践非同期処理

Testing

・discoonectが別ルームのメンバーに通知されないこと

Page 70: Node.js 実践非同期処理

・Client Class

Testing

Page 71: Node.js 実践非同期処理

まとめ

・thenable is yieldables ・個々の処理はPromiseベースでくるんでおき ・Promiseで事足りるならそのまま ・複雑性が増しそうならgeneratorの世界を訪れる

Page 72: Node.js 実践非同期処理

まとめ

・thenable is yieldables ・個々の処理はPromiseベースでくるんでおき ・Promiseで事足りるならそのまま ・複雑性が増しそうならgeneratorの世界を訪れる

→ 気軽に行き来出来る!

Page 73: Node.js 実践非同期処理

PromiseとGeneratorで気持ち良い非同期処理を!

Page 74: Node.js 実践非同期処理

Questions

Page 75: Node.js 実践非同期処理

Appendix

Page 76: Node.js 実践非同期処理

Promise 内部実装イメージ

 $  node  promise.js                                                                                                                                                  42

Page 77: Node.js 実践非同期処理

Promise 内部実装イメージ

 $  node  promise.js                                                                                                                                                  42

Page 78: Node.js 実践非同期処理

Promise 内部実装イメージ

 $  node  promise.js                                                                                                                                                  42

Page 79: Node.js 実践非同期処理

Promise 内部実装イメージ

 $  node  promise.js                                                                                                                                                  42

Page 80: Node.js 実践非同期処理

Promise 内部実装イメージ

 $  node  promise.js                                                                                                                                                  42

Page 81: Node.js 実践非同期処理

Promise 内部実装イメージ

 $  node  promise.js                                                                                                                                                  42

Page 82: Node.js 実践非同期処理

Promise 内部実装イメージ

 $  node  promise.js                                                                                                                                                  42

Page 83: Node.js 実践非同期処理

Demo

Generator

Page 84: Node.js 実践非同期処理

Stream

・サイズの大きいdataを取り扱うI/O ・dataをchunkに分割 ・メモリ効率 ・パフォーマンス  ・読み込みながら(並列的に)別処理 ・優れたインターフェース  ・pipeで繋ぐ

Page 85: Node.js 実践非同期処理

Stream