2016-09-27 16 views
8

私はpythonとノードの間のpubsubメッセンジャーとしてredisを使用してリアルタイムビジュアライゼーションを構築しています。 hmsetを使ってredisハッシュを設定するpythonスクリプトが常に実行されています。私が次のコマンド例を入力すると、アプリケーションのその側がうまくいきます: "HGETALL 'sellers-80183917'"私は適切なデータを得ることになります。ソケットioからredisデータを受け取ることができません

問題はjs側にあります。私はsocketioとredis nodejsライブラリを使ってredisインスタンスを聞き、d3js経由でオンラインで結果を公開しています。

は私がノードで次のコードを実行します。

var express = require('express'); 
var app = express(); 
var redis = require('redis'); 

app.use(express.static(__dirname + '/public')); 


var http = require('http').Server(app); 


var io = require('socket.io')(http); 
var sredis = require('socket.io-redis'); 
io.adapter(sredis({ host: 'localhost', port: 6379 })); 



redisSubscriber = redis.createClient(6379, 'localhost', {}); 


redisSubscriber.on('message', function(channel, message) { 
    io.emit(channel, message); 
}); 



app.get('/sellers/:seller_id', function(req, res){ 
    var seller_id = req.params.seller_id; 
    redisSubscriber.subscribe('sellers-'.concat(seller_id)); 


    res.render('seller.ejs', { seller:seller_id }); 
}); 


http.listen(3000, '127.0.0.1', function(){ 
    console.log('listening on *:3000'); 
}); 

をそして、これはユーザの要求を受信し、すなわち出力だseller.ejsファイルの関連部分である:

 var socket = io('http://localhost:3000'); 
     var stats; 
     var seller_key = 'sellers-'.concat(<%= seller %>); 
     socket.on(seller_key, function(msg){ 
      stats = []; 
      console.log('Im in'); 
      var seller = $.parseJSON(msg); 
      var items = seller['items']; 
      for(item in items) { 
       var item_data = items[item]; 
       stats.push({'title': item_data['title'], 'today_visits': item_data['today_visits'], 'sold_today': item_data['sold_today'], 'conversion_rate': item_data['conversion_rate']}); 
      } 
      setupData(stats); 
     }); 

問題をsocket_on()メソッドは何も受け取っていないし、問題がどこにあるのかわからないので、これ以外にはすべてが正常に動作しているようです。

答えて

1

RedisのPub/Subが実際にどのようなものか混乱するかもしれないと思います。 ではないハッシュの変更を聞く方法。 チャネルsellers-1とし、ハッシュとキーsellers-1を含めることができますが、それらは互いに関係ありません。文書化hereとして

パブ/サブは、鍵空間とは関係ありません。

keyspace notificationsと呼ばれるものがあり、キー空間の変更を(Pub/Subチャンネルを介して)聞くのに使用できます。ただし、この機能はデフォルトで有効になっていません。これは、より多くのリソースを使用するためです。

HMSETの後にメッセージを公開する方が簡単な方法かもしれません。そのため、ハッシュが変更されたことをすべてのサブスクライバが知っていることになります(ハッシュコンテンツ自体を取得するか、公開メッセージに関連するデータが含まれます)。

これにより、次の問題が発生します.1つのサブスクライバ接続(redisSubscriber)しかありません。

Node.js Redisドライバからわかっていることから、このような接続で.subscribe()を呼び出すと、以前のサブスクリプションがすべて削除され、新しいサブスクリプションが削除されます。したがって、以前にsellers-1チャンネルに登録してsellers-2に登録していた場合、sellers-1チャンネルからのメッセージはもう受信されません。あなたは、または引数として渡すことにより、チャンネルの配列を渡すか、複数のチャネル上で聞くことができ

は:

redisSubscriber.subscribe([ 'sellers-1', 'sellers-2', ... ]) 
// Or: 
redisSubscriber.subscribe('sellers-1', 'sellers-2', ...) 

あなたは明らか各「アクティブ」売り手のサブスクリプションを追跡する必要があります。どちらか、それとも理想的ではない各サブスクリプションのための新しい接続を作成します。

売り手ごとに別々のチャンネルではなく、すべての変更が公開される単一のPub/Subチャンネルを持つことをお勧めします。

最後に、売り手IDが推測するのが困難でない場合(例えば、増分の整数値に基づいている場合)、誰かが誰にでも聞くことができるクライアントを書くことは自明であろう彼らが望む売り手チャネル。それは問題ではないかもしれませんが、です。

関連する問題