Laravel11 从0开发 Swoole-Reverb 扩展包(二) - Pusher 协议介绍

Pusher 协议概述

Pusher 协议 是一种用于实时 Web 通信的协议,它基于 WebSocket 技术,并提供了一套 发布-订阅(Pub/Sub)模式,用于让客户端(如浏览器、移动端、后端服务)可以实时接收服务器端推送的消息。Pusher 还支持 HTTP 轮询和 Fallback 方案,以保证兼容性。


Pusher 协议的核心概念

1. 连接 (Connections)

  • 客户端(通常是 Web 浏览器或移动设备)通过 WebSocket 连接到 Pusher 服务器。
  • 连接后,客户端会发送 连接请求,服务器会在成功连接后返回确认信息。

2. 频道 (Channels)

  • 频道 是 Pusher 协议的核心概念,类似于 Pub/Sub 机制中的主题(Topic)。
  • 客户端可以 订阅 (subscribe) 频道,并接收服务器端在该频道上广播的事件。

频道的类型

频道类型 说明
Public 公开频道,所有连接的客户端都可以订阅,无需身份验证。
Private 私有频道,需要身份验证才能订阅,通常用于保护敏感数据。
Presence 带用户状态的私有频道,可以查看在线用户列表,适用于聊天应用或在线状态管理。

3. 事件 (Events)

  • 事件 是 Pusher 协议中最重要的概念,表示服务器或客户端触发的特定消息。
  • 事件通过 WebSocket 进行广播,客户端监听并处理它们。

常见事件

事件名称 说明
pusher:connection_established 连接成功事件,服务器发送给客户端,包含 socket_id。
pusher:subscribe 客户端发送的订阅频道请求。
pusher:unsubscribe 客户端请求取消订阅频道。
pusher:member_added Presence 频道中新成员加入事件。
pusher:member_removed Presence 频道中成员离开事件。
自定义事件 例如 chat:new_message,用于在应用程序中传递业务数据。

4. 认证 (Authentication)

  • 私有频道 (Private Channels)Presence 频道 需要 身份认证
  • 认证方式:
    1. 客户端尝试订阅 PrivatePresence 频道。
    2. 服务器会检查用户身份,并返回 签名 (HMAC),客户端需要带上这个签名才能订阅成功。

Pusher 协议的数据格式

Pusher 使用 JSON 格式传输数据,每个 WebSocket 消息通常包含以下字段:

{
  "event": "event-name",
  "channel": "channel-name",
  "data": { "message": "hello world" }
}

示例:

{
  "event": "chat:new_message",
  "channel": "chat-room-1",
  "data": { "user": "Alice", "message": "Hello, Bob!" }
}

Pusher 协议的 WebSocket 交互流程

1. 连接阶段

  1. 客户端 通过 WebSocket 连接到 Pusher 服务器:
    ws://pusher.example.com/app/{appKey}?protocol=7&client=js&version=7.0
    
  2. 服务器返回 pusher:connection_established 事件:
    {
      "event": "pusher:connection_established",
      "data": {
        "socket_id": "1234.5678",
        "activity_timeout": 30
      }
    }
    
    • socket_id:唯一标识这个连接的 ID
    • activity_timeout:如果客户端超过这个时间未发送数据,服务器可能会断开连接。

2. 订阅频道

  • 客户端发送订阅请求
    {
      "event": "pusher:subscribe",
      "data": {
        "channel": "chat-room-1"
      }
    }
    
  • 服务器返回成功订阅的响应
    {
      "event": "pusher_internal:subscription_succeeded",
      "channel": "chat-room-1",
      "data": {}
    }
    

3. 事件广播

  • 客户端或服务器向频道广播事件
    {
      "event": "chat:new_message",
      "channel": "chat-room-1",
      "data": {
        "user": "Alice",
        "message": "Hello, Bob!"
      }
    }
    
  • 所有订阅了 chat-room-1 的客户端都能收到这个消息。

4. 取消订阅

  • 客户端发送取消订阅请求
    {
      "event": "pusher:unsubscribe",
      "data": {
        "channel": "chat-room-1"
      }
    }
    

5. 关闭连接

  • 客户端主动关闭连接
    pusher.disconnect();
    
  • 服务器可能会因超时或异常关闭连接
    {
      "event": "pusher:disconnect",
      "data": {
        "reason": "ping timeout"
      }
    }
    

Pusher 协议流程图

sequenceDiagram participant Client participant Pusher Server participant Application Server Client->>Pusher Server: 1️⃣ 连接 WebSocket (ws://pusher.example.com/app/{appKey}) Pusher Server->>Client: 2️⃣ pusher:connection_established (返回 socket_id) Client->>Pusher Server: 3️⃣ pusher:subscribe (订阅 chat-room-1) Pusher Server->>Client: 4️⃣ pusher_internal:subscription_succeeded Application Server->>Pusher Server: 5️⃣ 通过 API 触发事件 (chat:new_message) Pusher Server->>Client: 6️⃣ chat:new_message (广播消息) Client->>Pusher Server: 7️⃣ pusher:unsubscribe (取消订阅 chat-room-1) Pusher Server->>Client: 8️⃣ pusher:disconnect (超时或主动断开)

Pusher 协议的应用场景

Pusher 协议广泛用于 实时 Web 应用,常见应用包括:

  1. 即时聊天 (Chat Applications)
    • 用户可以订阅聊天频道并接收新消息。
  2. 通知系统 (Real-time Notifications)
    • 服务器推送重要的系统通知,如订单状态更新。

总结

  • Pusher 协议是基于 WebSocket 的实时通信协议,支持 Pub/Sub 模式。
  • 使用 Channels(Public、Private、Presence) 来管理订阅关系。
  • 事件驱动机制:服务器或客户端可以触发事件,Pusher 负责分发。
  • 支持身份认证,确保 Private 和 Presence 频道的安全性。
  • JSON 格式传输数据,易于解析和处理。
posted @ 2025-03-12 11:39  wanzij  阅读(20)  评论(0)    收藏  举报
TOP