<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java微服務(wù) vs Go微服務(wù),究竟誰更強!?

          共 3527字,需瀏覽 8分鐘

           ·

          2021-01-14 16:29


          前言

          Java微服務(wù)能像Go微服務(wù)一樣快嗎?這是我最近一直在思索地一個問題。

          去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大會上,Mark Nelson和Peter Nagy就對此做過一系列基礎(chǔ)的的測試用以比較。接下來就給大家介紹下。

          以下內(nèi)容與觀點主要源自https://medium.com/helidon/can-java-microservices-be-as-fast-as-go-5ceb9a45d673

          在程序員圈子里,普遍的看法是Java老、慢、無聊?,而Go是快、新、酷

          為了盡可能的進行一個相對公平的測試,他們使用了一個非常簡單的微服務(wù),沒有外部依賴關(guān)系(比如數(shù)據(jù)庫),代碼路徑非常短(只是操縱字符串),使用了小型的、輕量級的框架(Helidon for Java和Go工具包for Go),試驗了不同版本的Java和不同的jvm。

          對決雙雄

          我們先來看下擂臺兩邊的選手:

          • 身穿深色戰(zhàn)服的選手是JAVA

          Java是由被甲骨文收購的Sun Microsystems開發(fā)的。它的1.0版本是1996年發(fā)布的,最新的版本是2020年的Java15。主要的設(shè)計目標(biāo)是Java虛擬機和字節(jié)碼的可移植性,以及帶有垃圾收集的內(nèi)存管理。它是全世界最流行的語言之一,在開源環(huán)境下開發(fā)。

          我們先看下JAVA的問題,大家普遍認(rèn)為它最大的問題就是速度慢,已經(jīng)慢到讓人覺得不再是合理的,而是更具歷史意義的。不過這么多年來,Java誕生了很多不同的垃圾收集算法用來加快它運行的速度。

          Oracle實驗室最近已經(jīng)開發(fā)了一個新的Java虛擬機GraalVM,它有一個新的編譯器和一些令人興奮的新特性,比如能夠?qū)ava字節(jié)碼轉(zhuǎn)換成一個本機映像,可以在沒有javavm的情況下運行等。

          • 而它的對手就是年輕充滿活力的GO

          GO是由谷歌的羅伯特·格里默、羅伯·派克和肯·湯姆森創(chuàng)建的。他們對UNIX、B、C、Plan9、UNIX窗口系統(tǒng)等做出了重大貢獻。GO是開源的,在2012年發(fā)布了1.0版本(比JAVA晚了16年),在2020年發(fā)布了1.15版本。無論是在采用方面,還是在語言和工具生態(tài)系統(tǒng)本身方面,它都在快速增長。

          GO受C、Python、JavaScript和C++等多種語言的影響。被設(shè)計成高性能網(wǎng)絡(luò)和多處理的最佳語言。

          StackOverflow有27872個帶“Go”的問題,而Java只有1702730個。足見長江后浪推前浪。

          Go是一種靜態(tài)類型的編譯語言。它有稱為goroutines的輕量級進程(這些不是OS線程),它們之間有獨特的通信通道(類型化的,F(xiàn)IFO)。Go是許多CNCF項目的首選語言,例如Kubernetes、Istio、Prometheus和Grafana

          賽前對比

          從個人感覺來說,Go相比JAVA來說,優(yōu)點在于:

          • Go更容易實現(xiàn)復(fù)合、純函數(shù)、不變狀態(tài)等功能模式。
          • Go處于生命周期的早期,因此它沒有向后兼容性的沉重負(fù)擔(dān)—Go仍然可以輕易打破某些限制來改進。
          • Go編譯成一個本機靜態(tài)鏈接的二進制文件-沒有虛擬機層-二進制文件擁有運行程序所需的一切,這對于“從頭開始”的容器來說非常好。
          • Go體積小、啟動快、執(zhí)行快(目前是的)
          • Go沒有OOP,繼承,泛型,斷言,指針?biāo)惴?/section>
          • Go寫法上較少的括號
          • Go沒有循環(huán)依賴、沒有未使用的變量或?qū)搿]有隱式類型轉(zhuǎn)換的強制
          • Go樣板代碼少得多

          缺點是:

          • Go工具生態(tài)系統(tǒng)還不成熟,尤其是依賴關(guān)系管理——有幾個選項,沒有一個是完美的,特別是對于非開源開發(fā);仍然存在兼容性挑戰(zhàn)。
          • 構(gòu)建具有新的/更新的依賴項的代碼非常慢(比如Maven著名的“下載Internet”問題)
          • 導(dǎo)入將代碼綁定到存儲庫,這使得在存儲庫中移動代碼成為一場噩夢。
          • 調(diào)試、評測等仍然是一個挑戰(zhàn)
          • 用到了指針
          • 需要實現(xiàn)一些基本的算法
          • 沒有動態(tài)鏈接
          • 沒有太多旋鈕來調(diào)優(yōu)執(zhí)行或垃圾收集、概要文件執(zhí)行或優(yōu)化算法。

          比賽開始

          使用JMeter來運行負(fù)載測試。這些測試多次調(diào)用這些服務(wù),并收集有關(guān)響應(yīng)時間、吞吐量(每秒事務(wù)數(shù))和內(nèi)存使用情況的數(shù)據(jù)。對于Go,收集駐留集大小;對于Java,跟蹤本機內(nèi)存。

          在測量之前,使用1000次服務(wù)調(diào)用對應(yīng)用程序進行預(yù)熱。

          應(yīng)用程序本身的源代碼以及負(fù)載測試的定義都在這個GitHub存儲庫中:https://github.com/markxnelson/go-java-go

          第一回合

          在第一輪測試中,在一臺“小型”機器上進行了測試,是一臺2.5GHz雙核Intel core i7筆記本電腦,16GB內(nèi)存運行macOS。測試運行了100個線程,每個線程有10000個循環(huán),上升時間為10秒。Java應(yīng)用程序運行在JDK11和Helidon2.0.1上。使用Go 1.13.3編譯的Go應(yīng)用程序。

          結(jié)果如下:


          可以看出,第一回合是Go贏了!

          JAVA占的內(nèi)存太多了;預(yù)熱對JVM有很大的影響—我們知道JVM在運行時會進行優(yōu)化,所以這是有意義的

          在第一回合的基礎(chǔ)上,意猶未盡的又引入GraalVM映像以使 Java 應(yīng)用程序的執(zhí)行環(huán)境更接近于 Go 應(yīng)用程序的環(huán)境,添加了 GraalVM 映像測試(用 GraalVM EE 20.1.1ー JDK 11構(gòu)建的本機映像)的結(jié)果是:

          通過使用 GraalVM 映像在 JVM 上運行應(yīng)用程序,我們沒有看到吞吐量或響應(yīng)時間方面的任何實質(zhì)性改進,但是內(nèi)存占用的確變小了。

          下面是一些測試的響應(yīng)時間圖:

          第二回合

          在第二輪測試中,使用一臺更大的機器上運行測試。36核(每個核兩個線程)、256GB內(nèi)存、運行oraclelinux7.8的機器。

          和第一輪類似,使用了100個線程,每個線程使用了10,000個循環(huán),10秒的加速時間,以及相同版本的 Go,Java,Helidon 和 GraalVM。

          結(jié)果如下:

          這一回合是GraalVM 映像贏了!

          下面是一些測試的響應(yīng)時間圖:

          在這個測試中,Java變體的表現(xiàn)要好得多,并且在沒有使用Java日志記錄的情況下,它的性能大大超過了Go。Java似乎更能使用硬件提供的多核和執(zhí)行線程(與Go相比)。

          這一輪的最佳表現(xiàn)來自GraalVM native image,平均響應(yīng)時間為0.25毫秒,每秒事務(wù)數(shù)為82426個,而Go的最佳結(jié)果為1.59毫秒和39227個tps,然而這是以多占用兩個數(shù)量級的內(nèi)存為代價的!

          GraalVM映像比在jvm上運行的同一應(yīng)用程序快大約30–40%!

          第三回合

          這次,比賽在Kubernetes集群中運行這些應(yīng)用程序,這是一個更自然的微服務(wù)運行時環(huán)境。

          這次使用了一個Kubernetes 1.16.8集群,它有三個工作節(jié)點,每個節(jié)點有兩個內(nèi)核(每個內(nèi)核有兩個執(zhí)行線程)、14GB的RAM和oraclelinux7.8。

          應(yīng)用程序訪問是通過Traefik入口控制器進行的,JMeter在Kubernetes集群外運行,用于一些測試,而對于其他測試,使用ClusterIP并在集群中運行JMeter。

          與前面的測試一樣,使用了100個線程,每個線程使用了10,000個循環(huán),以及10秒的加速時間。

          下面是各種不同容器的大小:

          • Go 11.6MB 11.6 MB
          • Java/Helidon 1.41GB 1.41 GB
          • Java/Helidon JLinked 150MB 150mb
          • Native image 25.2MB 25.2 MB

          結(jié)果如下:

          下面是一些測試的響應(yīng)時間圖:

          在這一輪中,我們觀察到 Go 有時更快,GraalVM 映像有時更快,但這兩者之間的差別很小(通常小于5%)。

          Java似乎比Go更善于使用所有可用的內(nèi)核/線程—在Java測試中看到了更好的CPU利用率。Java性能在擁有更多內(nèi)核和內(nèi)存的機器上更好,Go性能在較小/功能較弱的機器上更好。在一臺“生產(chǎn)規(guī)模”的機器上,Java很容易就和Go一樣快,或者更快

          最后

          接下來會做更多的測試比賽,來看一看究竟誰更好!

          有興趣的你也可以自己試一試,記得告訴我們結(jié)果哦!

          往期推薦

          當(dāng)音樂學(xué)博士搞起編程,用一本書改變了Java世界!

          Spring Boot 2.x基礎(chǔ)教程:使用Flyway管理數(shù)據(jù)庫版本

          因脈脈上的匿名消息,拼多多員工被開除了!

          你一定需要知道的高階JAVA枚舉特性!

          盤點 IDEA2020.3 那些炫酷的插件,超級好用的那種

          不到 20 人的 IT 公司該去嗎?



          瀏覽 29
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线免费观看三级成人片 | 亚洲婷婷成人激久久月天 | 超碰凹凸在线 | 欧美一级视频在线免费观看 | 特黄AAAAAAA片免费视频 |