微服務架構選Java還是選Go - 多使用者負載測試
ofollow,noindex" target="_blank">Ivan Nikitsenka
微服務架構允許我們再建立新應用時自由選擇不同的技術和程式語言。不過究竟哪種語言更適合我們當下的硬體?回答這個問題,需要搞明白Java和Go編寫的相同應用程式之間的效能差異。
先決條件
- 不採用其他效能增強功能
- 使用預設框架和庫設定的最小配置
- 沒有ORM框架
- 使用純DB驅動程式和相同的SQL查詢
- 用於Java的Postgres JDBC 4.2驅動程式和用於Go的github.com/lib/pq
怎麼做
被測系統
作為被測系統,這裡準備了兩個銀行應用: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應用構建與交付、多資料中心資源管理等技術, 為使用者提供雲原生應用全生命週期解決方案,構建應用與基礎設施、應用與應用、基礎設施與基礎設施之間互聯互通的生態體系, 滿足支撐業務高速發展所需的敏捷開發、高效運維和精益管理需求。