you21979の日記

実験ネタとか。仮想化とかnodejsで嵌った所とかおもしろかったところとかいろいろ

websocket + node.js + node-http-proxyで負荷分散

websocketでググルとsocket.ioばかりヒットするがブラウザの対応がまちまちなことによる一過性の技術だとおもうので使わない方針

WorlizeのwebsocketがActionScript3版のライブラリも用意しててブラウザ使わないならよさそう
https://github.com/Worlize/WebSocket-Node

あまりまとまった記事がなかったので書くがwebsocketはロードバランサと相性がわるい
L4のロードバランサであるLVSを使うか(MYSQLにも対応できる、基本的になんにでも対応できる)
node-http-proxyやnginxのwebsocket対応L7ロードバランサを使うしかない
単なるL7のプロキシやロードバランサではupgradeヘッダ削られるので大抵うごかない

node-http-proxy使う場合アクセス元のリモートホストがプロキシの立ち上がるサーバーになるので
X-Forwarded-ForをHTTPヘッダに追加してくれる
websocket側でそれを使おうとおもったらhttpヘッダ使えるところはon('request')だけのようでしばらくなやんでたが
ソースコードを眺めてたら内部でX-Forwarded-Forの値をremoteaddressに突っ込んでた↓
https://github.com/Worlize/WebSocket-Node/blob/master/lib/WebSocketRequest.js#L153
勝手にやっててくれたので悩み損であった

websocketで負荷分散するならLVS or node-http-proxyをフロントに置きredisをバックエンドに置くのがしばらく鉄板なようだ

redisはリアルタイム通信をpub/subでnode.js間のデータをやりとりし個別ユーザーの通信が切れたときに
別のサーバーにつなぎ変わったらredisをKVSとしてデータをロードする
そのときはクッキーの値とか通常のWEBアプリと同様に処理すればよいと思う