nodeJS中的Pub / Sub实现

我一直在玩nodeJS的不同发布/订阅实现,并想知道哪一个最适合特定的应用。 应用程序的要求涉及多通道,多用户3D环境中对象的实时同步。

我开始使用socket.io,创build了一个基本的通道数组,当用户发送消息时,它通过该通道中的用户循环,并向用户的客户端发送消息。 这工作得很好,我没有问题。

对于对象持久性,我使用node_redis添加了对Redis的支持。 然后,我用Redis pub / sub作为抽象层,将通道数组上的client.send循环replace掉了。 但是我注意到我需要为订阅的每个用户创build一个新的Redis客户端。 我仍然需要存储socket.io客户端信息发送消息发布。 这是多大的可扩展性? 还有其他(更好的)实现还是我可以进一步优化? 你会怎么做?

对于对象持久性,我使用node_redis添加了对Redis的支持。 然后,我用Redis pub / sub作为抽象层,将通道数组上的client.send循环replace掉了。 但是我注意到我需要为订阅的每个用户创build一个新的Redis客户端。 我仍然需要存储socket.io客户端信息发送消息发布。 这是多大的可扩展性? 还有其他(更好的)实现还是我可以进一步优化? 你会怎么做?

是的,您必须为每个请求创build一个新的redis客户端。 它很重,不可扩展。 但是创build一个新的redis客户端连接不会消耗太多内存。 所以如果你的系统用户数不超过5000,那么就没问题。 要扩展你可以添加从属redis服务器来解决繁重的发布和订阅,如果你担心创build大量的连接,那么你可以增加你的操作系统uLIMIT。

您不需要在发送的消息中存储socket.io客户端。 一旦redis收到订阅的频道消息。 它将发送消息到特定的io客户端。

subscribe.on("message",function(channel,message) { var msg = { message: [client.sessionId, message] }; buffer.push(msg); if (buffer.length 15) buffer.shift(); client.send(msg); > }); 

订阅多频道。 我build议你预先存储多个频道的所有用户(你可以使用存储Mongodb或Redis)。

 var store = redis.createClient(); var subscriber= redis.createClient() store.hgetall(UID, function(e, obj){ subscriber.subscribe(obj.ChannelArray.toArray()); }) 

我使用Faye.js。 严重的是我能find的最简单的pub / sub实现。 也许这将有助于!

试着看看关于redis pub / sub和socket.io的这个问题。

或者你可以尝试juggernaut。 它使用socket.io + redis pub中间件+ node.js. 支持所有的运输。 它可以帮助你处理所有的频道订阅或在客户端和Redis之间发布。 Juggernaut是可扩展的,但只关心在Redis上的开销,它不支持身份validation(你可以做一些技巧)。 不过,redis可以每秒写入/读取大于150 k的数据,所以对于您的情况应该没有问题。

https://github.com/maccman/juggernaut

FYI的Socket.io v0.7将支持渠道,并应简化您现有的代码(没有更多的酒吧/子库依赖项)

请参阅: http : //cl.ly/0B0C3f133K1m3j422n0K