当前位置: 首页 > 后端技术 > PHP

Seata-php半年计划

时间:2023-03-29 15:44:37 PHP

文章|赵欣(昵称:余宇):蚂蚁集团Seata项目开源总监,OpenAtom开源基金会代码贡献明星郭成(昵称:星贝):Seata-php项目联合发起人、蚂蚁集团技术专家刘越建:Seata-php项目联合发起人,Hyperf开发团队成员,广东快客电子商务有限公司高级后端工程师。Seata的PHP语言实现,实现了Java和PHP的互通,让PHPer可以使用seata-php实现分布式事务。Seata是一个非常成熟的分布式事务框架,是Java领域分布式事务技术事实上的标准平台。Seata目前正在构建其多语言系统[1],其中包括目前常用的五类语言:Java、Go、Python、JS和PHP。目前的情况是后四种语言都是基于SeataJava版构建对应语言的实现。除了在追求Seata多语言系统的过程中因为开源的价值而需要搭建Seata的PHP版本之外,PHP语言在电子商务和金融交易场景中作为搭建的重要角色仍然被广泛使用Web1.0时代的技术基础LAMP架构。而这些场景对数据一致性的要求非常强,这是构建seata-php的最大动力,也是其技术价值所在。部分。1--Seata架构和多语言系统图片来自Seata官网。Seata的整体架构由以下角色组成:-TransactionCoordinator事务协调器,简称TC,维护全局事务和分支事务的状态,驱动全局事务的提交或回滚。-TransactionManagerTransactionManager,简称TM,定义了全局事务的范围,提交或回滚全局事务。-ResourceManagerResourceManager,简称RM,与分支事务在同一个应用中,注册分支事务,报告分支事务的状态,驱动分支事务的提交或回滚。从C/S通信架构来看,TC是服务端,TM和RM是客户端。Netty框架用于TC和TM与各个RM之间的长链路通信。具体来说,SeataJava版的通信协议在四层TCP协议之上定义了一套私有的二进制双向通信协议,通信框架使用Netty。其他四种语言只要按照Seata的通信协议标准实现通信功能,就可以在多语言生态中任意语言之间进行通信和调用服务。三个角色中,TM和RM以SDKAPI的形式被上层APP调用,而TC部署在一个独立的进程中,可以用任何语言实现。都说懒惰是程序员的第一美德。既然SeataJava已经实现了Java版的TC,就不用在多语言系统中为其他语言做重复的工作了。只需要构建对应语言的TM和RM的SDK即可。API封装,只需要与SeataJavaTC通信即可。部分。2--Seata与PHP技术分布式事务技术是微服务技术体系的一部分。搭建SeataPHP首先需要选择它的微服务技术平台。seata-php目前使用的微服务框架是Hyperf。PHP以其低进入门槛而闻名于业界。目前常用的微服务框架有Laravel和基于其构建的Lumen。Laravel框架最大的优势就是生态丰富,组件种类繁多。如果说Laravel可以与Spring框架相提并论,Lumen就是SpringBoot。但它的缺点是性能堪忧。比如在普通的8C机器上,运行只运行echo逻辑的HTTP服务,吞吐量只有1KQPS。Hyperf框架是近几年国人基于Swoole开发的微服务框架。其特点如下:1、与Nginx类似,Hyperf以多进程的形式驻留在内存中,每个进程都有一个弹性线程池。一般情况下,Hyperf收到调用请求后,可以保证在1ms内分配好服务线程,而Lumen的响应时间通常在10ms左右;2、由于Hyperf服务常驻内存,稳定性好,资源利用率当然比运行在CGI机制上的Lumen要低很多;3、Hyperf的请求处理过程借鉴了Go语言的机制,其运行层以异步的方式对上层执行同步用户调用。与Lumen相比,它的吞吐率更高,延迟更低。比如使用Hyperf在同一个环境下实现同一个echoHTTP服务,可以轻松达到60KQPS;加上Hyperf自身的稳定性和高性能,根据Hyperf服务进程常驻内存的特点,TC可以轻松实现seata-php服务器的RM发起两阶段事务处理,即JavaTC作为Server作为Client向PHP版本的RM发起RPC回调。如果用Lumen作为seata-php的微服务框架,几乎不可能实现这个技术点。部分。3--快速入门seata-php基于Hyperf微服务框架。seata-php实现了AT事务模式,并提供了测试用例。本章的目的是基于已有的实现,让对seata-php项目感兴趣的同学能够快速上手seata-php。3.1--搭建PHP开发环境使用Hyperf/Box是一款可以快速搭建开发环境的工具,并且可以与其他自建开发工具链隔离,避免污染日常开发环境。3.1.1下载Hyperf/Box#Macwgethttps://github.com/hyperf/box/releases/download/v0.0.3/box_php8.1_x86_64_macos-Obox#Linuxx86_64wgethttps://github.com/hyperf/box/发布/下载/v0.0.3/box_php8.1_x86_64_linux-Obox#Linuxaarch64wgethttps://github.com/hyperf/box/releases/download/v0.0.3/box_php8.1_aarch64_linux-Oboxsudomv./box/usr/local/bin/boxsudochmod+x/usr/local/bin/box#在https://github.com/settings/tokens/new创建token后,在boxboxconfigsetgithub.access-token注意:-如果您是第一次使用Mac用户,您需要在“系统偏好设置”-->“安全和隐私”中对Box工具进行授权;-经测试,X86Box可以在M1版本的Mac上使用;-使用Box时,需要repo和工作流来创建GitHub访问令牌权限。3.1.2配置PHP环境下载完Box后,继续下载PHP8.0版本#Downloadphp8.0boxgetphp@8.0#设置box为php8.0版本boxconfigset-php-version8.03.1.3下载composer#下载composerboxgetcomposer3.2--runseata-php环境搭建好后,找一个目录存放seata-php项目的代码。#找个地方创建目录mkdir./seata#进入目录cd./seata#下载seata骨架包gitclonehttps://github.com/PandaLIU-1111/seata-skeleton#下载seata/seata-php组件包gitclonegit@github.com:seata/seata-php.git#进入seata骨架包cdseata-skeleton#执行composer更新项目中的组件包composerupdate-o#查看是否用seata/seata-php软连接ls-alvendor/hyperf/|grepseata#命令执行后查看是否有如下内容...seata->../../../seata-php///与seata/seata-php包建立软链接...#启动项目boxphpbin/hyperf.phpstart此时可以看到seata-php运行成功,在命令行可以看到seata-php客户端和SeataJavaserverTC的交互信息。3.3--项目代码风格Seata-php遵循PSR-1代码规范[2]。社区提供了类似Go语言的代码格式化工具gofmt-composercs-fix,具体用法为:#格式化文件composercs-fix${FileName}#格式化目录composercs-fix${DirName}3.4--测试用例目前seata-php只提供单体测试用例,放在项目tests目录下,这些单体测试用例可以直接通过composertest命令执行。我们将在不久的将来在GitHubaction上配置这些单个测试用例,以测试每个提交的PR。下一步,我们将补充像seata-go这样的集成测试用例,并配置每个PRonGitHubaction来自动测试项目。部分。4--下半年规划Seata-php现有工作只是下半年万里长征的第一步,还没有达到生产可用的状态。下半年的总体目标是:1、【事务模式】对齐9月发布的SeataJavav1.6.0的TCC、AT、SATA、XA模式;2、【测试用例】单体测试覆盖率达到70%以上,并实现了两种模式下SeataJava现有集成测试用例的PHP版本;3、【代码示例】实现了两种模式下SeataJava中现有示例的PHP版本;4.【文档构建】构建API接口层的详细文档;5、【生产案例】3个以上实际生产用户;6.【社区建设】培养5个以上SeataCommitter。以上目标可以理解为seata-php社区的KPI。为实现目标,有以下实施方案,可分为“三步走”。4.1--发布可用版本这是第一阶段。我们计划在国庆前后发布第一个GA版本。具体技术点如下:1.实现TM和RM作为分布式事务的发起者。TM在与下游微服务应用通信时,可以在gRPC协议中,传递事务上下文,下游服务也可以随时加入事务。2、实现分布式锁API,防止一期和二期之间的业务数据因为并发被修改,导致二期提交和回滚失败。3.实现TCC和AT模式完全实现TCC模式。AT模式取决于具体的DB类型和DB版本。我们将数据库限制为MySQLv5.7。在此之上,支持最基本的INSERT和UPDATE语句,基本可以覆盖大部分实际应用场景。4.支持注册中心支持注册中心的目的是方便TM和RM发现TC的微服务。将支持File和Nacos两种服务发现方式。优先支持文件服务发现方式。好处是在K8s环境下,可以通过环境变量或者挂载configmap实现动态配置,不需要依赖手动更改。其次,支持Nacos作为注册中心的服务发现方式。目前国内主流云厂商阿里云、腾讯云、华为云等均支持Nacos注册中心,方便用户进行服务对接。5.其他如自动化单元测试、集成测试和项目样本。社区在seata-phpissue上将第一阶段涉及的任务全部发布为任务,可以方便的查看任务负责人,及时跟踪项目进度(直接查看当前进度)_。4.2——技术能力全面对接这是第二阶段半年目标。这个阶段出品的版本会是一个比较完整的版本,可以覆盖大部分业务场景,降低开发者使用seata-php的门槛和成本。关键技术点如下:1.除了对这两种模式进行补充实现XA和SAGA模式外,还将继续完善AT模式支持的SQL,可以支持大部分SQL语句。2、支持配置中心支持配置中心的目的是为了方便拉取交易相关的配置。初步方案支持三种配置方式:File、Nacos、Apollo。3、支持gRPCSeataJavav1.6,计划9月发布,将支持gRPC通信。Seata-php也会在第二阶段支持这种RPC动员方式进行事务传播。4、其他数据库先支持更多的MySQL版本,比如v8.0。并支持PostgreSQL、OceanBase、Redis等更多类型的DB。5、事务异常处理提高分布式事务抗挂起能力,自动处理请求幂等、空提交、空回滚、资源挂起等事务异常逻辑。第二阶段的时间节点截止日期大概在今年11月底左右。4.3--社区建设的前两步主要针对seata-php本身的技术能力建设。至此,seata-php在技术上可以算成熟了。这两步的推进首先取决于社区自身的健康发展。毕竟开源项目需要社区同学来推动。目前社区由于先生负责开发和拓展,星贝先生负责推动整体项目的实施。目前,有4个代码贡献者。当然,我们也欢迎更多的同学参与到seata-php的代码建设中来。在提交问题和PR时,建议尽可能完整地描述相关细节。例如:提交bugissue时-标题可以写:bugfix:NotFoundClassRediswithPHPversionis7.2-内容可以提交bug的详细信息,现象的详细信息,对应的堆栈信息,预期的情况,以及当前环境,发生了什么,修复意见,以及补充信息,当前环境状况等信息。提交PR时-标题可以写:Feature:AT模式需要支持pgsql-内容可以写:这个Feature的含义,预期用途,以及其他相关信息。该步骤与前两步同时进行。部分。5--总结Seata-php以SeataJava为基准,初期主要是推动代码的进步。作为一个开源项目,seata-php的开源价值当然是用在了用户的生产环境中,生产用户也是社区建设的一部分。目前有两个用户愿意在自己的开发测试环境中对seata-php进行验证,以帮助提高项目的稳定性、易用性和代码质量。为了维护项目和社区的健康持续发展,开源项目的贡献者不仅包括编码的代码贡献者,还包括文档贡献、产品推广、品牌推广等方面的贡献者。我们会组织热心的社区参与者在各大技术论坛发布博客,在语音、视频网站和技术会议上推广技术干货和制作案例。欢迎对这些工作感兴趣的朋友加入社区钉钉群44788115与我们交流。【参考文件】1.《Seata 多语言体系建设》:https://mp.weixin.qq.com/s/UwzscqfuCYtsSdWYj-t-uQ2.《PHP PSR-1 代码规范》:https://www.php-fig.org/psr/psr-1/本周推荐阅读Seata在蚂蚁国际银行的实践Seata多语言系统构建深入HTTP/3(二)|SSLGo原生插件使用全解析,不那么枯燥欢迎扫码关注我们的公众号: