swoole的核心概念
只要从现在开始努力,最坏不过是大器晚成
当 Swoole 启动时, 一共会建立 2 + n + m 个进程,其 n 为 Worker 数, m 为 TaskWorker 数,2 为一个 Master 进程和一个 Manager 进程
Swoole框架模型
Swoole Server 中有以下几种角色,分别是:Master(Process)、Reactor(Thread)、Manager(Process)、Worker(Process) 和 TaskWoker(Process);
Master(Process)
Master 是 Swoole 的主要 Process,当我们启动 Swoole 时,当下的 Process 就会成为 Master Process 并负责建立 Main Reactor、建立和管理 Reactor、建立 Manager 并开始接受客户端请求等工作。
首先 Master 会透过 fork 函数建立一个 Manager,接着建立 Reactor,当全部建立完成后会呼叫 onStart 的 callback function,此时可以在这个 callback function 中对 Master 做一些处理或修改。如:将 Master 重新命名,保存 Master 的 PID 档桉等。
这裡要特别注意,因为 Master 不应该存在任何商业逻辑,因此 Swoole 底层会禁止你在此处做一些行为,如:发送请求、呼叫 Swoole 的异步 API 等等。
Reactor(Thread)
Reactor 以 Multi-Thread 的方式执行,Reactor 底层由 epoll 函数来实现(在Mac系统是透过 Kqueue),用于实际监听和处理来自客户端的 Connect 请求,并完全是透过异步、非阻塞的模式来运作。
Manager(Process)
Swoole 中 Worker/Task worker 都是由 Manager 所 fork 并管理的。当 Manager 被建立时,会呼叫 onManagerStart 的 callback function 通知上层的应用。
当底下的某个 Worker 意外结束执行时,Manager 会负责回收的工作,并同时建立新的 Worker 补足固定的数量维持 Swoole 的正常运作。
当 Manager 退出时,会呼叫 onManagerStop 的 callback function,可以利用此时进行一些回收逻辑。
Worker(Process)
Worker 以 Multi-Process 的方式执行,是 Swoole 中执行大部分逻辑的地方,因此在 Worker 中所对应的 callback function 数量也是最多的。
当 Worker 启动后会呼叫 onWorkerStart 的 callback function,在这裡我们就能够使用全部 Swoole 所提供的 API 了。
当上层的 Reactor 收到客户端的请求后,就会将数据打包发送给 Worker,并在相对应的 callback function 中(如:onReceive、onRequest、onMessage等)处理这些资料,并可以将处理结果回传给 Reactor,再回传至客户端中。如果 Worker 正常退出,会呼叫 onWorkerStop 的 callback function,若是处理数据过程中出现严重错误或者 Worker 请求达到处理上限时,则会呼叫 onWorkerError 的 callback function 并结束该 Worker。
Task Worker(Process)
Task Worker 一样以 Multi-Process 的方式执行,只接受由 Worker 中透过 swoole_server->task/taskwait 方法指派过来的任务,并将结果回传给 Worker。
Process 间的通讯
在 Swoole 中,Process 间的通讯可以分为以下几三种状况:
- Master <=> Worker
- Worker <=> Worker
- Worker <=> Task Worker
前两种情形,在 Swoole 底层统一使用 Unix Socket 进行通讯,这些 socket 也都归併到各自 Process 的 Reactor 中进行管理。而第三种情况,除了预设的 Unix Socket 外,还可以使用由系统提供的 Message Queue 来实作。
Reactor,Worker,Task的关系
一个通俗的比喻,假设Server就是一个工厂,那Reactor就是销售,接受客户订单。而Worker就是工人,当销售接到订单后,Worker去工作生产出客户要的东西。而TaskWorker可以理解为行政人员,可以帮助Worker干些杂事,让Worker专心工作。
https://wiki.swoole.com/wiki/page/163.html
https://blog.albert-chen.com/swoole-basic-concepts/