前言
软件系统得到用户认可后,访问量通常会产生爆发性的增长,互联网网站,例如淘宝、豆瓣等更是如此。在不断完善功能和多元化发展的同时,如何应对不断上涨的访问量、数据量是互联网应用面临的最大挑战。
对于用户而言,除了功能以外,网站访问够不够快,网站能否持续提供服务,也是影响用户访问量的重要因素,因此如何保证网站的高性能,及高可用也是我们要关注的重点。
为了支撑巨大的访问量和数据量,通常需要海量的机器,例如现在的google已经拥有了百万台以上的机器,这些机器耗费了巨大的成本(硬件采购成本、机器的电力成本、网络带宽成本等)。网站规模越大,运维成本就越高,这意味着商业公司所能获得的利润越低,而通常这会导致商业公司必须从多种角度关注如何降低网站运维成本。
本书的目的是从以上几个问题出发,介绍搭建高性能、高可用以及可伸缩的分布式Java应用所需的关键技术。
目标读者
本书涵盖了编写高性能、高可用以及可伸缩的分布式Java应用所需的知识点,适合希望掌握这些知识点的读者。
在介绍各个知识点时,作者尽量结合自己的工作,分享经验与心得,希望能够对那些有相关工作经验的读者有所帮助。
内容导读
本书按照介绍的知识点分为五个部分:第一部分介绍基于Java实现系统间交互的相关知识,这些知识在第1章中进行介绍;第二部分为基于SOA构建大型分布式Java应用的知识点,这些在第2章中介绍;第三部分为高性能Java应用的相关知识,这些在第3、4、5章中介绍;第四部分介绍高可用Java应用的相关知识,这些在第6章中介绍;第五部分介绍可伸缩Java应用,这些在第7章介绍,读者也可根据自己的兴趣选择相应的章节进行阅读。
网站业务多元化的发展会带来多个系统之间的通信问题,因此如何基于Java实现系统间的通信是首先要掌握的知识点,在本书的第1章中介绍了如何基于Java实现TCP/IP(BIO、NIO)、UDP/IP(BIO、NIO)的系统间通信、以及如何基于RMI、Webservice实现系统间的调用,在基于这些技术实现系统间通信和系统间调用时,性能也是要考虑的重点因素,本章也讲解了如何实现高性能的网络通信。
在解决了系统之间的通信问题后,多元化的发展带来的另外一个问题是多个系统间出现了一些重复的业务逻辑,这就要将重复的业务逻辑抽象为一个系统。这样演变后,会出现多个系统,这些系统如何保持统一、标准的交互方式是要解决的问题,SOA无疑是首选的方式,在本书的第2章中介绍了如何基于SOA来实现统一、标准的交互方式。
高性能是本书关注的重点,Java程序均运行在JVM之上,因此理解JVM是理解高性能Java程序所必须的。本书的第3章以Sun Hotspot JVM为例讲述了JVM执行Java代码的机制、内存管理的机制,以及多线程支持的机制。执行代码的机制包含了Sun hotspot将Java代码编译为class文件,加载class文件到JVM中,以解释方式执行class,以及client模式和server模式编译为机器码方式执行class的实现方式;内存管理的机制包含了Sun hotspot内存分配以及回收的机制,内存分配涉及的主要为堆上分配、TLAB分配以及栈上分配。内存回收涉及的有常见的垃圾回收算法、Sun Hotspot JVM中新生代可用的GC、旧生代可用的GC及G1;多线程支持的机制包含了多线程时资源的同步机制,以及线程之间交互的机制。
除JVM外,在编写分布式Java应用时,通常要使用到一些Sun JDK的类库。如何合理地根据需求来选择使用哪些类,以及这些类是如何实现的,是编写高性能、高可用的Java应用必须掌握的。在本书的第4章中介绍了Sun JDK中常用的集合包的集合类、并发包中的常用类(例如ConcurrentHashMap、ThreadPoolExecutor)、序列化/反序列化的实现方式,同时对这些类进行了基准的性能测试和对比。
掌握JVM和使用到的类库是编写高性能Java应用的必备知识,但除了编写之外,通常还会面临对已有系统进行调优。调优是个非常复杂的过程,在本书的第5章中介绍了寻找系统性能瓶颈的一些方法以及针对这些瓶颈常用的一些调优方法。寻找性能瓶颈的方法主要是根据系统资源的消耗寻找对应问题代码的方法,常用的一些调优方法主要是降低锁竞争、降低内存消耗等。
除了高性能外,高可用也是大型Java应用要关注的重点,在本书的第6章中介绍了一些构建高可用系统常用的方法,例如负载均衡技术、构建可容错的系统、对资源使用有限制的系统等。
在面对不断访问的访问量和数据量时,最希望能做到的是仅升级硬件或增加机器就可支撑,但要达到这个效果,在软件上必须付出巨大的努力。本书的第7章介绍了构建可伸缩系统的一些常用方法,主要包括支持垂直伸缩时常用的降低锁竞争等方法;以及支持水平伸缩时常用的分布式缓存、分布式文件系统等方法。
关于本书的代码
书中大部分代码只列出了关键部分或伪代码,完整的代码请从http://bluedavy.com下载。
关于本书的反馈
每次重看书稿,都会觉得这个知识点尚须补充,那个知识点尚须完善,但书不可能一直写下去。在提交终稿的时候,我不特别兴奋,倒是有一点遗憾和担心,遗憾书里的知识点还没有足够讲开,担心自己对某些知识点理解不够,误导了大家。为此,我在自己的网站(http://bluedavy.com)上开辟了一个专区,用于维护勘误,并将不断地完善书中涉及的知识点,欢迎读者反馈和交流。