在HubSpot是如何应对Fat JAR困境的

在七月底,Spring Boot和Dropwizard分别发布了1.4和1.0版本,它们都是基于Fat JAR的。随着人们更多地采用这些框架和微服务架构,Fat JAR成为了通用的部署机制。

\\

Fat JAR技术会将Java应用的所有依赖打包到一个bundle之中,便于执行,这种方式用到了很多的Java微服务框架之中,包括Spring Boot和Dropwizard,甚至还有一个专门的Fat JAR Eclipse插件。

\\

对于具有少量微服务的组织来说,Fat JAR所占用的带宽可能并不那么明显。但是,如果你有上千个微服务的话,那么它们所使用的带宽就会成为一个问题了。

\\

在今年夏天的早些时候,HubSpot曾经提到过借助maven-shade-plugin进行Fat JAR部署所遇到的问题,并介绍了他们将100,000个小文件打包到一个JAR中所遇到的性能问题。他们还提到,1,000个以上的应用进行持续不断地构建和部署,会产生大量重复的JAR依赖。

\\

他们曾经尝试使用maven-dependency-plugin来减缓这种快速膨胀,但是他们的努力并没有减少所生成的构建工件(artifact)的大小。

\\

为了解决Fat JAR所带来的痛苦,HubSpot创建了用于Maven的SlimFast插件,它所创建的构建工件只会包含指定项目的类。它会依附到部署阶段上,并将应用的所有依赖分别上传到Amazon Simple Storage Service(S3)之中。通过使用这个插件,HubSpot的报告显示,构建时间快了60%,并且可用的存储容量增加了99%。

\\

下图展现了使用SlimFast之后,所带来的构建速度提升:

\\

18d9ac6363c94abae534b067a93742c6.png

\\

为了更深入地了解HubSpot所面临的Fat JAR问题,InfoQ采访了他们的软件工程师Jonathan Haber。

\\

InfoQ:你们所遇到的Fat JAR问题大部分都是由持续集成和部署引起的吗?

\\
\

Jonathan Haber:是的,我认为我们所遇到的问题很大程度上都是由我们的开发风格所导致的。我们有很多小团队,他们都在推送代码、构建和部署,这样的活动每天都有上百次。因为我们的构建单元很小,所以创建和上传Fat JAR所消耗的时间有时比编译和测试代码的时间还长。话说回来,如果你采用单体结构的话,构建所需的时间可能会超过20分钟,那么相对来讲Fat JAR的消耗就没有那么明显。但是,我认为有更多的公司在转向这种更快、更轻量级的部署风格,因此可能会面临同样的挑战。

\
\\

InfoQ:你认为像SlimFast这样的替代性打包技术是否应该作为框架的原生方案,比如添加到Spring Boot和Dropwizard中?

\\
\

Haber:因为这种方式需要与构建和部署系统集成,我的感觉是如果将其包含在Spring Boot或Dropwizard中的话,那就太带有倾向性了。但是,有一种处理方式就是将SlimFast插件放到一个Maven profile之中,通过环境变量来激活。通过这种方式,构建系统能够表明它支持这个特性,否则的话,依然将会采用Fat JAR的方式。

\
\\

InfoQ:如果云提供商(如Heroku、CloudFoundry等)采用类似的技术来减少应用之间重复的JAR,那么他们在带宽方面是不是可以节省很多钱?

\\
\

Haber:我并不确定能够节省到什么程度,但是我认为采用类似的策略是可行的。不过,我们的优势在于所有的应用都使用了相同版本的第三方库,所使用的库有大量的重叠。对于云提供商来说,他们的用户所依赖的库会广泛得多,会跨所有的不同版本,所以如果你想在应用服务器上缓存依赖的话,会需要大量的空间。但是,如果你不这样的话,速度/带宽方面的大量节省就会不复存在。这并不是说,完全没有节省,我只是认为他们的实现会比我们的方式更加复杂。另外一个问题在于,这些云提供商通常只会基于用户的POM来运行Maven,所以他们对于构建生命周期并没有太多的控制权,无法添加这种类型的优化。

\
\\

InfoQ:在Fat JAR应用方面,你希望看到有哪些改善呢?

\\
\

Haber:如果Java能够处理嵌套JAR的话,那么构建和运行Fat JAR都会容易很多,我并不确定这一点是否会包含在Java 9的功能列表中。像Spring Boot和One-JAR这样的工具都能很好地解决这种局限性,但是他们增加了复杂性并且无法做到完全的透明。

\
\\

查看英文原文:Solving Fat JAR Woes at HubSpot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

给定数字的b+树创建_在C ++中找到给定数字中的两个的下一个和上一个幂

给定数字的b树创建Problem statement: 问题陈述: Find Next and previous power of two of a given number 查找给定数字中两个的下一个和上一个幂 Next power of two 下一个二的幂 Example(1):input: 22output: 32 ( as 32 is 2^5)Example(2):input: 54output…

java 字节数组作用_这段java代码中字节数组b起到了什么作用?

importjava.io.*;importjavax.swing.*;publicclassIOMonitor{publicstaticvoidmain(String[]temp){//TODO自动生成的方法存根byteb[]newbyte[2];try{FileInputStreamfisnewFileInput...import java.io.*;import javax.swing.*;public class IOMonitor {public static void main…

如何查看本地的崩溃log_过年回家,还怕抢不到票?程序员教你如何抢票

2019年接近尾声,距离春节回家的日子越来越近,26日起,2020年除夕火车票正式开售,抢票大战也进入白热化阶段。是否为某抢票 App 加速而烦恼,是否为车票“秒光而烦恼”。别慌,作为连“对象”都是 new 出来的程…

获取列表中包含的元素数 在C#中

Given a list, and we have to count its total number of elements using List.Count property. 给定一个列表,我们必须使用List.Count属性计算其元素总数 。 C#清单 (C# List) A list is used to represent the list of the objects, it is represent…

I00037 亏数(Deficient number)

数论中,若一个正整数除了本身之外所有因子之和比此数自身小,则称此数为亏数。亏数(Deficient number)也称为缺数,参见百度百科_亏数,或参见维基百科的Deficient number。亏数在OEIS中的数列号为A005100。 问…

hashmap转红黑树的阈值为8_面试必考的 HashMap,这篇总结到位了

点击蓝色“JavaKeeper”关注我哟加个“星标”,一起成长,做牛逼闪闪的技术人1 概述HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长.HashMap是非线程安全的,只适用于单线程环…

linux用户组管理命令_Linux用户和组命令能力问题和解答

linux用户组管理命令This section contains Aptitude Questions and Answers on Linux User and Group Commands. 本节包含有关Linux用户和组命令的 Aptitude问答。 1) Which of the following commands is used to create a new user in the Linux operating system? create…

Failed to start firewalld.service: Unit firewalld.service is masked.

2019独角兽企业重金招聘Python工程师标准>>> FireWall in Centos 7 masked How to resolve the error message belowFailed to issue method call: Unit firewalld.service is masked. The main reason a service is masked is to prevent accidental starting or e…

mysql第二个索引_MySQL高级第二章——索引优化分析

一、SQL性能下降原因1.等待时间长?执行时间长?可能原因:查询语句写的不行索引失效(单值索引、复合索引)CREATE INDEX index_user_name ON user(name);(底层做了一个排序)CREATE INDEX index_user_nameEmail ON user(name,email);查询关联join…

递归反转链表改变原链表吗_在不使用递归的情况下找到链表的长度

递归反转链表改变原链表吗Solution: 解: Algorithm to find length 查找长度的算法 Input: 输入: A singly linked list whose address of the first node is stored in a pointer, say head. 一个单链表 ,其第一个节点的地址存储在指针(例…

西瓜仿站高手v1.08官方正式版

2019独角兽企业重金招聘Python工程师标准>>> 西瓜仿站高手是一款绿色好用的由追风网络出品的网站模板批量下载软件,西瓜仿站高手是一款仿站工具,仿站神器。软件功能强大,能够帮你轻松帮你下载任意网站、任意模板,并且速…

用hundred造句子_八个有趣的开学破冰游戏,线上线下都能用

知道大家最近都很忙,所以省略开篇,直接上正题——开学“破冰游戏”走起!一、你比划我来猜把词语展示在PPT上,猜词的同学背对PPT,其他同学可以看到词语并且用身体动作把词语表现出来,直到猜词的同学可以把词…

java 执行顺序_Java代码执行顺序

程序中代码执行的顺序非常重要,稍有不慎便会是程序运行出错,那么我将结合实例来分析代码中的执行。名词解释首先了解几个名词:非静态代码块直接由 { } 包起来的代码,称为非静态代码块静态代码块直接由 static { } 包起来的代码&am…

mysql 包含的那些文件

*.frm是描述了表的结构 *.MYD保存了表的数据记录 *.MYI则是表的索引 ibd是MySQL数据文件、索引文件,无法直接读取。 转载于:https://www.cnblogs.com/07byte/p/5823667.html

math 计算float_Java Math类静态float min(float f1,float f2)与示例

math 计算float数学类静态浮点数min(float f1,float f2) (Math Class static float min(float f1 , float f2) ) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the minimum one of both the given a…

vector 不初始化时什么状态_Vue原理解析(三):初始化时created之前做了什么?...

让我们继续this._init()的初始化之旅,接下来又会执行这样的三个初始化方法:initInjections(vm) initState(vm) initProvide(vm)5. initInjections(vm): 主要作用是初始化inject,可以访问到对应的依赖。inject和provide这里需要简单的提一下&a…

switch 字符串 java_JDK7新特性switch支持字符串

在JDK7中,switch语句的判断条件增加了对字符串类型的支持。由于字符串的操作在编程中使用频繁,这个新特性的出现为Java编程带来了便利。接下来通过一个案例演示一下在switch语句中使用字符串进行匹配。public class Example {public static void main(String[] args) {String w…

cisco packet tracer路由器配置_【干货】思科交换机路由器怎么配置密码?

今天带大家看看如何在思科的交换机路由器当中配置安全特性,也就是密码的配置方式。在学习配置之前,我们先回顾一下密码相关知识。密码学是研究信息系统安全保密的科学。人类有记载的通信密码始于公元前400年,古希腊人是置换密码学的发明者。密…

perl 哈希数组的哈希_使用哈希检查两个数组是否相似

perl 哈希数组的哈希Prerequisite: Hashing data structure 先决条件: 哈希数据结构 Problem statement: 问题陈述: Check whether two arrays are similar or not using the hash table. The arrays are of the same size. 使用哈希表检查两个数组是否…

codevs3872 邮递员送信(SPFA)

邮递员送信 时间限制: 1 Sec 内存限制: 64 MB提交: 10 解决: 5[提交][状态][讨论版] 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N。由于这个城市的交通比较繁忙,因此所有的道路都是单行的&#xff0…