当前位置: 首页 > 面试题库 >

nodeJS中的发布/订阅实现

朱宇航
2023-03-14
问题内容

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

我从使用socket.io开始,创建了一个基本的通道数组,当用户发送消息时,它遍历该通道中的用户并将消息发送到用户的客户端。这很好用,我对此没有任何问题。

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


问题答案:

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

是的,您必须为每个io请求创建一个新的redis客户端。它很重,无法扩展。但是,创建新的Redis客户端连接不会占用太多内存。因此,如果您的系统用户数不超过5000,则可以。要扩展规模,您可以添加从属Redis服务器来解决繁重的发布和订阅,如果您担心创建大量连接,则可以增加OS
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); > });

订阅多频道。我建议您使用一个以上的频道预存储所有用户(可以使用存储Mongodb或Redis)。

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

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


 类似资料:
  • 简介 Redis 的列表类型键可以用来实现队列,并且支持阻塞式读取,所以 Redis 能够非常容易的实现一个高性能的优先队列。同时在更高层面上,Redis 还支持“发布/订阅”的消息模式,可以基于此构建一个聊天系统。 发布示例 发布(Publish)即将消息发布到频道中。示例代码: // 发送消息 Redis::publish('chan-1', 'Hello, World!'); // 发送消息

  • 问题内容: 我正在尝试使用nodejs和node_redis构建一个通用的发布/订阅服务器,该服务器接收带有通道名称的浏览器的请求,并以该通道也已发布的任何数据作为响应。为此,我使用了来自浏览器的长轮询请求,并通过在通道上收到消息时发送响应来处理这些请求。 对于每个新请求,都会创建一个对象来订阅该频道(如果且仅当该频道不存在时)。 这是处理订阅渠道的最佳方法,还是还有其他更直观的方法? 问题答案:

  • 主要内容:发布/订阅流程,常用命令汇总,基本命令应用Redis PubSub 模块又称发布订阅者模式,是一种消息传递系统,实现了消息多播功能。发布者(即发送方)发送消息,订阅者(即接收方)接收消息,而用来传递消息的链路则被称为  channel。在 Redis 中,一个客户端可以订阅任意数量的 channel(可译为频道)。 消息多播:生产者生产一次消息,中间件负责将消息复制到多个消息队列中,每个消息队列由相应的消费组进行消费,这是分布式系统常用的

  • 发布/订阅 消息顺序 当使用 pub/sub API的时候,你需要做一个决定:那就是对于来自同一个连接的消息是应该按顺序处理还是应该并行处理。 按顺序处理意味着你不需要关心线程安全,并且保持了事件的顺序;消息会以完全相同的顺序接收处理(通过队列),因此,这意味着消息能够被相互延迟。 另外一种选择是并发处理。使用并发处理 不能保证 工作处理的有序性,并且你的代码要对并行消息完全负责确保它不会破坏内部

  • 发布和订阅 Meteor 服务端可以通过Meteor.publish发布文档集,同时客户端可以通过Meteor.subscribe订阅这些发布。 任何客户端订阅的文档都可以通过find方法进行查询使用。 默认情况下,每个新创建的 Meteor 应用包含有 autopublish 包,它会自动为每个客户端发布所有可用的文档。 为了可以更细化的控制不同客户端所接收的数据文档,首先应该在终端移除 aut

  • Redis 通过 PUBLISH 、 SUBSCRIBE 等命令实现了订阅与发布模式, 这个功能提供两种信息机制, 分别是订阅/发布到频道和订阅/发布到模式, 下文先讨论订阅/发布到频道的实现, 再讨论订阅/发布到模式的实现。 频道的订阅与信息发送 Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端