摘要:年月日,在上海举行的第六届中国开发者大会上,腾讯开源项目首次全面发布版本,阅文集团高级开发工程师梁晨对如何通过构建高性能框架做了经验分享。分享内容作为腾讯开源的框架,在发布之后即受到开源领域的关注。阅文集团本身也有一块新的业务在使用。
2018年5月19日,在上海举行的第六届中国PHP开发者大会(PHPCon)上,腾讯开源项目TARS首次全面发布PHP版本,阅文集团高级开发工程师梁晨对PHP如何通过TARS构建高性能RPC框架做了经验分享。
TARS作为腾讯开源的RPC框架,在发布之后即受到开源领域的关注。它在微服务、协议、多语言和运营体系上的支持,都非常的完善。在微服务方面,实现了服务自动发现、智能调度、容灾容错、柔性熔断,以及路由与灰度的功能。与此同时,通过使用私有二进制协议,可以有效的降低服务之间调用的流量。而在语言支持的层面,TARS对C++、Java、Nodejs、PYTHON都提供了比较好的方案。考虑到PHP在WEB后台领域的使用非常的广泛,TARS-PHP的出现,势在必行。
那么在设计TARS-PHP的时候,必须考虑到现有PHP的开发生态,至少要做到 功能完善、灵活、轻量和高效。在功能方面,TARS-PHP对标了现有的C++、JAVA、NodeJS的功能体系,做到了对CLIENT能力和SERVER能力的支持。而在灵活方面,PHP一直是出类拔萃的,作为泛型脚本语言,开发的过程,谁用谁知道。而在轻量设计方面,TARS-PHP遵循一个最简化、轻量级、可插拔的设计想法,让整个方案自成体系的同时,也能具备最大程度的可扩展性。最后,也是最重要的,高效。通过引入PHP业界优秀的SWOOLE框架,再结合SWOOLE2.0的协程能力,让TARS-PHP插上协程的翅膀。
TARS-PHP的解决方案,按照功能模块,会分成以下四个部分:
TARS-CLIENT
TARS-EXT扩展
TARS-SERVER
开发效率模块
TARS-CLIENT
对于熟悉TARS-PHP的同学来说,TARS-CLIENT的能力在半年前就已经开源,并提供使用了。本次TARS-PHP的重新设计,也对TARS-CLIENT现有的能力做了一个梳理。全新设计之后的TARS-CLIENT具备了配置统一化、一键调用、以及多种网络能力的特点。而在功能上,集成也更为丰富了,现有的TARS-CLIENT由如下的功能模块组成:
自动寻址:CLIENT再也无需关系服务地址
主调上报:调用情况会默认进行主调上报,服务情况一览无遗
远程日志:日志可以写入远程服务,再落地,降低文件IO的损耗
网络能力:SOCKET、SWOOLE同步、SWOOLE协程
全新设计后的TARS-CLIENT,既可以满足后台系统的SOCKET请求需求,也能够满足在SWOOLE中进行同步和协程的两种调用需求,用户只需要灵活的按照配置各取所需。同时,全新集成的自动寻址、主调上报、远程日志功能,会让用户在使用的时候,更加的无感知,更加的顺畅。
下面即是现有TARS-CLIENT的使用demo:
可以清晰的看到,统一化的配置,层级更为清晰,而且调用者无需关心底层细节,寻址和主调上报已经悄然完成。
再从整体的角度来看一下TARS-CLIENT的方案:
从图中可以更为清晰的看到底层实现的细节。对于自动寻址而言,实现自动并不完全解决问题。因为每次都去询问服务的地址,会给主控服务带来很大的压力。因此结合了PHP本身的能力之后,选用了SWOOLE TABLE和本地文件作为缓存的方式。缓存时间由服务启动时默认指定,那么在这个时间之内,便不会再次进行主控的请求。降低了主控压力的同时,也降低了本地获取服务地址的耗时。
而如下图所示:主调上报的策略中,也能够根据实际的网络收发情况,进行耗时、失败率、超时率、服务端异常的及时上报,方便业务尽快发现和定位问题。
TARS-EXT扩展
在TARS-CLIENT的底层,包含很多二进制协议的打包解包工作。而这些字符串的拼接和拷贝的操作恰恰是PHP的弱项,因此非常有必要将其抽象出来,作为独立的PHP扩展模块开发。
在现有扩展的体系中,主要包含了对高性能和稳定性两方面的考虑。高性能方面,字符串操作完全通过纯C语言进行了实现。而同时通过合理设计接口,避免一次组包的多次操作,从而进一步提高效率。
而在扩展的稳定性方面,通过引入phpt的扩展标准测试,以及Valgrind工具进行内存泄露测试。测试代码覆盖率达到了80%以上。同时每次进行内部版本代码提交的时候,会自动触发从PHP5.6~PHP7.2的主流版本自动构建测试,并在发生构建异常的时候,发送邮件。
下图中可以清晰的看到,相比于原有的使用纯PHP打包解包的方式,使用扩展的方式,在简单协议的情况下,打包效率提升了16倍,解包效率提升了14倍。而在复杂协议的情况下,同样效率的提升也达到了12和9倍之多。
TARS-SERVER
PHP作为SERVER走过了一段相对比较曲折的道路。最早时候,PHP是作为Apache的一个模块,来提供HTTP-SERVER的服务的。后来在Nginx越来越盛行的情况下,PHP_FPM应运而生。它比Apache的预先申请所有进程的方式稍好一些,但是仍然受制于进程资源和接受请求的能力,因此效率并不是很高。在这种大背景之下,SWOOLE应运而生,它基于多进程的模型,常驻内存并且使用epoll的事件驱动模型来处理收到的请求。因此在IO能力上甩之前的解决方案好几条街。而在去年,SWOOLE2.0的出现,内置协程,同步编程的同时享受异步IO,更是如虎添翼。
基于此,TARS-SERVER的解决方案也会以SWOOLE作为底层的运行环境,开发出了TARS-HTTP-SERVER、TARS-TIMER-SERVER和TARS-TCP-SERVER,并且三个框架合一,只需简单配置,即可顺畅使用。
上图中,可以很清晰的看到强大的TARS-SERVER能力。除了提供最底层的三种基本SERVER类型之外。我们还提供了TARS-UTILS用来处理配置文件解析,TARS-Report用来进行服务保活的定时上报,TARS-Config用来拉取平台下发的配置,TARS-Property用来进行特性上报,以及TARS-Deploy模块进行业务代码的打包。这一整套的体系,使得TARS-SERVER的使用者既能够实现自己的业务逻辑,也能够针对性的进行拓展。可谓一举两得。
总的来看,我们的TARS-SERVER,基于SWOOLE 1.x和2.x,同时能够很顺畅的支持灵活的配置,如SWOOLE的配置和用户自己的配置。除此之外,TARS-SERVER通过自动生成的注解进行请求的路由,开发者完全不需要关心,只需要关注于实现自己的业务逻辑即可。而另一方面,TARS-SERVER还额外提供了一个管理端口,用来接收平台下发的指令,如SHUTDOWN、配置下发等等。
TARS-HTTP-SERVER为了满足逻辑层服务的需求,进行了专门设计。一期中包括了GET/POST基本支持、Cookie/Status标准支持、极简的路由组件实现、FILE上传功能模块以及服务可用探测接口模块。
而TARS-TIMER-SERVER的使用也非常方便,只需如下代码:
时间可以灵活控制,同时所有定时服务放在一起也非常的方便管理。TIMER在服务启动的时候,也会自动启动,无需再次触发。TIMER的数量,只受制于SWOOLE启动时候的进程数量,开发者可以灵活的调配。
对于开发者非常关心的服务性能,我们也针对不同的接口、版本、CLIENT进行了压测,结果如下:
从数据来看,还是非常的令人满意。空跑的HTTP SERVER QPS最高达到了23万。而使用了协程CLIENT之后,在混合RPC调用的情况下,仍有2万1的QPS,相比于同步CLIENT,提升了50%左右。充分说明了协程CLIENT对于性能的提升作用明显。
开发效率
在进行TARS-PHP设计的时候,一个必须要考虑的问题,就是开发效率。为了遵循TARS本身的设计理念,TARS2PHP工具也进行了全新的升级,通过配置文件的方式,同时兼容了客户端代码和服务端代码的生成,配置文件中会包含服务信息、TARS文件信息、命名空间信息等等:
从下图中,能够更加明显的看到整个开发的路径:
由此,通过TARS文件、TARS2PHP工具,就能够完全实现客户端和服务端的代码生成,并且两端通过协议完全解耦,大大提高了开发效率。
TARS-PHP在阅文
TARS-PHP在阅文经过了一年多的验证和使用,也逐步趋向成熟,越来越多的业务开始了解和使用TARS-PHP这套方案,并为他们在实际的开发和运维中带来了收益。
从下图中可以非常明显的看到TARS与TARS-PHP在运维的使用情况:
模板拼接的Node HTTP服务有10+,逻辑API层PHP服务与定时服务 40+,后台TCP服务100+,每日之间亿级调用。
后续规划
随着TARS-PHP整套方案越来越成熟,希望更多的公司和开发者能够加入进来,共同建设。考虑到不同公司使用的框架并不相同,因此我们的模块化设计做得非常彻底,在对SWOFT框架进行接入的过程中,模块化的方式体现了非常大的成效,只需要半天到一天的时间即可完成。后续TARS-PHP也会进一步丰富CLIENT能力,同时支持更多的现有框架,在提高稳定性的同时,对SERVER本身的功能丰富性,再做提升。TARS-PHP,等你来!
问:一个中小型的公司如何使用TARS
答:其实tars本身并不是非常的重量级,它主要是包含了一个一体化的运维系统,以及专注于业务开发的一个rpc体系。阅文集团本身也有一块新的业务在使用TARS。项目的机器规模也只是在几十台机左右,所以对于中小企业的公司来说,TARS也是一个可行的方案。
问:搭建一个TARS平台成本比较高 如何解决这个问题
答:我们看到dockerhub 上面已经有了开发者 热情的开发者,做出了一套包含环境的Docker容器,我们会考虑功能是否完善,把它合进来或者是制作官方的镜像,这样用户在运行的时候就会非常方便了。
问:TARS-PHP对于不同通信和二进制协议本身的支持怎么样
答:现在TARS-PHP TCP服务支持的协议,仅限于TARS二进制协议本身 但同时我们也提供了一些配置方式和接口,供大家实现自己的协议。而使用HTTP SERVER的话,协议都是可以自己选择的,比如JSON等等。
问:对于将已有PHP+Swoole1.x的项目迁移至TARS上,需要注意什么问题以及有没有比较合适的解决方案
答:阅文集团之前也是各个PHP项目分别独立部署在服务器上,没有接入TARS平台,但在去年经过1个月左右的改造已经全部迁移至TARS平台,将已有项目迁移至TARS平台除了需要对项目做一些必要的改造之外还需要保证后端TCP服务也已经接入TARS,迁移可能会有一些成本,但是之后便能享受到TARS平台带来的一系列的红利。
https://github.com/Tencent/Ta... php目录内下载
对TARS使用还有任何问题,欢迎加入QQ交流群:
TARS交流群: 群号669339903 TARS-PHP交流群:群号:769531734
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/30796.html
摘要:月日,在上海举行的第六届中国开发者大会上,腾讯开源项目首次全面发布版本,阅文集团高级开发工程师梁晨对如何通过构建高性能框架做了经验分享。腾讯开源项目贡献者,腾讯开发组成员,对于构建高性能后台微服务治理有丰富的经验。 5月19日,在上海举行的第六届中国PHP开发者大会(PHPCon)上,腾讯开源项目TARS首次全面发布PHP版本,阅文集团高级开发工程师梁晨(Ted)对PHP如何通过TAR...
摘要:引言作为由腾讯公司开源的优秀框架与服务部署运维解决方案,被阅文集团引入了实际实践中,同时阅文集团对在语言层面进行了能力的补全,令如虎添翼。作为腾讯公司的优秀框架与服务部署运维解决方案,可以满足上述的所有需求。 梁晨(Ted),任职阅文集团技术中心,负责起点中文网的WEB后台开发工作。曾负责腾讯上海企业产品部营销QQWeb后台开发、QQ公众号Web后台开发,对大型网站技术架构,有自己的经...
摘要:大会是由国内容器社区组织的专为一线开发者和运维工程师设计的顶级容器技术会议,会议强调实践和交流,话题设置围绕容器运维云计算等技术领域,力求全方位多角度为参会者解读容器技术。 @Container大会是由国内容器社区 DockOne 组织的专为一线开发者和运维工程师设计的顶级容器技术会议,会议强调实践和交流,话题设置围绕容器、运维、云计算等技术领域,力求全方位、多角度为参会者解读容器技术...
摘要:勤学学习效率与效果取决于执行力。这一步学习的正确姿势是在实践操作中发掘问题,然后带着问题找答案。拆分任务将目标分解成具体可执行的学习任务。勤学强大的执行力是学习的根本保障。分享复述检验学习成果,提高学习效果的最好方法。 showImg(https://segmentfault.com/img/bVbcPGZ?w=256&h=256); 前段时间和大家一起分享了一篇关于学习方法内容《大牛...
摘要:月日日,由主办的人工智能与机器学习创新峰会在上海海神诺富特大酒店圆满结束。签到现场,秩序井然本次峰会汇聚了超过位国内外顶级人工智能专家及一线技术大咖。本届峰会共设置了个专题,大主题分会场并行。话题主要围绕知乎搜索排序召回展开的。 人工智能的迅速发展深刻改变了世界的发展模式和人们的生活方式。5月18日-19日,由msup主办的A2M人工智能与机器学习创新峰会在上海海神诺富特大酒店圆满结束...
阅读 2016·2021-11-12 10:36
阅读 1865·2021-11-09 09:49
阅读 2589·2021-11-04 16:12
阅读 1144·2021-10-09 09:57
阅读 3234·2019-08-29 17:24
阅读 1908·2019-08-29 15:12
阅读 1272·2019-08-29 14:07
阅读 1284·2019-08-29 12:53