Nodejs+socket ioを試す

1,832 views

Published on

Published in: Software, Technology, Business
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,832
On SlideShare
0
From Embeds
0
Number of Embeds
34
Actions
Shares
0
Downloads
6
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Nodejs+socket ioを試す

  1. 1. @Uzundk node.js + Socket.IO
  2. 2. @uzundk •社内システムエンジニア兼務 •Excelマクロ •小規模グループ向けに開発/展開 •VBA 6年 •PHP 1年 •node.js 3ヶ月
  3. 3. とは? • イベント駆動 • 非IOブロッキングモデル Node.js uses an event-driven, non-blocking I/O model http://nodejs.org/より
  4. 4. • CPUと周辺の差の拡大 
 IOがボトルネック • C10K問題
 1接続1スレッドは無駄が多いので1スレッドイベ ントループで処理 • イベントループでブロッキングすると他も止まる
 非IOブロッキング node.jsのなにがおいしいの?
  5. 5. year CPU GHz FLOPS /Clock Core GFLOPS /Core Total GFLOPS mem mem GB/s HDD GB/s 2006 Core Duo 2.33 1.5 2 3.495 6.99 DDR2 -4200 4.267 0.07 2014 Haswell 3.5 16 4 56 224 DDR3 -10600 21.2 0.15 Update Rate 16.02 32.05 4.97 2.14性能差はさらに広がる> 性能の進化をざっくり比較
  6. 6. It's care-free realtime 100% in JavaScript. ケアフリー?
  7. 7. • Ajax long polling
 バックグラウンドでHTTP通信
 通信コストが高い • Plugin Socket
 FLASH,Sliverlightなどのプラグイン
 端末にプラグインのインストールが必要 • WebSocket
 HTTP接続をupgradeして接続
 モダンブラウザのみ とにかくどれでも良いから同じコードで繋げたい ネットワークの情報をもっとリアルタイムに
  8. 8. $(function(){! //開いたアドレスに対してWebSocketを繋ぐ! var socket = io.connect('http://'+window.location.host+'/');! ! //接続したら! socket.on('connect',function(){! ! ! ! ! //メッセージ送信! socket.emit('echo','Connection Success');! ! ! //echo test! socket.on('echo',function(msg){! console.log('echo : '+msg);! socket.emit('broadcast','user login');! });! ! ! //broadcast test! socket.on('broadcast',function(msg){! console.log('broadcast : '+msg);! });! ! ! //Disconnect! socket.on('disconnect',function(){! console.log('Disconnect Server.');! });! });! ! });! 自分でeventnameを決める 切断されたら Client side broadcastを受ける echoEventが返ってきたら broadcastを送信 event名:echoでメッセージ送信 接続できたら Socket.IOで接続
  9. 9. //Express! var server = http.createServer(app);! server.listen(app.get('port'), function(){! console.log('Express server listening on port ' + app.get('port'));! });! ! //WebsocketModule! var socketIO = require('socket.io');! ! //Listener! var io = socketIO.listen(server);! ! //接続Event! var sockets = io.sockets.on('connection',function(client){! ! ! ! //echo message! client.on('echo',function(msg){! client.emit('echo',msg);! });! ! //broadcast message! client.on('broadcast',function(msg){! client.emit('broadcast',msg);! client.broadcast.emit('broadcast',msg);! });! ! //disconnect! client.on('disconnect', function() {! client.broadcast.emit('broadcast','disconnected ');! });! ! }); ! ExpressでHTTPサーバー作成 同じアドレス上にIOを作成 接続eventのCallback echo event 自分でeventnameを決める broadcast event 切断されたら Server side
  10. 10. 処理の流れ emit/sendで起動し、onで受け取る socket.emit('echo','Connection Success'); client.on('echo',function(msg){! ! client.emit('echo',msg);! });! socket.on('echo',function(msg){! ! console.log('echo : '+msg);! ! socket.emit('broadcast','user login');! }); client.on('broadcast',function(msg){! ! client.emit('broadcast',msg);! ! client.broadcast.emit('broadcast',msg);! });! socket.on('broadcast',function(msg){! ! console.log('broadcast : '+msg);! });! z client.emit > 送ってきた相手に送信 client.broadcast.emit > 送ってきた相手以外に送信 sockets.emit > 全てのクライアントに送信 z Client Server
  11. 11. socket.on('echo',function(msg){! ! console.log('echo : '+msg);! }); client.emit('echo',msg); socket.on(‘echo',function(msg,fn){! ! console.log('echo : '+msg);! ! fn('catch')! }); client.emit(‘echo’,msg,function(data){! ! console.log(data)! });! 到達確認の方法
  12. 12. Server Clients Target Worker Worker Worker Worker Worker Target Target Target Target FTP Clients Clients WSWebSocket Target Target Target Target Target Target Target Target Target Target Target Target Target Target Target リアルタイムな監視/収集のイメージ
  13. 13. Server Clients Target Worker Worker Worker Worker Worker Target Target Target Target FTP Clients Clients WSWebSocket Target Target Target Target Target Target Target Target Target Target Target Target Target Target Target DBはどこに置く? DB
  14. 14. どれだけ転送できるの?
  15. 15. ローカル環境での計測 5MB/s前後
  16. 16. • 1:n接続の場合は? • 到達確認をしない場合は? • クライアント毎のデータの保持 • Redisなどとの連携 もうすこし確認したい事
  17. 17. つづく…

×