欧易

欧易(OKX)

国内用户最喜爱的合约交易所

火币

火币(HTX )

全球知名的比特币交易所

币安

币安(Binance)

全球用户最多的交易所

房产基于Swoole的PHPRPC框架设计

时间:2022-10-20 22:34:26 | 浏览:2001

导语本文基于业务的实际场景出发,重构异步驱动的PHP微服务框架,实现了对接跨平台跨语言的微服务管理能力,保证了PHP在开发效率和运行效率的兼容,希望能够对PHP开发同学实现高并发的服务有所帮助。背景58内部常用的微服务框架(SCF)是基于J

导语

本文基于业务的实际场景出发,重构异步驱动的PHP微服务框架,实现了对接跨平台跨语言的微服务管理能力,保证了PHP在开发效率和运行效率的兼容,希望能够对PHP开发同学实现高并发的服务有所帮助。

背景

58内部常用的微服务框架(SCF)是基于Java技术栈的,而房产租房业务开发通常采用的是PHP技术栈,在运行机制和模式与Java有着诸多的差异。在接口不多,系统与系统交互较少的情况下,用Http接口能够快速实现跨系统/服务的调用,但是随着租房业务的蓬勃发展,内部的子系统/项目越来越多,系统架构也由集中式架构向分布式架构转变,Http的接口调用无论是代码层面,还是在性能层面已经不能满足日渐复杂的应用系统发展能力,开发的同学会经常面临如下的情况:

  • Http接口需要配置Nginx负载均衡,一旦故障/重启则会影响下游的调用方,直接影响服务的可用性。

  • 大部分是基于Json的格式传输,字节大小和序列化相比二进制传输更消耗性能。

  • 调用纷繁复杂的上游域名,路由眼花缭乱,令后续的维护成本骤升。

  • 服务的耗时,响应,扩容以及安全性都有待弥补。

由于PHP作为解释型语言,在请求结束即释放所有资源的特性,在持久化服务注册发现和心跳检测的实现上有一定的难度,针对PHP此特性业内通用有两种做法:服务代理扩展和长驻内存能力实现,代表分别为微博的Agent和腾讯的Tars-php。鉴于公司内部已有成熟的微服务管理平台(SCF)可供对接,PHP的技术栈只需要实现服务层处理能力&&接入服务管理平台即可快速提供服务,也因此,为了提升服务的可用性和调用效率,提升应用系统的稳定性,房产租房业务部门内部孵化了基于Swoole的常驻内存RPC框架。

SCF RPC架构图

技术目标

1、高发并支持

PHP作为解析型语言的代表,每次执行都需要将PHP代码转为Opcode数组(PHP7增加了抽象语法树,分析阶段生成AST),然后由Zend引擎来执行,并释放响应资源,鉴于Fpm的传统同步模式都需要开启大量进程保证并发,造成CPU上下文切换频繁和资源的相对浪费。因此新的服务框架需要具备以下特点:

  • 支持事件驱动的异步编程模式,支持多线程Reactor模式处理网络请求,能够应对大量链接的情况。

  • 具备同步/异步/协程实现能力。

  • 避免每次请求都重新解析,创建,销毁的空转流程。

  • 支持IPC通信。

Swoole Reactor说明图

2、快速部署

  • 能够兼容房产现有框架的开发测试监控流程。

  • 支持集团云服务管理平台&&代码发布平台。

3、监控&统计上报能力

  • 支持函数的自动化注册能力,鉴于PHP并无Maven pom配置文件,也无注解(Annotation),为保证系统开发的便捷性需要能够实现函数的映射&注册能力。

  • 服务调用异步统计&上报,支持识别服务的访问,访问耗时,执行耗时,异常,抛弃等状态的捕捉和上报。

  • 支持对服务管理平台的长连接心跳检测,保证服务侧可用状态维护及对应熔断能力。

