+
80
-

swoole扩展的6种模式有什么不同?

swoole扩展的6种模式有什么不同?

网友回复

+
0
-

一、 Worker同步阻塞模式

这个模式的使用方法:

swoole_server设置为SWOOLE_PROCESS

只使用Worker进程

根据不同的情况设置worker_num的数值

设置dispatch_mode参数为1或3

Worker进程内使用同步阻塞的代码编写方式,这里不使用任何异步IO接口

这个模式的瓶颈就在与onRequest或onReceive里代码逻辑的处理速度。按照快慢可以分为几种

外网CURL调用。这个最慢,快的数百毫秒,慢的情况可能需要几十秒

内网RPC或Http接口,这个取决与这个接口的速度

MySQL复杂查询,一条SQL如果没有索引可能需要几百毫秒,甚至几秒或更长时间。而如果是主键查询或者索引足够有效可能只需要几毫秒

Redis/Memcache,内存数据库局域网而且是长连接,调用一次可能只需要几百微秒也就是0.x毫秒就能返回

读取磁盘文件,普通机械磁盘未命中PageCache引起磁盘寻道,可能需要几十毫秒。SSD磁盘速度就快多了几毫秒即可完成随机读取。

内存文件系统或共享内存,读取/tmp或/dev/shm下的共享文件本质上是读取共享内存,仅需几微妙到几十微秒即可完成。如果是直接读共享内存可能更快,纳秒级别。

进程数量

根据上面的IO耗时,设置适当的进程数量即可。

IO很慢就设置几百个Worker进程,如操作MySQL、CURL、大量读写磁盘

IO很快就可设置少量进程,如操作Redis、内存文件系统、共享内存

投递模式

如果请求是无状态的可以使用dispatch_mode=1或3,轮循投递或者区分忙闲投递。

长连接应用

比如聊天室,网络游戏。连接之间需要交互的应用。 可以使用 MySQL/Redis/文件 存储用户的连接fd,分组信息。要向某个用户发数据可以根据UID查出对应的fd,发送数据即可。发送分组,可以根据分阻ID查询出fd列表,循环发送数据即可。

二、Worker非阻塞+Task模式

这种模式是典型的同步+异步,复杂的业务逻辑使用同步阻塞在Task进程中处理,简单要求高并发的逻辑使用异步非阻塞在Worker进程中处理。

使用方法

使用SWOOLE_PROCESS模式

dispatch_mode 设置为2(默认就是2,可不做任何设置)

worker_num 设置为CPU核数

task_worker_num 根据业务逻辑的耗时情况进行设置,如果平均耗时较长,需要设置数百个进程,耗时较短可设置几十个进程

Worker进程

在这个模式中,Worker进程不能有任何同步阻塞的操作,只处理请求响应或数据接收发送,仅进行PHP数组或对象操作或其他计算逻辑。具体参考 模式3 Worker进程全异步。

Task进程

无状态地处理任务,并返回结果。需要注意单个Task的执行时间,避免处理时间太长导致Task排队过多。

三、Worker全异步模式

这个模式就是真正的异步非阻塞编程,在代码中只能使用Swoole提供的异步非阻塞IO操作,不得执行任何普通的PHP阻塞IO函数,如curl、mysql、redis、fsockopen、stream、socket、proc_open等。 与模式二 不同的是全异步服务器不使用Task进程,即使是很复杂的业务逻辑也在Worker进程中执行。纯异步编程需要对开发者要求较高。

使用方法

dispatch_mode设置为2

worker_num 设置为CPU核数

逻辑实现

Worker进程内的PHP代码只能进行下列3种操作:

使用swoole_redis、swoole_mysql、swoole_http_client、swoole_client+async操作

进行PHP数组、对象操作或其他内存计算逻辑

使用swoole_server的send、push、close、response->end等操作

适用场景

长连接服务

对并发能力和吞吐量有较高要求

团队开发者技术水平较高

弊端和解决方案

纯异步需要使用嵌套回调的方式编写代码,与传统的编程模式完全不同,异步是事件驱动式的,代码不是顺序执行的。

异步嵌套回调的方式在程序逻辑复杂后会变得难以维护

可使用 Promise 或 Yield/Generator 简化异步编程。

四、Base模式+同步阻塞模式

Base模式是一个简化版本,Base模式下Swoole的运行原理与Node.js完全一致,是单线程的。对TCP客户端的Accept、Send、Recv、Close都是同一个进程内操作的。 与Process同步阻塞模式不同的是BASE模式下Worker进程的调度由操作系统实现。因此可以实现一个Leader-Follower模式的服务器程序。

使用方法

使用SWOOLE_BASE模式

worker_num根据逻辑代码的耗时情况设置几百或几十

worker进程内使用同步阻塞IO操作

适用场景

适合短连接 & 请求响应式 服务,如Web服务、RPC服务

这种模式不能实现单连接并发,客户端的连接被某个Worker进程Accept之后,只能在此进程内处理请求

五、 Process模式

多进程模式是最复杂的方式,用了大量的进程间通信、进程管理机制。适合业务逻辑非常复杂的场景。Swoole提供了完善的进程管理、内存保护机制。 在业务逻辑非常复杂的情况下,也可以长期稳定运行。 Swoole在Reactor线程中提供了Buffer的功能,可以应对大量慢速连接和逐字节的恶意客户端。另外也提供了CPU亲和设置选项,使程序运行的效率更好。 进程模式的优点: 连接与数据请求发送是分离的,不会因为某些连接数据量大某些连接数据量小导致Worker进程不均衡 Worker进程发送致命错误时,连接并不会被切换

进程模式的缺点: 存在2次IPC的开销,master进程与worker进程需要使用UnixSocket进行通信

不支持某些高级功能,如sendwait、pause、resume等操作

六 、sendMessage模式

关于这种模式的介绍很少,笔者也没有找到有关的资料,只是从php的官网中看到有一个方法:

不知道跟这个模式有没有关系,既然资料很少,估计用的也比较少,用的比较多的模式估计就是第二种模式了。

我知道答案,我要回答