1.Swoole2.0原生协程高性能开发实践 alvinzhu(朱新宇)

2.关于我 • 2015年 毕业于上海交通大学 • 2015年 进入腾讯即通综合部 • 企业QQ • 营销QQ • QQ看点 • 开源社区: • Swoole • TSF

3.大纲 • Swoole2.0原生协程探索之路 • PHP高可用应用层框架建设 • QQ看点Web前后端高可用结构优化

4.PHP的并发IO之路 foo($params, function($params){ bar($params, function($params){ baz($params, function($params){ //...... }); })); }); Generator yield foo($params); yield bar($params); yield baz($params); ?

5.Yield协程 • 什么是协程 • 函数重入能力 • PHP堆栈的分离,保存 • Yield实现协程切出 • 双向通信能力 • 如何协程实现非阻塞IO

6.Yield问题 A($params); yield B($params); C($params); • 开发效率低,入门门槛高 • 这里什么要yield? • 为什么代码没反应? • 内存分配低效 C1 C function B($params) { yield $cli->TCPSend(); } function C($params) { return C1($params); } function C1($params) { return “nosense”; } IF Main function C1($params) { yield $client->send(); } 对协程的认知被转变成了对Generator语法和原理的认知

7.原生协程 • 栈分离—打破迭代器限制 • swoole底层分配协程栈 • Scheduler负责协程管理 • • • • • 协程创建 上下文保存 协程切出 协程恢复 超时管理

8.协程实践 TCP/UDP HTTP $cli = new Swoole\Coroutine\Client(SWOOLE_SOCK_UDP); $ret = $cli->connect("127.0.0.1", 8888); $ret = $cli->send("hello world at the first time"); $ret = $cli->recv(2); $cli->close(); $cli= new Swoole\Coroutine\Http\Client('0.0.0.0', 9510); $cli->set(['timeout' => 1]); $cli->setHeaders([ "Host" => "api.mp.qq.com", "User-Agent" => "Chrome/49.0.2587.3", ]); $ret = $cliAA->get("/cn/token"); Mysql $cli = new Swoole\Coroutine\MySQL(); $cli->connect(['host' => '127.0.0.1', 'user' => ‘root', 'password' => '1', 'database' => 'test']); $ret = $cli->query('Select * from test limit 1'); $cli->close(); Redis $redis = new Swoole\Coroutine\Redis(); $res = $redis->connect('127.0.0.1', 6379); $res = $redis->set('key_tmp', 'Hello World');

9.协程实践 Multi-Call $http_client= new Swoole\Coroutine\Http\Client('qq.com', 80); $http_client->setDefer(); $http_client->get('/'); $mysql = new Swoole\Coroutine\MySQL(); $res = $mysql->connect(['host' => '192.168.244.128', 'user' => 'mha_manager', 'password' => 'mhapass', 'database' => 'tt']); $mysql->setDefer(); $mysql->query('select sleep(1)', 2); $res = $http_client->recv(); $mysql_res = $mysql->recv();

10.性能测试 压测环境:8核 16G虚拟机 c 200 d30s Http长连接 Swoole2.0 callback PHP yield Echo 540000 530000 80000 1次后端 83900 82400 41000 3次后端 31000 31000 20000 Swoole2.0 callback PHP yield Echo 56000 55000 43000 1次后端 43600 43300 30000 3次后端 27000 27000 17000 Http短连接

11.Swoole 小而美 系统级高可用 • 提供异步高性能IO • 快速搭建、高效开发 • 原生协程能力 • 连接池方案 • 通用原子能力封装 • 频控组件 • 过载保护 • 监控上报 • 组件扩展

12.连接池 • 传统连接池为进程连接池,实现简单 • 无法跨进程收敛连接 • 服务定时重启带来短链攻击 • TSF3.0跨进程连接池,从worker层面收敛链接

13.频率控制 • 频率控制保护服务在有效负载范围内 • 保护下游服务免受流量冲击 • TSF3.0提供频控保护组件 • 单机频控:防止单机高负载导致成功率下降 • 联机频控:从服务模块维度控制访问频次

14.过载保护 • 超负载高流量会导致整体服务雪崩 • TSF提供单机和联机过载保护机制 • 单机过载保护:探测队列拥塞 • Master进程标记请求收包时间 • TSF根据收包时间戳判断队列拥塞情况

15.过载保护 • 单机服务过载后粗暴丢弃 • 后端依赖过载会导致整个调用链成功率下降 • 单个CGI过载会导致其他CGI成功率降低 • 联机过载保护:从全局保证损失最小化 • CGI优先级划分,保证高优先级能力 • CGI协议指定后端deadline,放弃超时请求

16.服务监控 • 服务实时可用性由调用链上服务健康度决定 • TSF提供服务统一上报能力 • Kernel收集服务统信息,写入共享内存 • TSF-Agent读取worker的信息,做统计合并后上报

17.集群动态管理 • TSF服务抽象为模块提供集群服务 • 模块内配置、系统一致化 • 织云系统提供管理服务 • • • • 模块监控 自动部署 弹性伸缩 服务发现

18.TSF整体架构 • 核心层:抽象swoole基础网络能力 • 协议层:适配不同协议的网络接口 • 组件层:提供框架可扩展能力,封装具有 独立能力的组件 • Agent服务:底层支持框架启停/监控/数 据同步的能力

19.TSF实践 连接池: 'mysqlpool' => [ 'conns' => [ 'target_mysql' => [ 'serverInfo' => [ 'host' => '','user' => '','password' => '', 'database' => '' ], 'maxSpareConns' => 10, 'maxConns' => 20 ]], 'maxProxyConns' => 10, 'maxSpareProxyConns' => 5 ], $conn = TSF\Pool\Factory::fetch(‘mysql‘,'target_mysql'); $res = $conn->query('select version()'); $conn->recycle(); 单机频控:Route::facade()->any('*', '*', [ 'include' => [ 'before' => ['TSF\Http\Middleware\RateLimiter'], ] ]); UserWorker:"TSF\\Component\\UserWorker\\UserWorkerManager" => [ [ "name" => "hippoworker", "num" => 1, "workerClass" => "\\App\\UserWorker\\HippoConsumer", ] ]

20.看点图文页优化 性能 可靠性 • 网络请求优化 • 静态资源高可用 • 终端预加载策略 • 后台服务高可用 • 加载策略优化 • 全链路监控

21.看点图文页优化 • 明确首屏直出目标:1s内(wifi/4g) • 网络请求耗时全链路分析 • 网络请求路径优化 • • • • • • • • webview预启动 DNS预解析 首屏sea.js内联 首屏CSS内联 Wifi下页面预加载 静态资源离线包缓存 加载策略优化 首图预加载

22.看点图文页优化 • 多级缓存实现详情页高性能直出 • 本机缓存 • 联机缓存 • TSSD存储 • 缓存异步懒更新

23.看点图文页优化 • web前台常见故障 • 运营商劫持 • cdn节点故障 • cgi后端访问超时 • Web前台容灾方案 • • • • Html容灾 Js容灾 Css容灾 图片容灾

24.QQ看点图文页优化 • Web后台常见故障 • • • • 单机故障 机房故障 服务雪崩 外部攻击 • Web后台台容灾方案 • • • • 故障容错 多地部署 过载保护 频率控制

25.Thanks

php直出,Swoole2.0原生协程高性能开发实践--朱新宇@PHPCON2017相关推荐

  1. 小议Python3的原生协程机制

    此文已由作者张耕源授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在最近发布的 Python 3.5 版本中,官方正式引入了 async/await关键字.在 asyncio ...

  2. Generator(生成器),入门初基,Coroutine(原生协程),登峰造极,Python3.10并发异步编程async底层实现

    普遍意义上讲,生成器是一种特殊的迭代器,它可以在执行过程中暂停并在恢复执行时保留它的状态.而协程,则可以让一个函数在执行过程中暂停并在恢复执行时保留它的状态,在Python3.10中,原生协程的实现手 ...

  3. Swoft 2 Beta 发布,基于 Swoole 的云原生协程框架

    Swoft 是首个基于 Swoole 原生协程的框架,从开发到发布据今已有2年多. 1.x 发布以来,已有大量的开发人员和企业使用,得到了大家的认可.从去年11月份开始,将近半年的时间从零开始,底层吸 ...

  4. rabbitmq 查询版本_Hyperf 发布 v2.0.14 版本 | 企业级的 PHP 微服务云原生协程框架

    更新内容 本周主要新增了 hyperf/scout hyperf/resource 和 hyperf/resource-grpc 三个组件,并修复了一些组件的 Bug,继续提升 Hyperf 的稳定性 ...

  5. Swoft 1.0 正式来袭,首个基于 Swoole 原生协程的框架

    历时 1 年多紧锣密鼓的开发,以及愉快而忙碌的春节假期,期间 github star 数从 500 到快破 1k,码云首页推荐,Swoole 作者 Rango 和社区的大力支持,Swoft 1.0 正 ...

  6. python 协程 asyncio_Python 原生协程------asyncio(选自公众号)

    所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyncio 是并发(concurrency)的一种方式.对 Python 来说,并 ...

  7. 干货 | 携程基于Quasar协程的NIO实践

    作者简介 Ryan,携程Java开发工程师,对高并发.网络编程等领域有浓厚兴趣. IO密集型系统在高并发场景下,会有大量线程处于阻塞状态,性能低下,JAVA上成熟的非阻塞IO(NIO)技术可解决该问题 ...

  8. 携程基于Quasar协程的NIO实践

    IO密集型系统在高并发场景下,会有大量线程处于阻塞状态,性能低下,JAVA上成熟的非阻塞IO(NIO)技术可解决该问题.目前Java项目对接NIO的方式主要依靠回调,代码复杂度高,降低了代码可读性与可 ...

  9. java 修改最大nio连接数_携程基于Quasar协程的NIO实践

    IO密集型系统在高并发场景下,会有大量线程处于阻塞状态,性能低下,JAVA上成熟的非阻塞IO(NIO)技术可解决该问题.目前Java项目对接NIO的方式主要依靠回调,代码复杂度高,降低了代码可读性与可 ...

最新文章

  1. python 列表算平均分_python平均列表
  2. 在IT技术圈混,怎么能不知道这几个公众号
  3. 深入浅出解释FFT(六)——深入理解fft变换
  4. coreldraw水涟漪怎么做_排骨不论怎么做,都“别先焯水”,记住这2点,排骨鲜嫩无腥味!...
  5. 倒排索引优化 - 跳表求交集 空间换时间 贪心
  6. 微博收藏(机器学习探讨)(二)
  7. 去除下拉框的默认样式
  8. lock和wait+signal
  9. 三种常见单片机时钟电路方案,对比其优缺点
  10. sqlserver循环like变量_numba从入门到精通(6)—numba与循环与并行
  11. 算法入门经典习题第一章
  12. 完全实战-从零开始配置服务器
  13. python面部颜色分析_Python图像处理之颜色的定义与使用分析
  14. win8 开发之旅(5) --五子棋游戏开发
  15. webdis实现Redis的http接口及多数据格式共享 [含json,restful]
  16. 企业大数据分析平台如何构建
  17. c语言操作数据库sql
  18. git切换到旧版本_git如何更新到指定版本,然后再更新到最新版本
  19. 图片批量转换为C语言数组工具
  20. 高洛峰ajax分页源码,PHP 分页类 高洛峰 细说PHP

热门文章

  1. html两个圆相交,Word怎么将两个圆交叉重叠部分填充阴影?
  2. 师范网络教育计算机作业答案,北京师范《计算机应用基础》作业
  3. 合并或注销重复领英帐号
  4. Nginx启动不了原因解决
  5. 曲面屏手机之战:不再直的手机朝哪弯?
  6. 炒股秘笈 好的心态与好的习惯
  7. 成功没有捷径,这些在麒麟班的同学是这样学习的
  8. golang web框架 beego 学习 (七)json转数组
  9. JS变量、属性、方法、函数的相同点和区别
  10. 卸载python出现白屏