仓颉原生S3客户端探索|相较Java性能提升38%

文摘   2024-07-26 19:28   北京  

01

关于仓颉原生S3客户端

Amazon Simple Storage Service(Amazon S3)是一项对象存储服务,在可扩展性、数据可用性、安全性和能效方面业界领先。并且现在国内的对象存储服务提供商基本都支持S3协议,所以对于那些需要使用S3存储协议的业务系统, 提供一个仓颉原生的S3客户端SDK,支持同步、异步调用模式的客户端成为当务之急。
1.1 特性
仓颉S3客户端 s3client4cj项目已经开源并发布到仓颉社区,特性为:
- 支持 AWS Signature Version 2
- 支持 AWS Signature Version 4
- 支持 S3 Service 的错误响应报文
- 支持 Bucket 相关操作接口
- 支持 Object 相关操作接口
- 支持同步/异步编程接口
- 支持分段上传
- 支持自动分页
- 支持预签名 URL (Presigned URL)
- 支持 MD5/SHA1/SHA256 的 Checksum
- 支持 SHA1/SHA256 的 Trailing Checksum
- 支持 Metric
- 支持重试
- 支持 Waiter

项目开源地址:https://gitcode.com/Cangjie-TPC/s3-sdk/overview

1.2 总体设计

1.2.1 接口层
提供创建到S3存储服务的连接,提供执行S3命令的同步、异步等方法。
1.2.2 核心层
S3Action:提供所有S3Action的抽象,定义Action执行的共用逻辑。
S3Retry: 提供重试能力,通过retryPolicy和backoffPolicy来控制要不要重试以及2次重试之间的间隔时间。
S3Future: 提供统一的同步/异步调用接口。
S3Signer: 提供V2/V4的签名能力。
1.2.3 编码/解码层
将S3Request转换为HttpRequest,并将S3对象转换为XML报文作为HttpRequest的Body,用于发送请求。
将HttpResponse转换为S3Response,并将HttpResponse Body的XML报文转换为S3对象。
1.2.4 通信层
通过仓颉自带的HttpClient和S3存储服务通信。支持TLS通信。
1.3 S3Action处理流程

Action的处理流程如下:
1.客户端执行Action时,将Action名称和Action对应的参数封装为S3Request。
2.S3Marshalling将S3Request转为S3HttpRequest并将对象转XML。
3.S3Retry负责S3HttpRequest的重试,如出现特定的异常或错误响应码时进行重试。
4.S3Signer负责S3HttpRequest的签名,支持V2/V4的签名。
5.通过S3HttpClient发送请求并接受响应, 如果判断响应正常不需要重试,则由S3Unmarshalling将S3HttpResponse转换成S3Response,并负责将XML转换成对象。

02

S3Client的使用

2.1 创建 S3Client

默认连接到https://s3.cn-north-1.amazonaws.com.cn
S3Client 支持的可配置属性

2.2 桶创建 (异步)


03

性能测试

3.1 测试环境
性能测试时使用一台机器,同时运行MinIO服务和客户端,机器的配置如下:
·  操作系统:Ubuntu 22.04.4 LTS
·  CPU:Intel(R) Xeon(R) Gold 6430
·  内存:512GB
· MinIO版本:RELEASE.2024-06-29T01-20-47Z (go1.22.4 linux/amd64)
·  仓颉SDK版本:0.51.4
3.2 测试结果
服务端MinIO未作任何调优, 全部使用默认配置。
客户端100并发, 每个并发执行1000次迭代, 每次迭代会执行3个操作 putObject,getObject,deleteObject。

客户端

并发数

TPS

CPU

内存

Cangjie

100

13,636

17%

512M

Java

100

13,043

17%

3G

这种场景测试主要是IO的压力,测试结果,Cangjie的S3客户端性能和Java版本的基本持平,但是Cangjie的内存占用较小。

3.3 无后端服务测试
为了测试纯客户端性能,提供了MockHttpClient,单线程的循环测试, 不实际发送 HTTP 请求, 主要测试除 HTTP 请求之外的代码耗时。


测试结果,在无实际访问S3服务后端的情况下,Cangjie的S3客户端性能略优于Java版本的实现。


04

共建仓颉生态

基于仓颉语言完备的产品文档和先进的开发工具链,团队迅速完成了仓颉S3客户端的开发和测试工作,达到了Java语言S3客户端的同等能力。通过此次为社区贡献仓颉原生S3客户端的探索与实践,我们深刻体会到了仓颉编程语言的多重优势:
1.拥有现代编程语言的核心特性,如类型推断、自动内存管理以及元编程等,使得编程更加高效和灵活。
2.强大的运行时安全性,从根本上消除了空指针的隐患,保障了代码的稳健性。
3.易于扩展,仓颉的扩展功能(Extensions)允许为现有类添加新功能,无需继承或使用装饰模式,使代码简洁、易读,且维护性更好。
4.支持轻量级线程模型,多线程高IO场景具有较好的性能表现。
5.内置单元测试支持,易于开发高效稳定的代码。
6.内置诊断工具,极大地方便了性能优化和问题排查。

仓颉生态的持续发展仍需我们共同努力,我们诚挚地呼吁更多的开发者加入仓颉社区,共同为仓颉生态的建设贡献自己的力量。


05

关于团队

该团队为普元信息技术股份有限公司中间件系列产品的开发团队。普元信息技术股份有限公司(科创板股票代码:688118)是全栈式中间件领导者,领先的数据治理和低代码技术提供商。
普元信息积极拥抱仓颉语言。普元信息中间件系列产品,包括分布式配置中心,S3,OBS等组件均全面融入仓颉语言生态,提供了仓颉语言客户端支持。简化了企业级应用向仓颉开发环境的迁移流程,不仅让企业能够充分利用仓颉语言的高效、安全及灵活性,还促进了现有中间件架构与仓颉语言环境的无缝融合与效能提升,为企业数字化转型注入了新的活力。

结语


仓颉编程语言是一个支持高效、安全、全场景应用开发的现代编程语言,具有强安全、高性能、高效率、全场景等特点。Cangjie-TPC(Third Party Components)用于汇集基于仓颉编程语言开发的开源三方库,帮助开发者方便、快捷、高质量构建仓颉程序。


仓颉生态的持续发展仍需我们共同努力,我们诚挚地呼吁更多的开发者加入仓颉社区,共同为仓颉生态的建设贡献自己的力量。普元将携手华为持续为仓颉社区贡献力量。


社区地址:


Cangjie主仓

https://gitcode.com/Cangjie

Cangjie-TPC

https://gitcode.com/Cangjie-TPC


扫一扫,使用和参与仓颉社区生态共建


本文作者:王文斌,普元资深中间件架构师,主导参与多个中间件产品的架构设计,对云原生、微服务架构研究深入,熟练掌握微服务相关的众多开源组件。

点击阅读原文,了解仓颉社区👇

GitCode开源探索
GitCode官方账号,[GitCode」开源开发者平台,依托CSDN开发者社区,帮助开发者及开发者企业实现项目托管、协同研发、项目运营和生态拓展。
 最新文章