Websocket

6 min

:headphones:websocket

基础设计

在 WebSocket 通信中,当两个用户连接到同一个 WebSocket 服务器时,服务器并不会直接“建立” WebSocket 连接,而是负责管理这些连接并允许它们进行通信。以下是详细的流程:

  1. 用户连接到服务器
  2. 握手过程
  3. 管理
    • WebSocket 服务器会为每个连接分配一个唯一的标识符或管理对象。服务器会维护一个连接列表,方便管理和路由消息。
  4. 消息传递:
    • 用户 A 可以通过其 WebSocket 连接发送消息到 WebSocket 服务器,服务器会接收到这个消息。
    • 服务器将这个消息【路由】到用户 B 的 WebSocket 连接,用户 B 会接收到这个消息。
    • 同样地,用户 B 的消息可以通过服务器转发到用户 A。
  5. 关闭连接:
    • 当用户决定断开连接时,他们会发送一个关闭帧给服务器,服务器会接收到这个关闭请求并终止对应的 WebSocket 连接。

示例

假设有一个聊天室应用,其中用户 A 和用户 B 都连接到同一个 WebSocket 服务器:

  1. 用户 A 和 B 连接:
    • 用户 A 发起 WebSocket 连接请求到服务器。
    • 用户 B 发起 WebSocket 连接请求到服务器。
  2. 消息传递:
    • 用户 A 在聊天室中发送一条消息。
    • 这条消息通过 WebSocket 服务器转发到用户 B。
  3. 服务器处理:
    • 服务器管理两个连接,并将消息从一个连接路由到另一个连接。

总结

WebSocket 服务器充当了通信的中介,确保了不同用户之间的消息能够正确传递。

  • 每个用户与 WebSocket 服务器建立独立的连接。
  • 服务器负责管理这些连接并路由消息。
  • 用户之间的通信是通过服务器来实现的,而不是直接通过客户端到客户端的连接

拓展设计

以下是如何将 RocketMQ 集成到 WebSocket 系统中的一些变化和流程

如果在 WebSocket 系统中引入 RocketMQ,主要的变化会体现在消息的传递和处理方式上。RocketMQ 是一个分布式消息队列系统,它提供了可靠的消息传递和存储功能,可以用于更复杂的消息处理场景。

1. 消息发布和订阅

  • WebSocket 服务器: 仍然负责管理 WebSocket 连接和直接与客户端的通信。
  • RocketMQ: 用于处理和路由消息。

流程变化:

  1. 用户连接和消息发送:
    • 用户 A 和用户 B 通过 WebSocket 连接到 WebSocket 服务器。
    • 用户 A 发送消息到 WebSocket 服务器。
  2. 消息发送到 RocketMQ:
    • WebSocket 服务器将用户 A 发送的消息发布到 RocketMQ 的一个主题(Topic)。
    • RocketMQ 负责将这个消息存储到消息队列中,并将其分发到订阅了这个主题的消费者。
  3. 消息消费:
    • WebSocket 服务器作为 RocketMQ 的消费者之一,从 RocketMQ 消费消息。
    • 服务器将从 RocketMQ 获得的消息转发给用户 B(如果消息目标是用户 B)。
  4. 消息传递到客户端:
    • WebSocket 服务器通过 WebSocket 连接将消息发送到用户 B。
    • 用户 B 接收到来自用户 A 的消息。

2. 消息持久化

  • RocketMQ: 提供消息持久化功能,确保消息不会丢失,即使在系统故障时也能恢复。
  • WebSocket: 不负责消息持久化,消息的状态和存储由 RocketMQ 处理。

3. 扩展性和负载均衡

  • RocketMQ: 可以在多个 WebSocket 服务器之间进行负载均衡和消息分发,支持高并发和大规模消息处理。
  • WebSocket: 可以将不同的 WebSocket 服务器实例连接到同一个 RocketMQ 集群,以实现更高的可扩展性和可靠性。

4. 实现示例

假设你在一个聊天应用中使用 WebSocket 和 RocketMQ:

  1. 用户 A 发送消息:
    • 用户 A 通过 WebSocket 发送消息到 WebSocket 服务器。
    • WebSocket 服务器将消息发送到 RocketMQ 的 chat 主题。
  2. RocketMQ 处理消息:
    • RocketMQ 将消息存储到队列中,并将其路由到所有订阅了 chat 主题的消费者。
  3. WebSocket 服务器消费消息:
    • 另一个 WebSocket 服务器(或同一个服务器的不同实例)作为消费者从 RocketMQ 消费消息。
    • 服务器将消息通过 WebSocket 发送给用户 B。
  4. 用户 B 接收到消息:
    • 用户 B 通过 WebSocket 接收到来自用户 A 的消息。

5. 总结

将 RocketMQ 集成到 WebSocket 系统中,主要是将消息处理逻辑从 WebSocket 服务器移到 RocketMQ,这样可以利用 RocketMQ 的消息持久化、负载均衡和分布式处理能力。WebSocket 服务器仍然负责管理 WebSocket 连接和与客户端的通信,但消息的发布、订阅和存储由 RocketMQ 处理。这种设计可以提高系统的可靠性和扩展性,特别是在需要处理大量消息和用户时。