热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于分布式事务:Seataphp-半年规划

文|赵新(花名:于雨):蚂蚁团体Seata我的项目开源负责人、凋谢原子开源基金会代码奉献之星郭成(花名:星北):Seata-php我的项目独特发起人、蚂蚁团体技术专

文|

赵新(花名:于雨 ) :蚂蚁团体 Seata 我的项目开源负责人、凋谢原子开源基金会代码奉献之星

郭成(花名:星北 ) :Seata-php 我的项目独特发起人、蚂蚁团体技术专家

刘岳健:Seata-php 我的项目独特发起人、Hyperf 开发组成员、广东快客电子商务有限公司高级后端工程师

本文 5894 字 浏览 12 分钟

导语

艰深地讲,seata-php 是 Seata 的 PHP 语言实现,它实现了 Java 和 PHP 之间的互通,让 PHPer 也能应用 seata-php 来实现分布式事务。

Seata 是一个十分成熟的分布式事务框架,在 Java 畛域是事实上的分布式事务技术标准平台。Seata 目前正在构建其多语言体系[1],整个体系蕴含了目前罕用的五大类语言:Java、Go、Python、JS 和 PHP。目前的态势是后四种语言都根据 Seata Java 版本构建起对应语言的实现。

除了谋求 Seata 多语言体系过程中因为开源价值要求构建 Seata 的 PHP 版本这个起因外,作为构建起 Web 1.0 时代技术根底 LAMP 架构中的要角,PHP 语言在电商和金融交易场景下仍然被宽泛应用。而这些场景对数据一致性要求十分强烈,这是构建 seata-php 最大的诱因,也是其技术价值所在。

PART. 1–Seata 架构与多语言体系

图片来自 Seata 官网

Seata 总体架构由如下角色形成:

– 事务协调器 Transaction Coordinator

简称 TC,保护全局事务和分支事务的状态,驱动全局事务提交或者回滚。

– 事务管理器 Transaction Manager

简称 TM,定义全局事务的范畴,提交或者回滚全局事务。

– 资源管理器 Resource Manager

简称 RM,和分支事务在同一个利用,进行分支事务的注册,报告分支事务的状态,驱动分支事务的提交或者回滚。

从 C/S 通信架构角度来看,TC 是服务端,TM 和 RM 是客户端。TC 与 TM 以及各个 RM 之间应用 Netty 框架进行长链接通信。具体而言,Seata Java 版本的通信协议是在四层 TCP 协定之上又定义了一套公有的二进制双向通信协定,通信框架应用了 Netty。其余四种语言只有根据 Seata 的通信协议规范实现其通信性能,即可在多语言生态体系内任何语言之间进行通信和服务调用。

三个角色中,TM 和 RM 以 SDK API 模式供下层 APP 调用,而 TC 是独立过程部署,应用任何语言实现都能够。据说懈怠是程序员的第一美德,在 Seata Java 曾经实现了 Java 版本的 TC 的状况下,多语言体系内其余语言就没必要再做反复工作,只须要构建其对应语言的 TM 和 RM 的 SDK API 包,与 Seata Java TC 通信即可。

PART. 2–Seata 与 PHP 技术

分布式事务技术是微服务技术体系的一环,构建 Seata PHP 首先须要抉择其微服务技术平台,seata-php 目前应用的微服务框架是 Hyperf。

PHP 在业界以入门门槛低著称,目前罕用的微服务框架有 Laravel 以及在其上构建的 Lumen。Laravel 框架的最大长处就是其生态丰盛,各种组件包罗万象,如果 Laravel 能够和 Spring 框架类比,Lumen 就是 Spring Boot。但其毛病是性能堪忧,例如在一般的 8C 机器上,空跑一个只运行 echo 逻辑的 HTTP 服务,其吞吐量仅有 1K QPS。

Hyperf 框架是近年内呈现的由国人基于 Swoole 开发的一个微服务框架,特点如下:

1. 相似于 Nginx,Hyperf 以多过程模式常驻内存,每个过程内都有一个弹性线程池。失常状况下 Hyperf 收到调用申请后,能够保障 1ms 之内调配服务线程,而 Lumen 的响应工夫常在 10ms 左右;

2. 因为 Hyperf 服务常驻内存的特点,其稳定性好,资源利用率当然比以 CGI 机制运行的 Lumen 低很多;

3. Hyperf 的对申请的处理过程借鉴了 Go 语言机制,其 runtime 层面以异步形式执行下层的用户同步调用,相比 Lumen 其吞吐率高而提早低。例如在同样环境下应用 Hyperf 实现同样的 echo HTTP 服务,能够轻松达到 60K QPS;

除了 Hyperf 本身稳定性与高性能外,依赖于 Hyperf 服务过程常驻内存的特点,TC 能够很不便的对seata-php 的 RM 发动二阶段事务处理,即作为 Server 的 Java TC 对作为 Client 的 PHP 版本的 RM 发动 RPC 回调。如果应用 Lumen 作为 seata-php 的微服务框架,简直不可能实现这个技术点。

