0

我将给出我正在尝试做的事情的一个小前提。我有一个游戏概念,它需要多个玩家围坐在一张桌子旁,有点像扑克。

不同玩家之间的正常交互通过socket.io结合node js很容易处理。

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

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

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

据我了解,我需要这两个模块来完成我之前提到的事情。然而,我不明白的是,当我只需要发送一些消息时,为什么等式中有 redis。

它是用来临时存储消息的吗?

任何帮助将不胜感激。

4

4 回答 4

1

如果您只需要在外部事件之后发出,有几种方法可以实现这一点。这取决于您使用什么来获取要发送的新数据:

/*    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));
})

于 2018-04-04T01:28:59.503 回答
0

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

让我知道您的 cron 工作流程是什么,以防发布-订阅机制需要进一步的帮助。

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

于 2016-02-16T10:27:07.847 回答
0

那么在socket.io提供这些的情况下,我读到你实际上需要两者。但是,这不一定是您想要的。但是,是的,redis它可能只是用于临时存储数据,通过接近消息队列的功能,它也做得非常好。

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

不过,我的建议是在您的进程中使用一些节点包运行 cron,作为child_process其可读流的挂钩,然后直接推送到您的套接字。

于 2016-02-14T14:47:01.690 回答
-1

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

于 2017-04-28T16:41:08.637 回答