【发布时间】:2013-03-15 01:40:23
【问题描述】:
我想通过使用 pubsub 在 Node.js/socket.io 环境中为特定用户收集通知来检查我是否掌握了正确的知识。
这是我的设置:
- 主应用程序是用 PHP 在 Codeigniter 上编写的。身份验证使用 Ion_Auth 处理 CI(会话等)
- 实时(目前只是通知)由 Node.js 和 Socket.io 处理
- 经过身份验证的用户可以邀请朋友加入“群组” - 如果被邀请者已经拥有帐户,则邀请将发送电子邮件和内部通知
- 经过身份验证的用户可以离开 cmets,对共享内容执行操作。两者都会向所有订阅该内容的用户发送通知。
我相信处理这个问题的正确方法是让每个用户订阅一个通知频道。该频道包含每个用户的每个通知,只要我们执行上述操作之一,就会通过发布事件将其推送到频道。然后订阅会检查此频道以获取与用户会话相关的特定数据,即:
- 对于与邀请相关的通知,已发布的事件将包含一些唯一标识用户数据,我们会对其进行检查。
- 对于与特定内容相关的通知,我们会检查频道中是否包含包含该内容的识别标记的已发布事件。
这是正确的做法吗?我对 socket.io、node.js 和 pubsub 还很陌生,但这对我来说似乎很有意义。让我感到困惑的是,我们应该将事件推送给客户端,而不是客户端从服务器拉取事件。这个解决方案似乎两者兼得。
如果有更简单的解决方案(即更原生于 socket.io 的解决方案),我将不胜感激。在教程或示例中,我真正能找到的只是一遍又一遍的相同聊天客户端写...
编辑: 或者,将所有连接的客户端 ID 与其相应的用户 ID 一起维护一个哈希值是否更实用,然后当有新消息进入时,使用该消息将该消息发送到特定客户端var socket = hash[userID]; socket.emit(message);
有人对这种情况下的潜在瓶颈有任何想法吗?该网站可能有成千上万的并发用户正在更新多个事件。
【问题讨论】:
-
您是否过度设计了这个解决方案?您可以为此使用套接字 io,但是,我将从单个用户的角度评估这些事件的频率,以及这是否需要基于实时订阅的实现。
-
我可能在这个阶段过度工程,但是使用 socket io 让我可以灵活地在未来添加实时聊天等功能。我担心使用基于间隔的 GET 之类的东西,因为从每个连接的用户触发 AJAX 命令的开销,我可以看到服务器很快就用完了线程......
标签: javascript php node.js socket.io publish-subscribe