2024.11.14
いまさらNode.jsを知ろう~環境構築も~
2018.02.19
プログラミングマルチスレッドなSocket.ioでのRedis pub/subはsocket.io-emmiterを使おう
坂東です。
以前に、Redisのpub/sub機能を使ってRailsとsocket.ioと連携させるという、記事を書きました。
スケールアウトしようとしようとNode.jsにCluster入れてマルチスレッドにしたら問題発生。
Redisからpub/subしたときに、各workerが個別に反応する。
1つのアクションにつき4つ通知が発生するという困った状態になりました。
worker間で通知の状況を共有するとか、手を抜いてmasterだけ通知を出すようにするか。
考えてたところ、「socket.io-emmiter」というのがそこらへんうまくやってくれるとの情報を得ました。
Railsの生pub/subしてるコードを、
json = ActiveSupport::JSON.encode({ ‘channel’ => ‘チャンネルA’, ‘event’ => ‘イベント1’, ‘message’ => ‘メッセージ’, }) Redis.current.publish(‘REDIS_SUB’, json)
socket.io-emitterに書き換えます。
Gemfile gem 'socket.io-emitter' emmiter = SocketIO::Emitter.new(Redis.new) emmiter.to( 'チャンネルA' ).emit('イベント1', 'メッセージ')
通知が多重に発生するようなことはなくなりました。
worker間で通知の状況を共有するとか、手を抜いてmasterだけ通知を出すようにするとか、うまくやってくれてるんでしょう。
おわり。
【記事への感想募集中!】
記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!【テクノデジタルではエンジニア/デザイナーを積極採用中です!】
下記項目に1つでも当てはまる方は是非、詳細ページへ!Qangaroo(カンガルー)
【テクノデジタルのインフラサービス】
当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
タグ検索