3

我想通过使用 pubsub 在 Node.js/socket.io 环境中为特定用户收集通知来检查我是否掌握了正确的知识。

这是我的设置:

  • 主应用程序是在 Codeigniter 上用 PHP 编写的。Auth 使用 Ion_Auth 处理 CI(会话等)
  • 实时(目前只是通知)由 Node.js 和 Socket.io 处理
  • 经过身份验证的用户可以邀请朋友加入“群组” - 如果被邀请者已经拥有帐户,则邀请将发送电子邮件和内部通知
  • 经过身份验证的用户可以发表评论,对共享内容执行操作。两者都会向该内容的所有订阅用户发出通知。

我相信处理这个问题的正确方法是让每个用户订阅一个通知频道。此频道包含每个用户的每个通知,每当我们执行上述操作之一时,都会通过发布事件将其推送到频道。然后订阅会检查此频道以获取与用户会话相关的特定数据,即:

  • 对于与邀请相关的通知,已发布的事件将包含一些唯一标识用户数据,我们将对其进行检查。
  • 对于与特定内容相关的通知,我们将检查包含该内容标识标记的已发布事件的频道。

这是正确的方法吗?我对 socket.io、node.js 和 pubsub 还很陌生,但这对我来说似乎很有意义。让我感到困惑的是,我们应该将事件推送给客户端,而不是客户端从服务器拉取事件。这个解决方案似乎两者兼而有之。

如果有更简单的解决方案(即 socket.io 更原生的解决方案),我将不胜感激。在教程或示例中,我真正能找到的只是一遍又一遍地写相同的聊天客户端……

编辑:或者,将所有连接的客户端 id 与其相应的用户 id 一起维护是否更实用,然后当有新消息进入时,使用该消息将该消息发送到特定客户端var socket = hash[userID]; socket.emit(message);

有人对这种情况下的潜在瓶颈有任何想法吗?该站点可能有成千上万的并发用户正在更新多个事件。

4

1 回答 1

0

我建议不要自己实施 PubSub。我必须进行一次这种广播,并使用 RabbitMQ 来处理连接和路由(包括广播)。

使用反向 Ajax 调用(长期保持的 http 连接,请参阅Comet on Wikipedia)向浏览器发送实时消息

请参阅RabbitMQ 服务器Node 库

Rabbit MQ 提供了许多优势:

  • 只要 RabbitMQ 正在运行,客户端将始终能够发布消息。
  • 只要您需要更高的吞吐量(横向扩展),您就可以通过启动另一个应用程序服务器实例来轻松地确定您的服务器范围。
  • 发送到 RabbitMQ 的消息可以被持久化。
  • 可以在事务中完成向 RabbitMQ 发布消息。
  • 简单的服务器界面来管理您的队列和交换。
于 2014-10-06T21:07:04.127 回答