繁体   English   中英

nodeJS中的发布/订阅实现

[英]Pub/sub implementation in nodeJS

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

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

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

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

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

您不需要在发送的消息中存储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); > });

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

var store = redis.createClient();
var subscriber= redis.createClient()

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

我用Faye.js。 严重的是我能找到的最简单的pub / sub实现。 也许这会有所帮助!

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

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

https://github.com/maccman/juggernaut

FYI Socket.io v0.7将支持通道,并应简化现有代码(不再有pub / sub lib依赖项)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM