在HubSpot是如何应对Fat JAR困境的
在七月底,Spring Boot和Dropwizard分別發(fā)布了1.4和1.0版本,它們都是基于Fat JAR的。隨著人們更多地采用這些框架和微服務(wù)架構(gòu),Fat JAR成為了通用的部署機(jī)制。
\\Fat JAR技術(shù)會將Java應(yīng)用的所有依賴打包到一個bundle之中,便于執(zhí)行,這種方式用到了很多的Java微服務(wù)框架之中,包括Spring Boot和Dropwizard,甚至還有一個專門的Fat JAR Eclipse插件。
\\對于具有少量微服務(wù)的組織來說,Fat JAR所占用的帶寬可能并不那么明顯。但是,如果你有上千個微服務(wù)的話,那么它們所使用的帶寬就會成為一個問題了。
\\在今年夏天的早些時候,HubSpot曾經(jīng)提到過借助maven-shade-plugin進(jìn)行Fat JAR部署所遇到的問題,并介紹了他們將100,000個小文件打包到一個JAR中所遇到的性能問題。他們還提到,1,000個以上的應(yīng)用進(jìn)行持續(xù)不斷地構(gòu)建和部署,會產(chǎn)生大量重復(fù)的JAR依賴。
\\他們曾經(jīng)嘗試使用maven-dependency-plugin來減緩這種快速膨脹,但是他們的努力并沒有減少所生成的構(gòu)建工件(artifact)的大小。
\\為了解決Fat JAR所帶來的痛苦,HubSpot創(chuàng)建了用于Maven的SlimFast插件,它所創(chuàng)建的構(gòu)建工件只會包含指定項目的類。它會依附到部署階段上,并將應(yīng)用的所有依賴分別上傳到Amazon Simple Storage Service(S3)之中。通過使用這個插件,HubSpot的報告顯示,構(gòu)建時間快了60%,并且可用的存儲容量增加了99%。
\\下圖展現(xiàn)了使用SlimFast之后,所帶來的構(gòu)建速度提升:
\\\\為了更深入地了解HubSpot所面臨的Fat JAR問題,InfoQ采訪了他們的軟件工程師Jonathan Haber。
\\InfoQ:你們所遇到的Fat JAR問題大部分都是由持續(xù)集成和部署引起的嗎?
\\\Jonathan Haber:是的,我認(rèn)為我們所遇到的問題很大程度上都是由我們的開發(fā)風(fēng)格所導(dǎo)致的。我們有很多小團(tuán)隊,他們都在推送代碼、構(gòu)建和部署,這樣的活動每天都有上百次。因為我們的構(gòu)建單元很小,所以創(chuàng)建和上傳Fat JAR所消耗的時間有時比編譯和測試代碼的時間還長。話說回來,如果你采用單體結(jié)構(gòu)的話,構(gòu)建所需的時間可能會超過20分鐘,那么相對來講Fat JAR的消耗就沒有那么明顯。但是,我認(rèn)為有更多的公司在轉(zhuǎn)向這種更快、更輕量級的部署風(fēng)格,因此可能會面臨同樣的挑戰(zhàn)。
\\\InfoQ:你認(rèn)為像SlimFast這樣的替代性打包技術(shù)是否應(yīng)該作為框架的原生方案,比如添加到Spring Boot和Dropwizard中?
\\\Haber:因為這種方式需要與構(gòu)建和部署系統(tǒng)集成,我的感覺是如果將其包含在Spring Boot或Dropwizard中的話,那就太帶有傾向性了。但是,有一種處理方式就是將SlimFast插件放到一個Maven profile之中,通過環(huán)境變量來激活。通過這種方式,構(gòu)建系統(tǒng)能夠表明它支持這個特性,否則的話,依然將會采用Fat JAR的方式。
\\\InfoQ:如果云提供商(如Heroku、CloudFoundry等)采用類似的技術(shù)來減少應(yīng)用之間重復(fù)的JAR,那么他們在帶寬方面是不是可以節(jié)省很多錢?
\\\Haber:我并不確定能夠節(jié)省到什么程度,但是我認(rèn)為采用類似的策略是可行的。不過,我們的優(yōu)勢在于所有的應(yīng)用都使用了相同版本的第三方庫,所使用的庫有大量的重疊。對于云提供商來說,他們的用戶所依賴的庫會廣泛得多,會跨所有的不同版本,所以如果你想在應(yīng)用服務(wù)器上緩存依賴的話,會需要大量的空間。但是,如果你不這樣的話,速度/帶寬方面的大量節(jié)省就會不復(fù)存在。這并不是說,完全沒有節(jié)省,我只是認(rèn)為他們的實現(xiàn)會比我們的方式更加復(fù)雜。另外一個問題在于,這些云提供商通常只會基于用戶的POM來運行Maven,所以他們對于構(gòu)建生命周期并沒有太多的控制權(quán),無法添加這種類型的優(yōu)化。
\\\InfoQ:在Fat JAR應(yīng)用方面,你希望看到有哪些改善呢?
\\\Haber:如果Java能夠處理嵌套JAR的話,那么構(gòu)建和運行Fat JAR都會容易很多,我并不確定這一點是否會包含在Java 9的功能列表中。像Spring Boot和One-JAR這樣的工具都能很好地解決這種局限性,但是他們增加了復(fù)雜性并且無法做到完全的透明。
\\\查看英文原文:Solving Fat JAR Woes at HubSpot
總結(jié)
以上是生活随笔為你收集整理的在HubSpot是如何应对Fat JAR困境的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金融行业 | 电子银行系统性能优化解决方
- 下一篇: 网站高可用数据