scalable node.js with redis store
DESCRIPTION
Node.js大阪勉強会 #npp02TRANSCRIPT
Scalable Node.js with Redis Store
Node.js大阪 勉強会 2014.6.14
Production Environment
本番環境
Production Environment
同時接続処理に強いNode.js
Production Environment
しかしそれなりの対応が必要
Scalable Node.js
AWSCluster
Qilin
pm2Heroku
AWSCluster
Qilin
pm2Heroku
ModuleEnvironment
AWSCluster
Qilin
pm2Heroku
Environment/Module にかかわらず 複数のプロセスが立ち上がる
Multiple Process
プロセスインスタンスが 複数発生した場合の2つの課題
Session Management
Express Default Session
$ NODE_ENV=production node app.js !Warning: connection.session() MemoryStore is not designed for a production environment, as it will leak memory, and obviously only work within a single process.
Session use LoadBalancer
ログイン管理の セッションはどうなっている?
Sticky Sessions
WebSocketは…?
WebSocket HandShake
Socket.io(と言うかWebSocket)の接続時
HTTP(S)プロトコル-> WS(S)プロトコル となり二種類のコネクションが発生する
WebSocket HandShake
複数のプロセスが存在する場合 必ず同じプロセスインスタンスに 接続できるとは限らない
結果 Socket.io handshake 失敗
DEMO
WebSocket HandShake
プロセス単体それぞれで管理を行わず プロセス間での情報共有をRedisで行う
Socket.io Event
Socket.io の プロセス間共有
Socket.io Message Sharing Scopeが問題となる
プロセスインメモリでMessageEmittingを行うため
イベントが発生する/しないという問題が発生する
プロセス単体それぞれで管理を行わず プロセス間での情報共有をRedisで行う
(2回目)
Socket.io の プロセス間共有
Redis-Server による解決
Redis
揮発性 Key-Value Store(KVS)
connect-redis
Cation
connect-redisのバージョンに注意
connect-redis >= 2.0.0 support only express >= 4.0.0. Use connect-redis 1.4.7 for express 3x.
connect-redis
Socket.io Event Emitter
use RedisStore
Socket.io の プロセス間共有
□ Socket.io 0.x系 redis store □ Socket.io 1.x系 socket.io-redis
RedisStore
□ Socket.io 0.x系 redis store □ Socket.io 1.x系 socket.io-redis
RedisStore
Oh…
□ Socket.io 0.x系 redis store □ Socket.io 1.x系 socket.io-redis
RedisStore
Koaといい Socket.io v1.0といい また新たな過渡期に 突入するわけですね
まとめ
• Multiple Process
• Session Management
• Event-Emitter Sharing
参考• Scaling real-time apps on Cloud Foundry (using Redis) [GitHub]
https://github.com/rajaraodv/redispubsub
• SNode.js + Socket.IO + pm2でデーモン化とクラスタリング
http://tomowatanabe.hatenablog.com/entry/2014/01/31/124740
• Node におけるスケールアーキテクチャ考察(Scale 編)
http://jxck.hatenablog.com/entry/20110618/1308378963
• Socket.IO or WebSocket を AmazonELB でバランスする検証
http://jxck.hatenablog.com/entry/20120228/1330444857
ご清聴ありがとうございました