Java与GO。 由大量用户进行测试

动机


微服务架构允许您在编写REST api服务时在技术和编程语言之间进行选择。 编写REST api应用程序时,哪种语言最好选择,以便在同一硬件上为更多同时用户提供快速,稳定的答案? 为了回答这个问题,很高兴看到用Java和GO编写的同一应用程序的性能差异。

免责声明


本实验中提供的所有结果都是使用Java和GO的一个特定示例,不应用于描述这些语言在其他条件下的性能。

条款/条件


  • 没有其他设置可以提高生产率。 框架和库应与默认设置一起使用。
  • 没有ORM框架。 两个应用程序中只有数据库驱动程序和相同的查询。

计划


  1. 让我们用PostgreSQL数据库在Java和GO中创建两个简单的REST api应用程序
  2. 使用Jmeter创建负载测试
  3. 在单独的AWS实例上运行每个应用程序,数据库和测试
  4. 运行测试并收集结果

测试申请


作为测试系统,我创建了两个应用程序: bank-javabank-go 。 这可能是世界上最简单的银行应用程序。 它所能做的就是用初始余额创建新客户,将资金从一个客户转移到另一个客户并显示余额。
API:

  • 邮政/客户/新客户/ {余额} -创建具有初始余额的客户
  • 发布/交易 -将资金从一个客户转移到另一个客户
  • 获取/客户/ {id} /余额 -显示余额

框架和库


选择这些堆栈时,我使用了最新,最流行和最简单的框架和库来尽快实现必要的功能。
Bank-java:Java 11,Spring Boot 2.0.4,Spring-Web 5.0.8,PostgreSQL JDBC 4.2.4
Bank-go:Go 1.8,大猩猩/多路复用器,github.com/lib/pq

测试环境


AWS被用作测试环境。

已创建以下EC2实例:

  1. Bank-go t2.micro(可变ECU,1个vCPU,2.5 GHz,Intel Xeon系列,1 GiB内存,仅EBS)
  2. Bank-java t2.micro(可变ECU,1个vCPU,2.5 GHz,Intel Xeon系列,1 GiB内存,仅EBS)
  3. Postgres d2.xlarge(14个ECU,4个vCPU,2.4 GHz,Intel Xeon E52676v3、30.5 GiB内存,3 x 2048 GiB存储容量)
  4. 银行测试t2.2xlarge(可变ECU,8个vCPU,2.3 GHz,Intel Broadwell E5-2686v4、32 GiB内存,仅EBS)

所有实例均使用Ubuntu Server 18.04 LTS(HVM),SSD卷类型



测试项目


Jmeter测试从上面的列表中调用每个API,检查响应的状态是否为200,并且响应主体包含id。 对于每个应用程序,我同时启动的用户数为1000、2000等。 最多10,000。

可在此处找到结果的完整日志。

汇总结果








结果说明


两种应用程序都可以完美地与1000个用户一起使用。从2000 GO开始,该应用程序开始明显失去性能,并失去了一点稳定性。 在Java中,此行从3000开始。

结论


使用相同的REST api硬件,Java应用程序可以支持的并发用户数是具有PostgreSQL数据库的GO应用程序的两倍。

*仅当使用与本实验相同的测试条件时,此图才是正确的。

Source: https://habr.com/ru/post/zh-CN424649/


All Articles