PART. 3–疾速入门 seata-php

基于 Hyperf 微服务框架,seata-php 曾经实现了 AT 事务模式,并给出了测试用例。本章节的目标是基于现有实现,让对 seata-php 这个我的项目感兴趣的同学可能疾速入门 seata-php。

3.1–搭建 PHP 开发环境

应用 Hyperf/Box 这个工具可能疾速创立开发环境,并且可能与其余自建开发工具链隔离,防止净化日常的开发环境。

3.1.1 下载 Hyperf/Box

# Mac
wget https://github.com/hyperf/box/releases/download/v0.0.3/box_php8.1_x86_64_macos -O box
# Linux x86_64
wget https://github.com/hyperf/box/releases/download/v0.0.3/box_php8.1_x86_64_linux -O box
# Linux aarch64
wget https://github.com/hyperf/box/releases/download/v0.0.3/box_php8.1_aarch64_linux -O box

sudo mv ./box /usr/local/bin/box
sudo chmod +x /usr/local/bin/box

# 在 https://github.com/settings/tokens/new 创立 token 后,配置到 box 中
box config set github.access-token 

留神

– 如果你是 Mac 用户首次应用的话,须要在“零碎偏好设置”–>“安全性与隐衷”中给 Box 工具进行受权;

– 曾经测试过,X86 的 Box,能够在 M1 版本的 Mac 上应用;

– 应用 Box 时,创立 GitHub access token 权限须要 repo、workflow。

3.1.2 配置 PHP 环境

当 Box 下载好后,持续下载 PHP 8.0 版本

# 下载 php8.0
box get php@8.0
# 将 box 设置为 php8.0 版本
box config set-php-version 8.0

3.1.3 下载 composer

# 下载 composer
box get composer

3.2–运行 seata-php

环境搭建结束过后,找一个目录来寄存 seata-php 我的项目的代码。

# 找个中央创立一个目录
mkdir ./seata

# 进入到目录内
cd ./seata

# 下载 seata 骨架包
git clone https://github.com/PandaLIU-1111/seata-skeleton

# 下载 seata/seata-php 组件包
git clone git@github.com:seata/seata-php.git

# 进入到 seata骨架包内
cd seata-skeleton

# 执行 composer 更新我的项目内的组件包
composer update -o

# 查看是否与 seata/seata-php 建设软连贯
ls -al vendor/hyperf/ | grep seata

# 查看命令执行后是否有以下内容
...
seata -> ../../../seata-php/  // 与 seata/seata-php 包建设软连贯
...

# 启动我的项目
box php bin/hyperf.php start

至此,即可看到 seata-php 运行胜利,在命令行中能够看到 seata-php 客户端与 Seata Java 服务端 TC 的交互报文。

3.3–我的项目代码格调

Seata-php 遵循 PSR-1 代码标准[2]。

社区提供了一个相似于 Go 语言 gofmt 一样的代码格式化工具——composer cs-fix,具体应用形式是:

# 格式化某个文件
composer cs-fix ${FileName}
# 格式化某个目录
composer cs-fix ${DirName}

3.4–测试用例

目前,seata-php 仅提供了单测用例,搁置在我的项目 tests 目录中,可间接通过 composer test 命令执行这些单测用例。咱们近期就会把这些单测用例配置在 GitHub action 上,用于测试每个提交的 PR。

下一步,咱们会像 seata-go 一样补充集成测试用例,并配置在 GitHub action 上用于自动测试我的项目的每个 PR。

PART. 4–下半年布局

Seata-php 目前已有的工作仅仅是迈出了下半年长征的第一步,尚未达到生产可用的状态。下半年的整体指标是:

1.【事务模式】对齐将于 9 月份公布的 Seata Java v1.6.0 的 TCC、AT、SATA 和 XA 模式;

2.【测试用例】单测覆盖率达 70% 以上,并实现两种模式下的 Seata Java 中已有的集成测试用例的 PHP 版本;

3.【代码 samples】实现两种模式下的 Seata Java 中已有的 samples 示例的 PHP 版本;

4.【文档建设】构建 API 接口级别的具体阐明文档;

5.【生产案例】理论生产用户 3 家以上;

6.【社区建设】造就 Seata Committer 5 人以上。

上述指标能够了解为 seata-php 社区的 KPI。为达成目标,有可分为“三步走” 的如下执行 plan。

4.1–公布一个可用版本

这是第一个阶段。咱们打算在国庆节前后公布第一个 GA 版本,具体的技术点如下:

1. 实现 TM 与 RM

作为分布式事务的发起方,TM 在与上游的微服务利用在通信时,可能在 HTTP 协定与 gRPC 协定中,传递事务上下文,上游的服务也能够随时退出到事务中。

2. 实现分布式锁 API

用于防止业务数据在一阶段与二阶段之间,因为并发被批改,导致二阶段提交、回滚生效。

