Ivan Nikitsenka
微服务架构允许我们再创建新应用时自由选择不同的技术和编程语言. 不过究竟哪种语言更适合我们当下的硬件? 回答这个问题, 需要搞明白 Java 和 Go 编写的相同应用程序之间的性能差异.
先决条件
不采用其他性能增强功能
使用默认框架和库设置的最小配置
没有 ORM 框架
使用纯 DB 驱动程序和相同的 SQL 查询
用于 Java 的 Postgres JDBC 4.2 驱动程序和用于 Go 的 GitHub.com/lib/pq
怎么做
使用 DB(Postgres)数据存储创建简单的 Java/Go REST API 应用程序
使用 JMeter 或类似工具创建负载测试
在单独的 AWS 实例上运行应用程序, 加载测试和数据库
收集负载测试结果
被测系统
作为被测系统, 这里准备了两个银行应用: bank-java 和 bank-go.
APIs:
POST / client / new / {balance} - 创建具有初始余额的新客户
POST / 交易 - 将资金从一个账户转移到另一个账户
GET / client / {id} / balance - 返回客户端的当前余额
框架和依赖关系
在选择框架和库时, 这里使用了最新, 最流行和最简单的框架和库来尽快准备好应用程序.
- Bank-java:Java 10,Spring Boot 2.0.4,spring-web 5.0.8,PostgreSQL JDBC 4.2.4
- Bank-go:Go 1.8,gorilla / mux,GitHub.com / lib / pq.
银行应用源码
- Bank-java: https://GitHub.com/nikitsenka/bank-java
- Bank-go: https://GitHub.com/nikitsenka/bank-go
测试项目
测试项目 Bank-test 使用动态变化的用户数 (从 1,000 到 10,000) 执行对银行 API 的调用, 验证响应并收集统计信息.
测试环境
这里用 AWS 并创建了两个 AWS EC2 实例:
- Bank-go t2.micro (Variable ECUs, 1 vCPUs, 2.5 GHz, Intel Xeon Family, 1 GiB memory, EBS only)
- Bank-java t2.micro (Variable ECUs, 1 vCPUs, 2.5 GHz, Intel Xeon Family, 1 GiB memory, EBS only)
- Postgres d2.xlarge (14 ECUs, 4 vCPUs, 2.4 GHz, Intel Xeon E52676v3, 30.5 GiB memory, 3 x 2048 GiB Storage Capacity)
- Bank-test t2.2xlarge (Variable ECUs, 8 vCPUs, 2.3 GHz, Intel Broadwell E5-2686v4, 32 GiB memory, EBS only)
结果
完整结果请查看 here
结果小结
两个应用与 1,000 个并发用户完美配合. 2,000 个用户时, Go 性能显着降低, 而 Java 仍然是完美的. 从 3,000 个用户及以上用户开始, 两个应用都显示出不可接受的响应时间, 并且错误响应的数量显着增加.
总结
使用相同的硬件, Java REST API 应用程序可以提供两倍于具有 PostgreSQL 数据库的 Go 应用的并发用户数.
关于 Rainbond
> Rainbond (云帮)是 "以应用为中心" 的开源 PaaS, 深度整合基于 Kubernetes 的容器管理, ServiceMesh 微服务架构最佳实践, 多类型 CI/CD 应用构建与交付, 多数据中心资源管理等技术, 为用户提供云原生应用全生命周期解决方案, 构建应用与基础设施, 应用与应用, 基础设施与基础设施之间互联互通的生态体系, 满足支撑业务高速发展所需的敏捷开发, 高效运维和精益管理需求.
来源: http://www.tuicool.com/articles/ZFvuamu