質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

Q&A

解決済

1回答

2609閲覧

redisのpubsubが実装されたnodeサーバのクラスタリングについて

ricy

総合スコア48

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

0グッド

0クリップ

投稿2017/02/21 08:15

railsからpublishされたデータを
nodeサーバ内で、subscribeしています。
こちらでうまくコンソールログが出力されるのですが、
nodeサーバをpm2等でクラスタリングして起動すると、複数のコンソールログが出てしまいます。
socket.io-redis等でredisのセッションを共有出来る等、色々と調べたのですが
実現できませんでしたのでご教示いただけないでしょうか。

var cfg = require("config"); var express = require('express'); var app = express(); var server = require('http').createServer(app); var redis = require("redis") server.listen(cfg.node.port); var subscribe = redis.createClient(cfg.redis.port, cfg.redis.host); subscribe.subscribe('notifications.create'); console.log("redis sub") subscribe.on("message", function(channel, messages) { console.log("from rails to subscriber"); });

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

はい、Redisのpub/subを使った場合、1つpublishすれば、subscribeしている全クライアントに届きます。

投稿2017/02/21 08:20

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ricy

2017/02/21 08:39

ご回答ありがとうございます。 クラスタリングは負荷分散のためにしているので、subscribeをひとつのnodeに対して 行いたいという質問になります。
maisumakun

2017/02/21 08:44

具体的に、subscribeしているNodeサーバではどのような処理を行うのでしょうか(複数台あって、どのように負荷分散するか、そのあたりもお知らせいただければと思います)。
ricy

2017/02/21 14:10

ご回答ありがとうございます。 subscribe.onしたあとの後続処理は、 io.connect.emit にて、socket.ioでlistenしているクライアントにメッセージを配信しております。 railsサーバのメッセージ作成にてpublish処理をしています。 現状、nodeサーバをクラスタリングするとしたサーバの台数分メッセージが重複配信されてしまっています。どのように負荷分散するかというのは、サーバの均等にアクセスをわりふってくれればいいと考えています。
maisumakun

2017/02/21 22:22

Node側でやることが「クライアントへのemitだけ」であれば、自分でRedisのpub/subを使わなくても、socket.io-redisで連携すれば、Rails側からsocket.io-ruby-emitterでクライアントに直接emitできるようになります(Node側での処理はsocket.io-redisが自動で行ってくれます)。 それ以外の例で、つながっているクライアントごとに何かしらの処理を走らせたい場合、いったん全サーバでメッセージを受け取って、connectedなどから「自分のサーバに関係したものか」判定して処理をすすめる、という流れになります。
ricy

2017/02/22 00:26

ご回答ありがとうございます、rails側で一度socket.io-ruby-emitter使ってみたのですが、想定の動きをしなかったので、あらためてやってみます、またコメントさせていただきます!
ricy

2017/02/23 13:59

ありがとうございました、ご助言いただいた内容(socket.io-ruby-emitter)にて解決いたしました。ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問