Socket.ioの機能で、
接続を共有するためのバックエンドを差し替えられるようになっていて、
その実装の一つとしてRedisのPub/Sub機能を利用することができるようです。
https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO
(デフォルトはMemoryStoreになっているので、同一のプロセス内でしか接続を共有できない)
これを利用すると、接続を共有するためのコードを
ビジネスロジックに直接記述せずに、
設定コードとして分離できるという利点があるでしょうか。
var RedisStore = require('socket.io/lib/stores/redis')
, redis = require('socket.io/node_modules/redis')
, pub = redis.createClient()
, sub = redis.createClient()
, client = redis.createClient();
// 接続を共有するためのコードは
// ここに記述(socket.ioの設定)
io.set('store', new RedisStore({
redisPub: pub
, redisSub: sub
, redisClient: client
}));
io.sockets.on('connection', function(socket) {
// ここにアプリにとって主要なビジネスロジックを
// 記述することになると思いますが、
// 複数サーバーでメッセージを共有するための
// コードはここでは書かなくてすむようになっています。
//
// 「メッセージをどうやって共有するか」は意識せずに、
// 「メッセージを受け取ったときに何をするか」
// にフォーカスしたコードになると思います。
socket.on('message', function(message) {
socket.broadcast.send('foo');
});
});
質問の意図には合ってましたでしょうか?
RedisのPub/Subを利用することには変わりありませんが、
・自分で接続を共有する仕組みを書くか
・Socket.ioの設定を利用してアプリではビジネスロジックにフォーカスするか
の違いになるのではないでしょうか。
※あと、紹介したブログの記事のURLが今見たら変更されてましたね。
現在は下記URLで見れるようです。
http://www.ranu.com.ar/post/50418940422/redisstore-and-rooms-with-socket-io
On Thursday, July 25, 2013 7:48:15 PM UTC+9, 遠州律夫 wrote:
>
>
>
> 2013年5月31日金曜日 9時24分15秒 UTC+9 Hiroshi Kuwabara:
>>
>> はじめまして、桑原と申します。
>>
>> Stack Overflowのこの投稿が参考になるかもしれません。
>>
>> http://stackoverflow.com/questions/9267292/examples-in-using-redisstore-in-socket-io
>>
>> 質問文中で引用されていますが、
>> 複数サーバー間でsocket.ioの接続を共有する方法としてRedisStoreを使用した例が
>> こちらのブログに載っています。
>> http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html
>>
>> ご参考まで。
>>
>>
>> On Wednesday, May 29, 2013 5:53:06 PM UTC+9, 遠州律夫 wrote:
>>>
>>> こんにちは。3.14Pです。
>>> いま、socket.ioでチャットを作っていて、
>>> ユーザリストを変数に入れてるのですが、
>>> 複数のサーバーで共有する時は、どうやってすれば良いですか?
>>> それと、socket.ioサーバーを9000でリッスンしてますが、
>>> スケールアウト時の注意点等はありますか?
>>>
>>
>
> 返信すごく遅れてスイマセン。
> これって、RedisStoreで、スケールアウトするためのものですか?
> あまり英語はよくわからないんですけど、
>
> var pub = redis.createClient();
> pub.publish("messages", JSON.stringify({type: "foo", content: "bar"}));
> io.sockets.on("connection", function(socket) {
> var sub = redis.createClient();
> sub.subscribe("messages");
> sub.on("message", function(channel, message) {
> socket.send(message);
> }); socket.on("disconnect", function() {
> sub.unsubscribe("messages"); sub.quit();
> });
> });
>
> このようなPub・Subを使ったものと何が違うんですか?
>
>
--
---
このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、[email protected] にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。