Ivan Nikitsenkajava
微服務架構容許咱們再建立新應用時自由選擇不一樣的技術和編程語言。不過究竟哪一種語言更適合咱們當下的硬件?回答這個問題,須要搞明白Java和Go編寫的相同應用程序之間的性能差別。git
No additional performance enhancements should be applied. Use minimum configurations with default frameworks and libraries settings. github
No ORM frameworks. Use pure DB drivers and the same SQL queries. Postgres JDBC 4.2 driver for Java and github.com/lib/pq for Go.web
做爲被測系統,這裏準備了兩個銀行應用:bank-java和bank-go。spring
APIs:數據庫
POST / client / new / {balance} - 建立具備初始餘額的新客戶編程
POST /交易 - 將資金從一個帳戶轉移到另外一個帳戶微信
GET / client / {id} / balance - 返回客戶端的當前餘額架構
在選擇框架和庫時,這裏使用了最新、最流行和最簡單的框架和庫來儘快準備好應用程序。併發
Bank-java:Java 十、Spring Boot 2.0.四、spring-web 5.0.八、PostgreSQL JDBC 4.2.4
Bank-go:Go 1.8,gorilla / mux,github.com / lib / pq。
Bank-java: https://github.com/nikitsenka...
Bank-go: https://github.com/nikitsenka...
測試項目Bank-test使用動態變化的用戶數(從1,000到10,000)執行對銀行API的調用,驗證響應並收集統計信息。
這裏用AWS並建立了兩個AWS EC2實例:
完整結果請查看 here
兩個應用與1,000個併發用戶完美配合。2,000個用戶時,Go性能顯着下降,而Java仍然是完美的。從3,000個用戶及以上用戶開始,兩個應用都顯示出不可接受的響應時間,而且錯誤響應的數量顯着增長。
使用相同的硬件,Java REST API應用程序能夠提供兩倍於具備PostgreSQL數據庫的Go應用的併發用戶數。
Rainbond(雲幫)是"以應用爲中心」的開源PaaS, 深度整合基於Kubernetes的容器管理、ServiceMesh微服務架構最佳實踐、多類型CI/CD應用構建與交付、多數據中心資源管理等技術, 爲用戶提供雲原生應用全生命週期解決方案,構建應用與基礎設施、應用與應用、基礎設施與基礎設施之間互聯互通的生態體系, 知足支撐業務高速發展所需的敏捷開發、高效運維和精益管理需求。