我正在尝试使用nodejs和node_redis构建一个通用发布/订阅服务器,该服务器接收来自具有通道名称的浏览器的请求,并响应任何已发布该通道的数据。为此,我使用来自浏览器的长轮询请求,并在通道上收到消息时发送响应来处理这些请求。
对于每个新请求,都会创建一个用于订阅频道的对象(当且仅当它尚不存在时)。
clients = {};
//when request comes in,
clients[channel] = redis.createClient();
clients[channel].subscribe(channel);
这是处理订阅频道的最佳方式,还是有其他更直观的方式?
答案 0 :(得分:4)
我不知道您的设计是什么,但您可以在多个渠道订阅一个redis客户端(在您订阅客户端之后,您只能订阅其他渠道或在此连接中取消订阅:http://redis.io/commands/subscribe) ,因为在收到消息后,您可以获得该消息来自哪个频道的完整信息。然后,您可以将此消息分发给所有感兴趣的客户。
这对我有点帮助,因为我可以将消息类型放在通道名称中,然后从小函数中为每条消息动态选择操作,而不是为每个具有单独逻辑的通道生成单独的订阅。
在我的node.js服务器中,我只有2个redis客户端:
lpush
,sadd
等答案 1 :(得分:2)
我想指出您使用socket.io和redis一起发布有关pubsub的帖子。 Socket.io是一个非常好的库=>
How to use redis PUBLISH/SUBSCRIBE with nodejs to notify clients when data values change?
我认为设计非常简单,也应该具有很高的可扩展性。
答案 2 :(得分:1)
这对我来说似乎是一个非常合理的解决方案。你不喜欢它什么?
要记住的是,您可以在每个Redis连接上拥有多个订阅。这可能最终使您的逻辑变得复杂,这与您要求的相反。但是,在规模上这可能是必要的。每个Redis连接都相对便宜,但它确实需要文件描述符和一些内存。
答案 3 :(得分:0)
我们试图了解Redis发布/订阅(" Pub / Sub ")并且所有现有示例都已过时,过于简单或没有测试。 所以我们使用Hapi.js + Socket.io + Redis Pub / Sub示例编写了一个 完整的实时聊天!
Pub / Sub组件只有几行node.js代码: https://github.com/dwyl/hapi-socketio-redis-chat-example/blob/master/lib/chat.js#L33-L40
不是在这里粘贴它(没有任何上下文),我们鼓励你签出/尝试示例。
我们使用Hapi.js构建了它,但是来自Hapi的chat.js
文件解耦并且可以轻松与一起使用基本 node.js http服务器或快递(等)