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)。

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

  • 相关阅读:
    设计模式(08):结构型模式(二) 桥接模式(Bridge)
    设计模式(07):结构型模式(一) 适配器模式(Adapter)
    设计模式(06):创建型模式(五) 原型模式(Prototype)
    node.js获取cookie
    排序算法[转]
    Observer(观察者)设计模式[转]
    c#发送Http请求
    win+R下的命令
    display:inline、block、inline-block的区别
    Redis安装
  • 原文地址:https://www.cnblogs.com/xiaoxlm/p/9414248.html
Copyright © 2011-2022 走看看