我想检查我是否正确掌握了使用 pubsub 为 Node.js/socket.io 环境中的特定用户收集通知的方法。
这是我的设置:
- 主要应用程序是在 Codeigniter 上用 PHP 编写的。 Auth 使用 Ion_Auth 处理 CI( session 等)
- 实时(目前只有通知)由 Node.js 和 Socket.io 处理
- 经过身份验证的用户可以邀请 friend 加入“群组”——如果受邀者已有帐户,邀请将同时发送电子邮件和内部通知
- 经过身份验证的用户可以发表评论,对共享内容执行操作。两者都会向该内容的所有订阅用户发出通知。
我认为处理此问题的正确方法是为每个用户订阅一个通知 channel 。该 channel 包含每个用户的每个通知,只要我们执行上述操作之一,就会通过发布事件将其推送到 channel 。订阅然后检查此 channel 以获取与用户 session 相关的特定数据,即:
- 对于与邀请相关的通知,已发布的事件将包含一些唯一标识用户的数据,我们会对此进行检查。
- 对于与特定内容相关的通知,我们会检查 channel 中是否包含包含该内容的识别标记的已发布事件。
这是正确的做法吗?我是 socket.io、node.js 和 pubsub 的新手,但这对我来说似乎很有意义。让我感到困惑的部分是,我们应该将事件推送给客户端,而不是客户端从服务器拉取事件。这个解决方案似乎可以同时实现。
如果有更简单的解决方案(即更适合 socket.io 的解决方案),我将不胜感激。我在教程或示例中真正能找到的就是一遍又一遍地写相同的聊天客户端...
编辑:或者,维护所有连接的客户端 ID 及其相应用户 ID 的散列是否更实用,然后在收到新消息时,将该消息发送给特定客户端使用var socket = hash[userID]; socket.emit(消息);
有人对这种情况下的潜在瓶颈有任何想法吗?该站点可能有成千上万的并发用户正在更新有关多个事件的信息。
最佳答案
我建议不要自己实现 PubSub。我不得不进行一次这种广播,并使用 RabbitMQ 处理连接和路由(包括广播)。
到浏览器的实时消息传递是使用反向 Ajax 调用完成的(长时间保持 http 连接,请参阅 Comet on Wikipedia)
参见 RabbitMQ server和 libraries for Node
Rabbit MQ 提供了许多优势:
- 只要 RabbitMQ 正在运行,客户端就始终能够发布消息。
- 只要您需要更高的吞吐量(横向扩展),您就可以通过启动应用程序服务器的另一个实例来轻松确定服务器的范围。
- 发送到 RabbitMQ 的消息可以持久化。
- 可以在事务内将消息发布到 RabbitMQ。
- 用于管理队列和交换的简单服务器界面。
关于javascript - 面向个人用户的带有 Node.js 和 Socket.io 的 Pubsub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15617101/