4、序列化&反序列化服务

  • 通用性,能够支持丰富的数据结构类型并实现跨语言跨平台的序列化和反序列化能力,保证序列化性能的同时也要保证服务的可用性。

  • 鲁棒性,一旦出现内部结构扰动,可以有效避免序列化/反序列化的带来的不确定性。

  • 可扩展性&可读性。

由于系统升级的不可避免性,序列化协议应该具备良好的可扩展性,支持自动增加新的能力而不影响老服务。简化序列化流程,保证开发同学能够通过较低的学习和接入成本来共同接入。

5、通用组件支持

对开发同学常用的组件如redis服务(Wredis),个性化监控打点服务(Wmonitor),分布式KV,KList系统(Wtable)等工具和服务有着友好的接入能力,能够由同步编程驱动快速切成换异步编程驱动处理业务逻辑。

Swoole RPC 进程解析图

6、服务治理

为了系统能够在并发量峰值场景下提供稳定可靠的服务,服务需要有效实现如下内容:

  • 服务的注册和发现:服务启动时通过独立进程,上报ip,端口,服务详情等信息至服务管理中心,由服务管理中心实时更新。

  • 服务的限流,熔断,降级:避免对挂起服务的请求造成服务的不可用蔓延至整个集群,熔断器和限流器的令牌算法保障服务的可用性。

  • 服务的配置中心能力。

技术难点

1、如何实现服务层的序列化/反序列化

架构平台部提供的RPC客户端( SCF -client)是基于Fpm同步进程的架构体系的,为了提升序列化的性能会将实体序列化至Apcu中,但是锁的粒度较粗,高并发的情况下会存在锁的竞争,一方面性能较差,另一方面会造成异步处理进程阻塞乃至异常退出。针对这种情况我们重构了服务层的序列化框架,舍弃对Apcu的依赖,降低资源的线程式读取,避免无效类的抽象,精简反序列化和序列化流程,精简80%代码,聚焦核心流程。

SCF Client重构流程图

2、服务层如何实现高效的心跳检测&统计&上报

持久化服务层需要保持长连接和服务管理平台实现心跳检测和调用上报,在这方面架构平台提供了相应的扩展初始化了独立的进程支持来实现心跳检测和服务调用上报协议,服务层实现函数的调用即可统计。但是由于服务层的运行机制,众多Worker之间是内存隔离的,如果将心跳检测进程依赖于任何一个worker进程,那么在处理一定的Tcp请求后Worker会自动关闭,造成上报进程也会随之关闭,因此我们将心跳上报进程在Manager进程启动时Fork出来,然后通过持久化的task进程来实现上报,worker处理完Tcp请求后,将任务投递到task中实现异步收集和上报。

3、 怎么从同步编程切换为异步非阻塞的模式

众所周知,PHP常用Fpm运行模式是同步处理请求的,如果我们调用4-5个微服务应用( SCF) 服务时,耗时是串行累加的,而在服务层通过协程(用户态的线程)在网络IO处理的时候是可以跳过去执行其他的业务逻辑,也就是可以并行的发起后端的请求,一旦请求完毕则会将结果放在一个Channel中去供下游逻辑使用。假设一个服务中调用其所依赖的其他服务共N个请求&每个请求耗时相等,那么总耗时仅为同步的1/N(如果N个服务耗时不等,总耗时=max(子请求耗时)),极大提升了服务吞吐能力。

系统架构

PHP 微服务架构图

  • 服 务侧动态化配置能力,在启动时依据服务层配置文件和业务层配置文件分别启动不同的能力,灵活定制服务侧能力,同时通用框架文件,配置信息常驻内存,避免每次请求处理都需要编译执行通用信息。

  • 启动过程中基于业务类的反射配置,获取业务模块的函数信息,参数等,自动注册至服务管理平台,并监听指定的Tcp端口。

  • Tcp请求通过框架级的序列化/反序列化通用能力(W SCF )将二进制流转化成可供PHP识别的变量和参数,调用路由映射类将请求分发至指定的类实现业务逻辑需求。

  • 通过协程并行请求后端的资源能力,通过池化设计能力,降低链接资源的重复开销,有效复用链接资源。

  • 函数的访问,耗时,执行等统计类信息,基于IPC交付至异步的task进程,避免同步阻塞任务,由异步任务统计至上报扩展,再由上报扩展通信至服务管理平台。

