实时聊天技术的表现

问题描述

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

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

  1. SSE+setInterval

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

    • 在长轮询中,如何找到用户是否有新消息并完成请求?
    • 此处仍应在服务器端使用 setInterval,但性能如何?
  3. 网络套接

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

问题

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

解决方法

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