Swoole扩展的6种模式深入详解 |
前言 并发问题可以理解为两个问题
Swoole底层基于epoll,所以第一个问题在Swoole扩展中实际上不存在任何问题 。使用Swoole可以轻松应对10万甚至100万长连接 。开发者唯一需要做的就是修改 ulimit -n 将系统最大文件描述符改为 10万或更大 。 不同的模型每秒能处理多少请求数,这个是应用层需要考虑的问题 。而且不同的场景下有些模式无法使用 。真正的难题就是在这里 。实际上 工具永远是死的,而人是活的 。 再复杂艰难的场景也阻挡不了聪明的工程师 。合理利用Swoole提供的各项功能可以巧妙解决各种难题 。 第一 Worker同步阻塞这个模式的使用方法:
这个模式的瓶颈就在与onRequest或onReceive里代码逻辑的处理速度 。按照快慢可以分为几种
进程数量 根据上面的IO耗时,设置适当的进程数量即可 。
投递模式 如果请求是无状态的可以使用dispatch_mode=1或3,轮循投递或者区分忙闲投递 。 长连接应用 比如聊天室,网络游戏 。连接之间需要交互的应用 。 可以使用 MySQL/Redis/文件 存储用户的连接fd,分组信息 。要向某个用户发数据可以根据UID查出对应的fd,发送数据即可 。发送分组,可以根据分阻ID查询出fd列表,循环发送数据即可 。 第二 Worker非阻塞+Task这种模式是典型的同步+异步,复杂的业务逻辑使用同步阻塞在Task进程中处理,简单要求高并发的逻辑使用异步非阻塞在Worker进程中处理 。 使用方法
Worker进程 在这个模式中,Worker进程不能有任何同步阻塞的操作,只处理请求响应或数据接收发送,仅进行PHP数组或对象操作或其他计算逻辑 。具体参考 模式3 Worker进程全异步 。 Task进程 无状态地处理任务,并返回结果 。需要注意单个Task的执行时间,避免处理时间太长导致Task排队过多 。 第三 Worker全异步这个模式就是真正的异步非阻塞编程,在代码中只能使用Swoole提供的异步非阻塞IO操作,不得执行任何普通的PHP阻塞IO函数,如curl、mysql、redis、fsockopen、stream、socket、proc_open等 。 与模式二 不同的是全异步服务器不使用Task进程,即使是很复杂的业务逻辑也在Worker进程中执行 。纯异步编程需要对开发者要求较高 。 使用方法
逻辑实现 Worker进程内的PHP代码只能进行下列3种操作:
适用场景
弊端和解决方案
可使用 Promise 或 Yield/Generator 简化异步编程 。 第四 Base模式+同步阻塞Base模式是一个简化版本,Base模式下Swoole的运行原理与Node.js完全一致,是单线程的 。对TCP客户端的Accept、Send、Recv、Close都是同一个进程内操作的 。 与Process同步阻塞模式不同的是BASE模式下Worker进程的调度由操作系统实现 。因此可以实现一个Leader-Follower模式的服务器程序 。 使用方法
适用场景
第五 ProcessProcess提供了对进程管理的封装 。基于Process可实现: 多进程+进程间通信编程 将其他语言编写的程序包装为子进程,重定向标准输入输出到管道,与该程序进行通信 。可实现任意编程语言为我PHP所用 。 第六 sendMessage到此这篇关于Swoole扩展的6种模式深入详解的文章就介绍到这了,更多相关Swoole扩展的5种模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! |