• 学一门语言,最好的方式对我而言,是实现一个框架
  • 迄今,实现了3个框架

框架大致介绍

  • 成熟度:Java 最成熟,并且也已用于生产环境,Go其次, Rust为近期才完成
  • 语言熟悉度: Java=Go>Rust
  • 设计思想: 核心只有一个: cdi (context with dependency inject),Go,Rust的框架都源自于Java框架,而Java框架源于Spring,所以可以认为所有的3个框架的核心都是Spring的思想, 但是不会为了ioc 而ioc,导致复杂度几何级上升,3个框架都是实现了功能上的解耦,以插件的形式组合形成一个应用
  • 编码思路: 三个框架的编码可以说是一模一样吧,同种思路不同实现而已,Java是注解,Go则是标签,Rust则是宏. 同时编码本来就是A借鉴B,B借鉴C的过程,所以所有框架的实现都借鉴了部分开源代码的实现, 算是活学活用吧,看了很多框架的源码
  • Java: spring,springboot-grpc,netty,fabric-sdk-java,rpcx-java,distributor(这个不是非常熟悉)
  • Go: rpcx,Hyperledger-Fabric/Fabric-ca ,ipfs,gin,tendermint,cosmos-sdk,libp2p
  • Rust: rust确切的说,整体不是非常非常熟悉,但是也大致借鉴了怎么玩的,也是一门挺有意思的语言. 主要是借鉴的tokio 和rocket
  • 从开始到基础搭建结束耗时时间而言, Rust>Java>Go,Java大概写了一个月左右吧,Go 很快,基于Java基础的设计,不到一个月就写完了,而Rust 中途磨磨唧唧了挺长一段时间,所以大概是2个月左右搞完(实际编码可能也是1个月吧),这2个月是从0开始边学边写

本篇博文的目的

  • 目的很简单,只有一个,那就是测试下框架的一些基础性能
  • rest 方面的qps
  • … 有想到再补…

压测环境

  • 工具
  • jmeter
  • 配置
  • 自身的开发机,mac m1 max 64G,24C
  • 压测方案
  • 1000线程
  • 2000线程
  • 5000线程
  • 10000线程
  • rest qps
  • 每个框架都会携带 100个api接口
  • jmeter随机[1-100]请求,计算qps
  • Java 会进行预热处理,但是不会进行额外的gc调优(因为不会~,最好的调优方式就是升级jdk,目前为11)

预期结果

  • 预期的话,Rust 会qps最高,Go>=Java,原因的话
  • 一部分与编码有关,Go的逻辑处理都是没开routine的我记得,Java都是开了threadpool进行处理,Rust的话,全程异步routine的形式
  • 语言方面,无GC的语言自然要比GC语言性能高,但是Go和Java相比的话,Go生态上对标的是Java,虽然号称就是比Java快,但这也太小看Java 了,小看JIT,小看Netty了, 但是Java框架,是在Spring基础上再封装,而Spring已经在servlet基础封装过了,所以多次封装必然会带来性能上的损失
  • 测试有关, 压测并不规范,下次压测开始时系统运行情况不会与上次相同,没有控制变量

实际结果

  • qps
  • 1000线程
  • Java: 30820.10/s
  • Go: 38862.74/s
  • Rust:55222.67/s
  • 后续再继续~