动机
微服务架构允许您在编写REST api服务时在技术和编程语言之间进行选择。 编写REST api应用程序时,哪种语言最好选择,以便在同一硬件上为更多同时用户提供快速,稳定的答案? 为了回答这个问题,很高兴看到用Java和GO编写的同一应用程序的性能差异。
免责声明
本实验中提供的所有结果都是使用Java和GO的一个特定示例,不应用于描述这些语言在其他条件下的性能。
条款/条件
- 没有其他设置可以提高生产率。 框架和库应与默认设置一起使用。
- 没有ORM框架。 两个应用程序中只有数据库驱动程序和相同的查询。
计划
- 让我们用PostgreSQL数据库在Java和GO中创建两个简单的REST api应用程序
- 使用Jmeter创建负载测试
- 在单独的AWS实例上运行每个应用程序,数据库和测试
- 运行测试并收集结果
测试申请
作为测试系统,我创建了两个应用程序:
bank-java和
bank-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实例:
- Bank-go t2.micro(可变ECU,1个vCPU,2.5 GHz,Intel Xeon系列,1 GiB内存,仅EBS)
- Bank-java t2.micro(可变ECU,1个vCPU,2.5 GHz,Intel Xeon系列,1 GiB内存,仅EBS)
- Postgres d2.xlarge(14个ECU,4个vCPU,2.4 GHz,Intel Xeon E52676v3、30.5 GiB内存,3 x 2048 GiB存储容量)
- 银行测试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应用程序的两倍。
*仅当使用与本实验相同的测试条件时,此图才是正确的。