3. 实现 TCC 与 AT 模式

齐全实现 TCC 模式。而 AT 模式依赖于具体的 DB 类型和 DB 版本,咱们把 DB 限定为 MySQL v5.7,在此之上反对最根本的 INSERT 与 UPDATE 语句,根本能够实现大部分的理论利用场景笼罩。

4. 反对注册核心

反对注册核心的目标,是不便 TM 和 RM 对 TC 进行微服务发现。将会反对 File 与 Nacos 两种服务发现形式。

优先反对 File 服务发现形式。其益处是,在 K8s 环境下,能够通过环境变量或者是挂载 configmap,实现动静配置,不依赖人力变更。

其次反对 Nacos 作为注册核心的服务发现形式。目前,国内的阿里云、腾讯云、华为云等支流云厂商都反对 Nacos 注册核心,能够不便宽广用户进行服务联通。

5. 其余

如自动化的单元测试,集成测试和我的项目的 samples。

社区曾经将第一阶段波及到的所有工作都作为 task 公布在 seata-php issue 上,能够不便的查看工作负责人,并及时跟踪我的项目进度_(间接查看以后进度)_。

4.2–技术能力全面对齐

这是半年指标的第二阶段。这个阶段产出的版本,将会是一个比较完善的版本,可能笼罩绝大部分的业务场景,升高开发者在应用 seata-php 的门槛与老本。关键技术点如下:

1. 实现 XA 与 SAGA 模式

除了补齐这两个模式外,还将持续欠缺 AT 模式反对的 SQL ,可能做到反对大部分的 SQL 语句。

2. 反对配置核心

反对配置核心的目标,是不便拉取事务相干的配置。初步打算反对 File、Nacos、Apollo 三种配置形式。

3. 反对 gRPC

打算于 9 月份公布的 Seata Java v1.6,将反对 gRPC 通信形式。Seata-php 在第二阶段也将反对这一 RPC 调动形式进行事务流传。

4. 其余数据库

首先反对更多的 MySQL 版本,如 v8.0。并反对 PostgreSQL、OceanBase、Redis 等更多类型的 DB。

5. 事务异样解决

晋升分布式事务防悬挂的能力,主动解决申请幂等、空提交、空回滚、资源悬挂等事务异样逻辑。

第二阶段的工夫节点的 deadline 大略是在本年 11 月底左右。

4.3–社区建设

前两个步骤,次要集中在 seata-php 本身的技术能力建设上。到此,seata-php 在技术上能够认为曾经成熟。

这两个步骤的推动,首先依赖于社区本身的衰弱倒退,毕竟开源我的项目的事件须要社区同学来推动。当下社区由于雨同学负责发展壮大,我的项目总体由星北同学来负责推动施行,目前已有代码 Contributor 4 人。

当然,咱们欢送更多的同学参加到 seata-php 的代码建设中来。提交 issue 和 PR 时,倡议尽可能详尽的形容相干细节。比方:

提交 bug issue 时

– 题目能够写:bugfix:NotFoundClass Redis with PHP version is 7.2

– 内容能够提交 bug 的详细情况、产生景象的详细情况、对应的堆栈信息、预期的状况、以及以后的环境状况、产生的事、修复意见、以及补充的信息、以后的环境状况等信息。

提交 PR 时

– 题目能够写:Feature: AT mode need to support pgsql

– 内容能够写明:这个 Feature 的意义,以及冀望的用法,还包含其余相干信息等。

这一步骤与前两个步骤相生相伴,同步进行。

PART. 5–总结

Seata-php 有 Seata Java 这个标杆在,初期以推动代码进度为主。

作为一个开源我的项目,seata-php 的开源价值当然是在用户的生产环境应用起来,而生产用户也是社区建设的一部分。目前已有两家用户违心在其开发测试环境对 seata-php 进行验证,帮忙晋升我的项目的稳定性、易用性和代码品质。

为放弃我的项目和社区的衰弱可继续倒退,开源我的项目的贡献者,不仅蕴含 coding 的代码贡献者,还该当包含进行文档奉献、产品宣传和品牌推广等方面的贡献者。咱们将组织社区热心参与者在各大技术论坛发表博客,在语音、视频网站和技术大会上进行技术干货以及生产案例的推广宣传。欢送对这些工作感兴趣的敌人退出社区钉钉群 44788115,与咱们分割沟通。

【参考文档】

1.《Seata 多语言体系建设》:https://mp.weixin.qq.com/s/UwzscqfuCYtsSdWYj-t-uQ
2.《PHP PSR-1 代码标准》:https://www.php-fig.org/psr/psr-1/

本周举荐浏览

Seata 在蚂蚁国内银行业务的落地实际

Seata 多语言体系建设

深刻 HTTP/3(2)|不那么 Boring 的 SSL

Go 原生插件应用问题全解析

欢送扫码关注咱们的公众号:


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
author-avatar
泱泱大国吴
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有