使用Node.js和Redis(node_redis)实现发布订阅功能

4
我正在尝试使用Node.js和node_redis构建一个通用的发布/订阅服务器,该服务器从浏览器接收带有特定频道名称的请求,并响应已发布到该频道的任何数据。为此,我使用来自浏览器的长轮询请求,并通过在通道上接收到消息时发送响应来处理这些请求。
对于每个新请求,只有在它不存在时才会创建一个用于订阅该频道的对象。
clients = {};

//when request comes in,
clients[channel] = redis.createClient();
clients[channel].subscribe(channel);

这是处理订阅频道的最佳方式吗?还是有其他更直观的方法?


https://dev59.com/am855IYBdhLWcg3wQx9L#4446178 - Shripad Krishna
4个回答

4
我不知道你的设计是什么,但是你可以通过一个Redis客户端订阅多个频道(在客户端订阅后,你只能在此连接中订阅其他频道或取消订阅:http://redis.io/commands/subscribe),因为在收到消息后,你有完整的信息来自哪个频道。然后你可以将这条消息分发给所有感兴趣的客户端。
这对我有所帮助,因为我可以将消息类型放在通道名称中,然后从小函数中动态选择每个消息的操作,而不是为每个通道生成单独的订阅和单独的逻辑。
在我的node.js服务器内,我只有两个Redis客户端:
1.用于所有标准操作的简单客户端- lpush、sadd等等。 2.订阅客户端-监听订阅的频道上的消息,然后使用第一个Redis客户端将这些消息分发到所有会话(作为每种频道类型的集合存储)。

我真的很感激这个解决方法,对我来说正是时候,谢谢! - felipekm

2

我一直在考虑从长轮询切换到socket.io。唯一的问题是,我正在将该项目作为我的学士论文完成,我有点担心学习和实现socket.io会导致时间限制。 - Awemo
1
使用socket.io,io会为您节省时间而不是浪费时间。Socket.io真的很好!! - Alfred

1

对我来说,这似乎是一个相当合理的解决方案。你不喜欢它的哪些方面呢?

需要记住的一点是,您可以在每个Redis连接上拥有多个订阅。这可能会使您的逻辑变得更加复杂,这与您所要求的相反。但是,在规模上可能是必要的。每个Redis连接相对便宜,但确实需要文件描述符和一些内存。


并不是说我不喜欢它,只是在想是否有更好的解决方案。例如,仅在一个频道上进行监听,并使用模式发布和订阅该频道,其中模式代表不同的频道。 - Awemo
当然可以使用psubscribe订阅通配符频道名称。 - Matt Ranney

0

完整 Redis Pub/Sub 示例(使用 Hapi.js 和 Socket.io 实现实时聊天)

我们想要理解 Redis Publish/Subscribe ("Pub/Sub") ,但发现现有的示例要么过时,要么过于简单,或者没有测试。 因此,我们编写了一个完整的实时聊天应用,使用 Hapi.js + Socket.io + Redis Pub/Sub,并且还进行了端到端测试

https://github.com/dwyl/hapi-socketio-redis-chat-example

Build Status Test Coverage Code Climate Dependency Status devDependency Status

Pub/Sub 组件只需要几行 node.js 代码: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40

我们鼓励您查看/尝试示例,而不是在此处粘贴它(没有任何上下文)。

我们使用 Hapi.js 构建了它,但 chat.js 文件与 Hapi 解耦,可以轻松地与基本的 node.js http serverexpress(等等)一起使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接