功能设计&实践

1、服务进程启动

服务启动时监听配置文件指定端口,在启动Manager进程时开启上报进程,并将通过反射Map获取的服务名称,函数名称等信息注册至服务管理平台,通过长连接保持心跳检测服务的可用性。

2、序列化&路由映射

Tcp EOF收到完整的二进制字节流后,根据PHP的数据序列化/反序列组件(W SCF) 对字节流定义的字段类型开始序列化/反序列化,获取路由信息以及对应参数信息,转换至PHP可识别的类和函数,然后使用钩子调用对应的路由能力,由对应的业务逻辑处理。

3、协程异步处理 在业务处理阶段,对于依赖的后端服务能力,如微服务框架( SCF) ,Mysql,Redis服务(Wredis),分布式KV,Klist系统( Wtable) 等能力,通过协程实现并行能力请求,如遇到接口请求自动挂起协程,将CPU让给其他协程执行,提升单线程的CPU资源利用率,提高性能。同时持久化后端资源池,降低Tcp资源连接开销,减少本地端口调用并提升系统吞吐能力。

协程流程图

展望&总结

目前已和云平台共同定制了服务侧的开发标准,并推广至公司级平台,面向广大的开发同学,在租房业务线已有连接组和租房组等业务线平稳接入使用,安居客业务线在调研接入阶段,同步的连接模式变更至异步的驱动模式,有效降低对后端资源的开销,充分挖掘了系统的潜力。

作者简介

陈艺天,房产租房技术部。专注于PHP的生态建设和性能提升。先后负责PHP技术栈的W SCF 重构,Wfmanager扩展,PHP微服务能力孵化等工作。

相关资讯

PHP学习Thinkphp框架(1)——关于Thinkphp结构目录和数据库操作

Thinkphp:=> 简介:是由上海顶想公司开发的一款,PHP写成的,开源的MVC框架;官网:http://www.thinkphp.cn下载:https://github.com/top-think/framework 环境要求:

国产PHP框架ThinkPHP与SpeedPHP的浅析对比

本文主要简析两个国产的PHP框架ThinkPHP与SpeedPHP。通过学习发现,它俩在很多方面有着相似但又不同的地方:1.单一入口,二者都是单一入口文件。每个app都需要一个入口文件,且只能有一个入口文件。ThinkPHP生而就有多app

《PHP》什么是PHP框架,为什么要用PHP框架

PHP框架是什么?PHP框架提供了一个用以构建web应用的基本框架,从而简化了用PHP编写web应用程序的流程。这样不但节省开发时间,有助于建立更稳定的应用,而且减少了重复编码的开发。框架还可以帮助初学者建立更稳定的应用服务,这可以让你花更

「PHP发展史」PHP5.2到PHP5.6中新增的功能详解

截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护的 PHP5.2, 其余的一半用户在使用 PHP5.3。因为 PHP 那“集百家之长”的蛋疼语法,加上社区氛围不好,很多人对新版本

PHP开发者的福音,解读PHP异步通信框架Swoole的机制

在中国互联网行业膨胀的12-16年,PHP语言凭借自身易上手,开发周期短的优势,深受各中小企业的喜爱。小编也很荣幸在2009年底进入这一行业,为自己谋生分得一杯羹。但是PHP又先天有它的局限性,导致客户很多需求无法得到满足。大家都知道,P

ZWebPHP基于API的简易PHP开发框架

