workerman 4 中 gatewayworker 的 gateway 与 businessworker 是通过 register 协调通信的对等节点,非主从关系:gateway 专注长连接管理与数据透传,不执行业务逻辑;businessworker 专注业务处理,不感知客户端网络状态;register 仅负责地址注册与广播,实现两者解耦部署与独立扩展。

Workerman 4 中使用 GatewayWorker 时,gateway 进程和businessWorker 进程是严格分工、彼此解耦的两个角色,不是主从关系,而是通过 register 进程协调通信的对等节点。
gateway 进程只做网络层的事
它面向客户端,专注维持海量长连接(WebSocket/TCP),不执行任何业务逻辑:
- 接收客户端发来的原始数据包,不做解析也不处理业务含义
- 将收到的数据原样转发给 businessWorker,附带
$client_id和$gateway_client_id标识 - 负责心跳保活、超时踢出、连接断开通知等连接生命周期管理
- 把 businessWorker 返回的消息,按
$client_id准确投递给对应客户端 - 自身不加载业务代码,不查数据库、不调 API、不序列化 JSON
businessWorker 进程只跑业务逻辑
它面向 gateway,完全不知道客户端真实网络状态,只认 gateway 发来的结构化消息:
- 默认执行
Events.php中的onConnect、onMessage、onClose - 收到消息后做登录校验、群组管理、消息存库、权限判断等具体操作
- 调用
Gateway::sendToClient()、Gateway::sendToGroup()等接口下发响应,但这些调用实际由 gateway 进程完成 - 所有 PHP 执行都在它内部发生,CPU 和内存消耗集中在此
- 若某次处理耗时过长(如数据库慢查询),只会阻塞当前 businessWorker 进程,不影响 gateway 接收新连接
两者靠 register 进程建立通信链路
register 不参与数据流转,仅作地址注册与广播中枢:
- gateway 启动后,向 register 报告自己的内网地址(如
192.168.1.10:2000) - businessWorker 启动后,向 register 请求所有 gateway 地址列表
- register 将当前全部 gateway 地址一次性发给 businessWorker,后者主动与其建立长连接
- 后续 gateway 上下线时,register 广播更新后的地址列表,businessWorker 动态增删连接
- 因此 gateway 和 businessWorker 可部署在不同机器,只要能连通 register 即可
这种分工带来的实际好处
分离之后,系统具备清晰的横向扩展能力:
- 高并发连接场景:增加 gateway 进程数,提升接入能力,不增加 CPU 压力
- 复杂业务处理场景:增加 businessWorker 进程数,提升计算吞吐,不占用连接资源
- 故障隔离:gateway 崩溃不影响业务逻辑执行上下文;businessWorker 崩溃不会导致客户端掉线
- 资源优化:可将 gateway 部署在带宽充足、CPU 较弱的机器上;businessWorker 部署在 CPU 密集型服务器上











