【问题标题】:performance of real time chatting techniques实时聊天技术的表现
【发布时间】:2021-05-16 10:43:14
【问题描述】:

我为我的课程分配了实现聊天应用程序 (1:1) 的任务。在各种选项中,我使用 SSE 进行实时聊天。从示例项目中,我能够实现两个人之间的非持久聊天客户端。在每个示例中,他们使用 js objectarray 来存储 res 对象并通过迭代它们将事件发送给特定用户。但是在实现实时聊天应用程序时,用户可能会急剧增加所以不是很好地耗尽服务器资源。

我发现了其他一些实现相同目标的方法 功能但不确定性能

  1. SSE+setInterval

    • 我使用redisQueue 将离线消息推送给用户。
    • 当用户建立连接时,将所有未读聊天推送到客户端。
    • 当客户端与服务器建立连接时,此过程会立即发生。
      1. 我在这里遇到了一些问题,因为我无法实时触发消息(当两个用户都在线时)。
      2. 所以我使用setInterval 以1秒的时间间隔进行实时通信,并编写了一个回调函数来检查队列是否为空,否则从队列中弹出消息并作为事件发送给用户。
      3. 上述解决方案会影响性能吗?因为我为每个连接的用户 x 1 秒间隔调用该函数。
  2. 长轮询

    • 在长轮询中,如何找到用户的新消息并完成请求?
    • 仍然在这里 setInterval 应该在服务器端使用,但性能呢?
  3. 网络套接字

    • websockets 中,我们有一个唯一的ID 可以在客户端池中找到客户端,因此我们可以在事件发生时将消息转发给特定用户。
    • 仍然websockets 使用一些乒乓机制使连接保持持久,但资源利用率非常低,因为它们是数据相对较小的网络调用并且异步处理,因此不会浪费服务器资源。

问题

  1. 如何仅在新消息到达特定用户时触发res.write
  2. 当用户增加时,SSE+setInterval 或 longpolling+setInterval 是否会降低性能?
  3. 还有没有设计模式可以实现这个功能?

【问题讨论】:

    标签: node.js performance chat real-time


    【解决方案1】:

    只需使用 websocket。 它快速、方便且简单。 要在两个用户都登录时实时发送消息,请在 users Array 或 Map 中通过 id 找到第二个用户,并将收到的消息发送到他的 websocket。 如果您为断开连接的用户(在内存/数据库/redis 中)缓冲了消息,请在用户连接时检查它,如果存在则发送。

    【讨论】:

    • 我知道 websockets 很容易解决我的问题,我想尝试一下其他技术,这有助于我获得更多关于如何在没有可用的专用技术但有些人反对时使这些东西工作的知识它,我不知道为什么?