ZWebPHP 框架设计目的:标准化、体验统一、简单可靠、易于扩展后端PHP框架基于PHP、smarty 构建。基于composer自动加载。完全基于API接口设计,API文档自动生成。权限包含菜单访问权限和API接口访问权限。工具类、数据

PHP组件及框架推荐系列:PHP世界中最好的日志组件——Monolog

这也许,不,就是PHP世界中最好的日志组件—— Monolog所有的 PHPer,请站在巨人的肩膀上。随着 Composer 的普及,PHP 组件化开发思想越来越深入人心,我们没有必要重新自己打造轮子,只要确定需求和目标,设计好软件的架构,

「php框架教程」给PHP初学的你10个最常用的函数

PHP的功能越来越强大,里面有着非常丰富的内置函数。资深的PHP程序员对它们可能都很熟悉,但很多的PHP学习者,仍然对一些非常有用的函数不太熟悉。这篇文章里,我们就列举10个你或许不了解但实用的PHP函数,供大家参考和学习。1. php_c

纯PHP开发的高性能PHPsocket服务器框架

Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架。被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持W

PHP框架开发-如何拥有自己的PHP框架

框架是帮助初学者创建稳定的程序。使得你可以花更多的时间去创造真正的Web程序,而不是编写重复性的代码。框架第一阶段什么是框架?一直以来php框架被广泛利用,多半都是基本mvc架构模式的,国内外框架有HDPHP框架、ThinkPHP、CI框架

可持续更新的PHP框架---是时候有自己的PHP框架了

怎样搭建自己一个PHP框架?PHP写了5年,不想用其他框架,想自己搭建一套mvc oop的框架 可以用别人一些类库,但核心orm 之类希望自己写。这是最近遇到了别人的一个问题,5年时间的PHP资深程序是可以独立开发出自己框架。小编今天带来H

PHP应用中比较好的php框架

PHP的框架很多,有phalcon,kohana ,laravel,Yii,thinkPHP,ROR,HD,,CI,和ROR等,我觉得PHP框架其实本身就是一个工具而已,没有好与不好,只有合不合适。任何东西都没有最好,只是不同的取舍。有人说

PHP框架之ThinkPHP框架

ThinkPHP框架人们习惯性又叫它TP框架,是一个轻量级的国产PHP开发框架,快速、兼容而且简单, ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、

PHP框架的发展背景以及主流PHP框架横向对比

PHP框架的发展背景毫无疑问,Web框架技术在近几年已经得到了突飞猛进的发展和普及,在过去几年里,框架技术的普遍经历了比较大的完善过程,很大一部分可以归因于RubyonRails,以及在其他编程语言中流露出的MVC框架思想。如果你是一个PH

“PHP是最好的编程语言”这19款PHPWeb框架要知道

PHP是主要用于Web开发的服务器端的脚本语言,也用作通用编程语言。Web框架(WF)或Web应用程序框架(WAF)是一个软件框架,来支持Web应用程序的开发,包括Web服务,Web资源和Web API。Web框架能够自动化Web开发中执行

友情链接

网址导航 SEO域名抢注宝宝起名网妈妈知道币圈韩红歌迷网常德新闻头条网暑假工招聘网马可波罗瓷砖资讯上海新闻资讯网寒山寺旅游攻略奶茶加盟网洛阳新闻资讯网明星排行榜美腾科技股票瑞士名表官网石油期货行情网酒楼资讯网阿玛尼奢侈品游乐场资讯网
PHP编程知识网-php开源建站系统、PHP程序员网站开发、php编程工具、php菜鸟教程下载、PHP网络编程教学、php网络编程、php工程师、php菜鸟教程数据库、PHP网站开发、PHP精品源码网站、php程序员入门、php零基础入门教程、php源码搭建网站流程、php从入门到精通第2版、php开发简单网站、php制作网站实例、php网站开发实例教程源代码、php中文网破解版、php中文网。
php编程知识 yoceo.cn ©2022-2028版权所有