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. css3-transform
  2. mvn 默认scope_maven scope 的作用
  3. 沈阳生态所在保护性耕作促进农业可持续发展方面取得新进展
  4. hive相对于oracle的优点,【Hive】Hive面试题
  5. 某小公司项目环境部署演变之路
  6. 【收藏】CentOS 7 安装NFS
  7. jooq和jdbc_将jOOQ与JDBC比较
  8. Fibonacci数列使用迭代器实现
  9. Hadoop: The Definitive Guide (3rd Edition)
  10. [CentOS]CentOS下编译CPP文件时报错[undefined reference to `__gxx_personality_v0' collect2: ld]的解决办法...
  11. 深入理解PHP之数组(遍历顺序)
  12. python开发服务程序_Python 编写Windows服务程序:将Python作为Windows服务启动 | 学步园...
  13. linux软链接删除重新创显示,Linux 下如何创建 /删除软连接
  14. 面向生态合作伙伴的实践分享回顾
  15. .EXE病毒解决(U盘中文件夹不见,显示原文件夹后缀.exe)
  16. php爬虫严选,用 Python 爬取网易严选妹子内衣信息,探究妹纸们的偏好|python爬虫|python入门|python教程...
  17. 怎么制作U盘启动盘来安装系统
  18. 如何用计算机名添加的打印机,如何添加打印机,小编教你添加共享打印机的方法...
  19. 你知道上海社保缴费基数吗?上海各类人员的社保缴费基数
  20. linux vim编辑器命令,Linux之VIM编辑器命令

热门文章

  1. runoob python3_Runoob-Python3:Python3 基本数据类型
  2. Brightree发布针对居家健康和临终关怀助理的BrightreeCARE App
  3. 智慧人生 段子29则
  4. Unity3D游戏开发
  5. win7修改本计算机端口,教你如何修改win7旗舰版系统远程桌面端口
  6. 联想小新M7208W一体机扫描功能恢复
  7. 有序集合对象 ZSet 的底层原理
  8. c语言欺凌,首次对学生欺凌进行定义!未成年人保护法作出大幅修订
  9. Altium Designer 6.9的下载安装地址及破解方法
  10. James邮件服务器搭建