2024.11.14
いまさらNode.jsを知ろう~環境構築も~
2016.01.06
プログラミングRailsとnode.jsを連携させる
GTラボ坂東です。
websocket_railsを諦めました。
動作はするんですけどしばらく経つとサーバーが落ちる。
エラーをググるとここにたどり着きました。
https://github.com/websocket-rails/websocket-rails/issues/231
websocket_rails 0.7.0 のstandaloneモードにバグが有るらしい。
0.6.2に落としたけどビルド通らない。
関連gemのfaye_websocketのバージョンを色々組み合わせてもビルド通らない。
EC2で動かすにはstandalone必須のようで、避けて通れない。
http://qiita.com/chiku_/items/9a7263ab10c83c489dbe
納期が迫り治す時間も調査する時間もなく、僕はwebsocket_railsを諦めました。
使い慣れたnode.jsの出番です。
「socket.io node.js」でググッて1時間ぐらいでチャットサーバー構築できた。
javascriptの実装はWebSocketRailsをioに置き換えたら1時間ぐらいで終わった。
初めからnode.jsを選んでおけばよかった。
Railsサーバーからチャット送信はどうするかな。
WebSocketRailsはその機能があって便利だった。
faye_websocket::Clientを使うとサーバーがsocket.ioに接続して通知できるそうだけど、重そうだしなんだか気持ち悪い。
https://github.com/faye/faye-websocket-ruby
node.jsでマルチスレッド間の連携に「Redisのpub/sub」という「Redis経由でブロードキャスト」的な機能を使っているとのことで、それを真似することに。
https://blog.dakatsuka.jp/2011/06/19/nodejs-redis-pubsub.html
rails側の実装はこんな感じ。
json = ActiveSupport::JSON.encode({
‘channel’ => ‘チャンネルA’,
‘event’ => ‘イベント1’,
‘message’ => ‘メッセージ’,
})
Redis.current.publish(‘REDIS_SUB’, json)
node.js側の実装はこんな感じ。
var chat = io.sockets.on(‘connection’, function(socket) {・・・
// ※socket.ioの実装は省略var subscriber = require(‘redis’).createClient(REDIS_PORT, REDIS_SERVER);
subscriber.subscribe(‘REDIS_SUB’);
subscriber.on(‘message’, function(channel, message) {
json = JSON.parse(message)
chat.to(json.channel).emit(json.event, json.message);
});
RailsでRedisに書き込むと、node.jsのsubscriberイベントがキックされるという動き。
1時間ぐらいで組み換え終わった。
初めからnode.jsを選んでおけばよかった。
おわり。
【記事への感想募集中!】
記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!【テクノデジタルではエンジニア/デザイナーを積極採用中です!】
下記項目に1つでも当てはまる方は是非、詳細ページへ!Qangaroo(カンガルー)
【テクノデジタルのインフラサービス】
当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
タグ検索