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
就是nginx
,Worker
就是php-fpm
。Reactor
线程异步并行地处理网络请求,然后再转发给Worker
进程中去处理(在回调函数中处理)。Reactor
和Worker
间通过UnixSocket
进行通信。
事件处理流程
了解swoole事件处理流程,先了解两种网络事件处理模式。
Reactor模式
它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程/进程(逻辑单元)。除此之外,主线程不做任何其他工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。
Proactor模式
两种实现
使用I/O异步模型实现Proactor模式。原理:将所有I/O操作都交给主线程,主线程配合和内核来处理,业务逻辑操作就交给逻辑单元。例如使用aio_read来实现。
工作流程:
- 主线程调用aio_read函数向内核注册socket上的读完成事件。
- 主线程继续处理其他I/O事件。
- 当socket上的数据被读入用户缓冲区后,内核向应用程序(逻辑单元)发送一个信号,通知应用程序数据可用。
- 应用程序读取数据(客户端的请求),处理完后,调用aio_write函数向内核注册socket上的写事件。
- 主线程继续处理其他逻辑。
- 当用户缓冲区的数据写入socket后,内核向应用程序发送一个信号,通知应用程序数据发送完毕。
- 应用程序预先定义好的信号处理函数来处理善后处理,比如关闭socket.
使用I/O同步模型实现Proactor模式。原理:主线程执行I/O事件数据的读写操作,业务逻辑操作就交给逻辑单元。例如使用epoll来实现。
工作流程:
- 主线程往epoll内核事件表中注册socket上的读就绪事件。
- 主线程调用epoll_wait等待socket上有数据可读。
- epoll_wait有返回后,主线程从socket上读取数据,然后将读取到的数据封装成一个请求对象(客户端的请求),并插入请求队列。
- 于是队列的消费者线程处理请求对象,然后在epoll内核事件表中注册socket上的写就绪事件。
- 主线程调用epoll_wait等待socket可写。
- 当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)。
每个模块的工作请回顾上面的结构介绍。
swoole架构分析的更多相关文章
- tomcat架构分析 (Session管理)
Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...
- Magento架构分析,Magento MVC 设计分析
Magento架构分析,Magento MVC 设计分析 分类:Magento 标签:Magento MVC.Magento架构 669人浏览 Magento 采用类似 JAVA的架构,其扩展与稳定性 ...
- Flickr 网站架构分析
Flickr 网站架构分析 Flickr.com 是网上最受欢迎的照片共享网站之一,还记得那位给Windows Vista拍摄壁纸的Hamad Darwish吗?他就是将照片上传到Flickr,后而被 ...
- Android架构分析之Android消息处理机制(二)
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...
- NopCommerce架构分析(转载)
原文 一,NopCommerce架构分析之开篇 NopCommerce是.net开源项目中比较成熟的一款业务应用框架,也是电子商务系统中的典范.所以很想多学习一下里面的设计和实现方式. 二,NopCo ...
- Qualcomm Android display架构分析
Android display架构分析(一) http://blog.csdn.net/BonderWu/archive/2010/08/12/5805961.aspx http://hi.baidu ...
- tomcat架构分析-索引
出处:http://gearever.iteye.com tomcat架构分析 (概览) tomcat架构分析 (容器类) tomcat架构分析 (valve机制) tomcat架构分析 (valve ...
- [转载] 关于“淘宝应对"双11"的技术架构分析”
微博上一篇最新的关于“淘宝应对"双11"的技术架构分析”.数据产品的一个最大特点是数据的非实时写入.
- apache kafka系列之性能优化架构分析
apache kafka中国社区QQ群:162272557 Apache kafka性能优化架构分析 应用程序优化:数据压缩 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...
随机推荐
- python pyqt绘制直方图
# -*- coding: utf-8 -*- """ In this example we draw two different kinds of histogram. ...
- Data Block Compression
The database can use table compression to eliminate duplicate values in a data block. This section d ...
- PPI | protein-protein interaction | 蛋白互作分析
STRING database的挖掘 这个数据库绝对是做实验人的宝藏,里面包含了各种蛋白互作关系,不用做实验就有一大堆证据. IPA了解一下,收费的高端分析软件,大部分就是整合的这个数据库,很多大佬喜 ...
- padding和margin——内边距和外边距
一.padding——内边距(内填充) 1.1.padding 简写属性在一个声明中设置所有填充属性.该属性可以有1到4个值. <style> div.outer{ width: 400p ...
- pc端结合canvas实现简单签名功能
需求:业务员做提交时要签名... 代码不多简单易懂,直接看代码 <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- 【lintcode】二分法总结 II
Half and Half 类型题 二分法的精髓在于判断目标值在前半区间还是后半区间,Half and Half类型难点在不能一次判断,可能需要一次以上的判断条件. Maximum Number in ...
- PHP:第一章——PHP中的变量002
预定义变量.变量的有效范围.可变变量.静态变量.php之外的变量 <?php /*****************************************************/ // ...
- I2C 上拉电阻选择计算公式
I2C接口上拉电阻的选择 - I2C接口上拉电阻的选择 1.I2C接口的输出端是漏极开路或集电极开路,所以必须在接口外接上拉. 2.上拉电阻的范围很宽,但也需要跟据功耗.信号上升时间等具体确定. 和速 ...
- Python,是什么让我遇见你
有些不可思议,作为一个曾学了半年C语言还挂了的计算机学渣,我竟然选择了Python这门计算机语言课.事实上,我是有过犹豫的,毕竟知道自己不擅长这方面的学习还选这门课,这种行为确实看起来有点傻傻的.但最 ...
- 活代码LINQ——06
一.模块代码 ' Fig. 9.4: LINQWithArrayOfObjects.vb ' LINQ to Objects using an array of Employee objects. M ...