zoukankan      html  css  js  c++  java
  • swoole架构分析

    swoole的进程/线程结构

    结构图如下:

    swoole主要由Master进程(主进程)和Manager进程配合使用完成其功能。

    Master进程

    是一个多线程的程序。其中有一组很重要的线程,称之为Reactor线程。它就是真正处理TCP连接,收发数据的线程。

    Manager进程

    管理worker/task进程。worker/task进程都是由Manager进程Fork并管理的。

    Reactor线程

    主线程(Master进程)在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,并由这个线程负责监听此socket。在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。

    • 负责维护客户端TCP连接、处理网络IO、处理协议、收发数据
    • 完全是异步非阻塞的模式
    • 全部为C代码,除Start/Shudown事件回调外,不执行任何PHP代码
    • TCP客户端发来的数据缓冲、拼接、拆分成完整的一个请求数据包
    • Reactor以多线程的方式运行

    Work进程

    类似与php-fpm进程。

    • 接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据
    • 生成响应数据并发给Reactor线程,由Reactor线程发送给TCP客户端
    • 可以是异步模式,也可以是同步模式
    • Worker以多进程的方式运行

    TaskWorker进程

    异步处理其他任务的进程,使用方方式类似与Gearman。

    • 接受由Worker进程通过swoole_server->task/taskwait方法投递的任务
    • 处理任务,并将结果数据返回(swoole_server->finish)给Worker进程
    • TaskWorker以多进程的方式运行

    关系

    可以理解为Reactor就是nginxWorker就是php-fpmReactor线程异步并行地处理网络请求,然后再转发给Worker进程中去处理(在回调函数中处理)。ReactorWorker间通过UnixSocket进行通信。

    事件处理流程

    了解swoole事件处理流程,先了解两种网络事件处理模式。

    Reactor模式

    它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程/进程(逻辑单元)。除此之外,主线程不做任何其他工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。

    Proactor模式

    两种实现

    使用I/O异步模型实现Proactor模式。原理:将所有I/O操作都交给主线程,主线程配合和内核来处理,业务逻辑操作就交给逻辑单元。例如使用aio_read来实现。

    工作流程:

    1. 主线程调用aio_read函数向内核注册socket上的读完成事件。
    2. 主线程继续处理其他I/O事件。
    3. 当socket上的数据被读入用户缓冲区后,内核向应用程序(逻辑单元)发送一个信号,通知应用程序数据可用。
    4. 应用程序读取数据(客户端的请求),处理完后,调用aio_write函数向内核注册socket上的写事件。
    5. 主线程继续处理其他逻辑。
    6. 当用户缓冲区的数据写入socket后,内核向应用程序发送一个信号,通知应用程序数据发送完毕。
    7. 应用程序预先定义好的信号处理函数来处理善后处理,比如关闭socket.

    使用I/O同步模型实现Proactor模式。原理:主线程执行I/O事件数据的读写操作,业务逻辑操作就交给逻辑单元。例如使用epoll来实现。

    工作流程:

    1. 主线程往epoll内核事件表中注册socket上的读就绪事件。
    2. 主线程调用epoll_wait等待socket上有数据可读。
    3. epoll_wait有返回后,主线程从socket上读取数据,然后将读取到的数据封装成一个请求对象(客户端的请求),并插入请求队列。
    4. 于是队列的消费者线程处理请求对象,然后在epoll内核事件表中注册socket上的写就绪事件。
    5. 主线程调用epoll_wait等待socket可写。
    6. 当socket可写时,epoll_wait通知主线程。主线程往socket写入请求结果。

    swoole事件架构图

    从图可以看出,如果我们把Reactor线程和Work进程组合起来,看成工作线程的话,swoole使用的是reactor事件处理模式。

    一个请求经历的步骤如下:

    1. 服务器主线程等待客户端连接。

    2. Reactor线程处理接连socket,读取socket上的请求数据(Receive),将请求封装好后投递给work进程。

    3. Work进程就是逻辑单元,处理业务数据。

    4. Work进程结果返回给Reactor线程。

    5. Reactor线程将结果写回socket(Send)。

    每个模块的工作请回顾上面的结构介绍。

  • 相关阅读:
    SQL Server, Timeout expired.all pooled connections were in use and max pool size was reached
    javascript 事件调用顺序
    Best Practices for Speeding Up Your Web Site
    C语言程序设计 使用VC6绿色版
    破解SQL Prompt 3.9的几步操作
    Master page Path (MasterPage 路径)
    几个小型数据库的比较
    CSS+DIV 完美实现垂直居中的方法
    由Response.Redirect引发的"Thread was being aborted. "异常的处理方法
    Adsutil.vbs 在脚本攻击中的妙用
  • 原文地址:https://www.cnblogs.com/xiaoxlm/p/9414248.html
Copyright © 2011-2022 走看看