Node JS Socket.IO Emitter(和redis)

时间:2016-02-14 12:58:55

标签: node.js redis socket.io socket.io-1.0 socket.io-redis

我会给出一个小小的前提,即我要做的事情。我有一个游戏概念,需要多个玩家坐在桌子周围,有点像扑克。

不同播放器之间的正常交互很容易通过socket.io与节点js一起处理。

我很难搞清楚的是;我有一个cron作业,它在另一个进程中运行,每分钟获取新信息,然后需要发送给每个玩家。由于这是一个不同的过程,我不确定如何向某些客户发送此信息。

socket.io确实有这方面的信息,我在下面引用它:

  

在某些情况下,您可能希望从Socket.IO进程的上下文之外向Socket.IO命名空间/房间中的套接字发出事件。   有几种方法可以解决这个问题,比如实现自己的通道将消息发送到进程中。   为了方便这个用例,我们创建了两个模块:   socket.io,Redis的   socket.io极 - 发射极

根据我的理解,我需要这两个模块来做我之前提到的。然而,我不明白为什么当我只需要发送一些消息时,redis就在等式中。

用于暂时存储消息吗?

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:0)

socket.io提供这些内容的情况下,我读到你确实需要两者。然而,这不一定是你想要的。但是,redis可能只是暂时用来存储数据,它也可以通过接近消息队列的功能来做好工作。

您的cron现在不需要消息队列或类似行为。

我的建议是将cron与你的进程中的一些节点包一起作为child_process钩子运行到它的可读流上,然后直接推送到你的套接字。

答案 1 :(得分:0)

如果cron作业进程也是nodejs进程,则可以通过redis.io pub-sub客户端机制交换数据。

让我知道你的cron工作流程是什么,以及如果pub-sub机制需要进一步的帮助..

redis是socket.io使用的内存存储之一(如果你配置)

答案 2 :(得分:0)

如果您只需要在外部事件之后发射,有几种方法可以实现此目的。这取决于您用于获取要发送的新数据的内容:

/*    if the other process is an http post incoming you can use for example
 express and use your io object in a custom middleware : */

//pass the io in the req object
app.use( '/incoming', (req, res, next) => {
      req.io = io;
})  

//then you can do : 

app.post('/incoming', (req, res, next) => {
   req.io.emit('incoming', req.body);
   res.send('data received from http post request then send in the socket');
})

//if you fetch data every minute, why don't you just emit after your job : 

var job = sheduledJob('* */1 * * * *', io => {
    axios.get('/myApi/someRessource').then(data => io.emit('newData', data.data));
})

答案 3 :(得分:-1)

只有在具有多服务器配置(群集)以在这些node.js实例之间建立连接和空间/命名空间同步时,才必须使用redis。在这种情况下,它与存储数据无关,它可以作为一个发布/子机器。