【问题标题】:Pubsub with Node.js and Socket.io for individual users面向个人用户的带有 Node.js 和 Socket.io 的 Pubsub
【发布时间】: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


【解决方案1】:

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

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

RabbitMQ serverlibraries for Node

Rabbit MQ 提供了许多优势:

  • 只要 RabbitMQ 正在运行,客户端就可以随时发布消息。
  • 只要您需要更高的吞吐量(横向扩展),您就可以通过启动另一个应用服务器实例来轻松地确定您的服务器范围。
  • 发送到 RabbitMQ 的消息可以被持久化。
  • 可以在事务中完成向 RabbitMQ 发布消息。
  • 易于管理您的队列和交换的服务器界面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 2014-01-31
    • 2021-12-30
    • 2011-12-27
    • 2016-06-06
    • 2011-11-12
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多