我想检查一下我是否掌握正确的方法,可以使用pubsub来收集Node.js / socket.io环境中特定用户的通知。

这是我的设置:

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

  • 我相信处理此问题的正确方法是为每个用户订阅一个通知通道。此通道包含每个用户的每条通知,只要我们执行上述任一操作,就会通过发布事件将其推送到该通道。然后,订阅检查此通道以查找与用户 session 有关的特定数据,即:
  • 对于与邀请有关的通知,发布的事件将包含一些唯一标识的用户数据,我们将进行检查。
  • 以获取与特定内容有关的通知,我们将检查通道中是否有包含该内容标识标记的已发布事件。

  • 这是正确的方法吗?我对socket.io,node.js和pubsub相当陌生,但这对我来说似乎很有意义。让我烦恼的部分是,我们应该将事件推送到客户端,而不是客户端从服务器提取事件。此解决方案似乎兼有。

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

    编辑:另外,维护所有连接的客户端ID以及它们对应的用户ID的哈希值是否更实际,然后在收到新消息时,使用var socket = hash[userID]; socket.emit(message);将消息发送到特定客户端

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

    最佳答案

    我建议不要自己实现PubSub。我不得不做一次这样的广播,并使用RabbitMQ来处理连接和路由(包括广播)。

    使用反向Ajax调用完成到浏览器的实时消息传递(长时保持http连接,请参阅Comet on Wikipedia)

    参见RabbitMQ serverlibraries for Node

    Rabbit MQ具有许多优点:

  • 只要RabbitMQ正在运行,客户端就始终可以发布消息。
  • 只要需要更多吞吐量(横向扩展),就可以通过启动应用程序服务器的另一个实例来轻松调整服务器的范围。
  • 发送到RabbitMQ的消息可以保留。
  • 将消息发布到RabbitMQ可以在事务内完成。
  • 简单的服务器界面来管理您的队列和交换。
  • 09-25 18:28
    查看更多