当前位置:  开发笔记 > 编程语言 > 正文

nodeJS中的发布/订阅实现

如何解决《nodeJS中的发布/订阅实现》经验,为你挑选了1个好方法。

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

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

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



1> user717166..:

对于对象持久性,我使用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());
 })

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有