Workerman 是一个基于 PHP 开发的高性能异步网络通信框架,其启动过程包括启动 Gateway 进程和 Worker 进程。Gateway 进程负责异步网络 IO,而 Worker 进程负责业务逻辑处理。多台 Gateway 之间的通讯原理以及 Workerman 的启动过程可以简述如下:
- Gateway 进程启动:
- 当 Workerman 启动时,会启动 Gateway 进程。每个 Gateway 进程都会向一个存储(如文件或 Memcache,可配置)写入该进程的内部通讯地址。
- 写入的信息包括每个 Gateway 进程的内部通讯地址以及相关的信息,如 IP 地址、端口等。
- Worker 进程启动:
- Worker 进程启动时,会读取存储中的信息,获取每个 Gateway 进程的内部通讯地址。
- Worker 进程会向每个 Gateway 进程的内部通讯地址建立长连接,确立与每个 Gateway 进程的通讯通道。
- 定时任务监测:
- Worker 进程中会有一个定时任务,定时监测存储中是否有新的 Gateway 内部通讯地址加入。
- 如果有新的 Gateway 进程加入,Worker 进程会同样建立长连接,以便与新的 Gateway 进程进行通讯。
- 通讯原理:
- Gateway 和 Worker 之间的通讯是通过内部的长连接实现的。
- 每个 Gateway 进程会与后端的所有 Worker 进程建立长连接,而每个 Worker 进程也会与所有的 Gateway 进程建立长连接。
- 这样的设计保证了每个 Gateway 进程都知道有多少 Worker 进程,同时每个 Worker 进程也知道有哪些 Gateway 进程,从而实现了集群内部的通讯。
- 广播和单独发送:
- 广播是通过 Worker 进程调用
Gateway::sendToAll($message)
实现的,Worker 进程会向所有 Gateway 进程发送一条广播命令 数据,每个 Gateway 进程收到后再向其维护的所有客户端连接发送数据。 - 单独发送是通过
Gateway::sendToClient($client_id, $message)
实现的,需要知道目标客户端的client_id
,然后通过存储获取到对应的 Gateway 内部通讯地址,最终向该地址发送命令 数据,实现对特定客户端的单独发送。
- 广播是通过 Worker 进程调用
通过了解多台 Gateway 进程之间的通讯原理以及 Workerman 的启动过程,可以更好地理解其内部工作机制,并为系统的设计和优化提供参考。