始读于2014年4月30日,完成于2014年6月6日15:43:39。
阿里巴巴高级研究员林昊早年的书了,这些理论放到今天估计工作一两年的人都耳熟能详了,我个人很早以前就知道此书一直没有找到资源,去年找了电子版通读了一下,里面对于性能调优、分布式部署的实战经验确有可借鉴之处,书很薄,但是知识很重。
全书思维导图:

 
 
1.系统间通讯的两种方式,消息方式和远程调用方式
    消息方式:TCP(BIO/NIO),UDP(BIO/NIO),Multicast 。开源框架:Mina/Netty   (数据自身传输)
    远程调用方式:基于java自身技术实现:RMI,Webservice 。开源框架:Spring RMI,CXF (调用命令传输)
2.远程调用rmi,通过序列号传递调用对象及参数给服务端,服务端找到具体的对象通过发射传入参数调用产生结果,再将结果序列化后传送到调用端
3.SCA,Service Component Architecture,规范包括了如何发布服务,如何调用服务,支持的通讯协议和交互方式三个方面的内容
4.实现SOA可参考的规范SCA(实现框架Tuscany),可参考的标准ESB(开源框架Mule ESB).
5.一个大型的SOA平台,至少包括以下四点(高级SOA具备):
        a)统一的服务交互方式,并可实现和先用应用的无缝集成
        b)提供调试/跟踪的支持
        c)依赖管理
        d)高性能及高可用
        e)支撑集群环境
        f)完善的服务治理
        g)服务QoS(Quality of Service)的支持(安装服务配置的QoS来分配响应的硬件资源)
6.ESB是一个概念,其核心思想是基于消息中间件来实现系统间的交互,系统间的交互数据格式采用统一的消息格式,由总线完成消息的转化,路由,发送到目标应用。
7.通常ESB框架需要具备以下5个要素:
        a)标准的消息通讯格式
        b)消息路由
        c)支持多种的消息交互类型
        d)支持多种网络协议
        e)支持多种数据格式并能够进行相互转换
8.java线程运行状态
9.高性能Java应用的基本要素:JVM运行机制及参数调优,JDK中的即集合类及并发包,java序列化及反序列化。
10.资源主要消耗:CPU,文件IO,网络IO,内存。cpu主要用于中断,内核以及用户进程的任务处理。
11.性能调优:    
        a)如果us过高,表明应用程序占用了过多cpu,可以用top命令查看到是哪个进程的哪些线程耗费了过多cpu,然后用jstack -l pid导出dump,然后查找对应pid的十六进制,看看是哪个线程调了什么方法。解决方法:增加线程sleep,优化算法。
        b)如果sy过高,表明大量的用户线程运行堵塞导致系统 频繁进行上下文切换。可用jstack -l 查看线程运行状况,并配合vmstat 查看系统执行情况及cpu情况。解决方法:减少线程数,引入协程
        c)如果IO过高,表明应用程序在频繁的读写硬盘文件,因此可先用pidstat -d -t -p pid 或 iostat查找在io的线程,并结合jstack找到对应线程执行的java代码。解决方法:缓冲区,异步写文件,批量读写,限制写单个文件的最大文件大小
        d)如果网络IO过高,表明有线程在频繁的序列号发送字节流,可先用sar -n full 1 3 查看tcpsck,udpsck等参数确认,然后结合pidstat和jstack找到对应的代码进行分析。(序列化和反序列化会消耗JVM堆内存,且一般局域网速率都至少千M,一般很少出现网络IO高的问题)解决方法:限流,调整发送数据包的频率
        e)如果内存消耗过高,一般指的是swap交换区的内存及物理内存使用过高(因为JVM最大能使用的内存是由-Xmx制定的),可先用vmstat,sar,top,pidstat等确认。要首先分析哪部分内存消耗高,JVM的还是之外的物理内存,如果之外的,主要从线程数量以及Direct ByteBuffer的使用情况入手,如果是JVM的,可结合JDK自带的工具或其他如jprofile,tda等分析。解决方法:及时释放对象,采用对象池,合理的缓存失效算法,考虑使用SoftReference以及WeakReference。
12.资源消耗不多但程序仍然慢一般因为:锁竞争激烈,未充分使用硬件资源,如多核,数据量增长到一定程度。解决方法:减少锁竞争(使用自带并发类,使用Treiber,CAS等算法,减少锁的代码块,读写锁分离,分段锁)
13.集群解决了可伸缩问题,也面临着服务转发策略及失效漂移的问题。
14.无论是硬件负载均衡还是软件负载均衡,都要引入负载均衡机器,而为了避免其自身成为单点故障来源,需要做HA,双机热备。
15.负载均衡可以用LVS(支持第四层),HAProxy(4,7层),硬件负载器有F5,NetScalar.硬件负载需要注意硬件本身的网络流量瓶颈及长连接通道场景下负载不均衡的问题。
16.为避免负载均衡器本身成为瓶颈,可以考虑使用Gossip去中心化事件模型。
17.LVS+Keepalived实现热备,热备同时也要考虑单机房会成为单点的问题,通常要在多机房下做热备,但多机房需要注意以下问题:
    1)跨机房的状态同步,如数据库,文件,内存同步等需要通过一主多备或多主多备,要注意多节点同步时的延时问题。
    2)多master一般要通过以下三种方式来实现同步:两阶段提交,三阶段提交(增加preCommit),基于Paxos保持一致性
18.保障应用自身高可用性的几个方法:明确应用的使用场景,fail fast,严谨的接口和类方法设计,限制资源的使用(内存,文件,网络资源,线程)
19.在向服务器发送流时,先在jvm内存中序列化化成流,然后放入操作系统的sendBuffer区。
20.
21.对各领域预警监测的办法:
22.集群的报警主要依靠分析日志来进行
23.出现故障及时处理的方式:执行风险点应对措施,全局资源调整,功能降级(功能粒度管理,功能级别划分环境),降低对资源的使用量
24.应用压力不断上涨应对策略:水平拆分系统,按业务拆分数据库,按时间,hash,取模等拆分表,水平伸缩规划,
25.可通过垂直伸缩(增加CPU,内存资源)和水平伸缩(增加机器,但如何保持缓存一致性)来提高系统支撑能力。
26.缓存状态的水平伸缩法:广播同步(开源JGroups),分布式缓存(memcached)。JVM堆级共享(Terracotta)
27.文件水平伸缩方法:直连式存储DAS,网络存储NAS,SAN,分布式文件系统
28.应用水平伸缩后解决数据库资源连接不够的方法:缓存(页面静态化,页面片段缓存,数据缓存),分库,异步数据库访问,引入Data Access Layer 中间层。
29.支撑大数据量从数据库的角度有以下方式:读写分离,多Master
30.计算能力的提升:MapReduce,MPI
 
 
 
 
 

附件列表

分布式java应用基础与实践的更多相关文章

  1. 《分布式Java应用之基础与实践》读书笔记三

    对于大型分布式Java应用与SOA,我们可以从以下几个方面来分析: 为什么需要SOA SOA是什么 eBay的SOA平台 可实现SOA的方法 为什么需要SOA   第一个现象是系统多元化带来的问题,可 ...

  2. 《分布式Java应用之基础与实践》读书笔记一

    分布式Java应用的体系结构知识简单分为: 网络通信:包括协议和IO 消息方式的系统间通信:包括基于Java包.基于开源框架.性能角度 远程调用方式的系统间通信:包括基于Java包.基于开源框架.性能 ...

  3. 《分布式Java应用之基础与实践》读书笔记四

    Java代码作为一门跨操作系统的语言,最终是运行在JVM中的,所以对于JVM的理解就变得非常重要了.整体上,我们可以从三个方面来深入理解JVM. Java代码的执行 内存管理 线程资源同步和交互机制 ...

  4. 2018.3.5 Java语言基础与面向对象编程实践

    Java语言基础与面向对象编程实践 第一章 初识Java 1.Java特点 http://www.manew.com/blog-166576-20164.html Java语言面向对象的 Java语言 ...

  5. Java生鲜电商平台-SpringCloud分布式请求跟踪系统设计与实践

    Java生鲜电商平台-SpringCloud分布式请求跟踪系统设计与实践 Java生鲜电商平台微服务现状 某个服务挂了,导致上游大量报警,如何快速定位哪个服务出问题? 某个核心挂了,导致大量报错,如何 ...

  6. 分布式Java应用与实践 (一)

    一) 分布式Java应用 1.1 基于消息方式实现系统间的通信 数据传输 TCP/IP 可靠的网络传输协议,首先给通信双方建立链接之后再进行数据传输,保证链接及数据传输的可靠,因此会牺牲一些性能 UD ...

  7. Java底层基础题

    一.Java底层基础题 1.SpringMVC的原理以及返回数据如何渲染到jsp/html上? 答:Spring MVC的核心就是DispatcherServlet , 一个请求经过Dispatche ...

  8. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  9. 使用DataStax Java驱动程序的最佳实践

    引言 如果您想开始建立自己的基于Cassandra的Java程序,欢迎! 也许您已经参加过我们精彩的DataStax Academy课程或开发者大会,又或者仔细阅读过Cassandra Java驱动的 ...

随机推荐

  1. 解决crontab不加载环境变量问题

    公司需要做异构库数据同步,由于之前实际使用过,且字段类型也兼容,满足业务场景,使用了阿里开源数据同步工具:datax,服务器上crontab定时脚本执行. 由于crontab只加载/ect/envir ...

  2. yum安装apache及问题解决

    一.检查服务器上是否已经安装了apache apache在linux系统里的名字是httpd,执行以下命令,如果有返回的信息,则会显示已经安装的软件.如果没有则不会显示其它的信息. rpm -qa h ...

  3. Django中MySQL读写分离技术

    最近需要用到Django的MySQL读写分离技术,查了一些资料,把方法整理了下来. 在Django里实现对MySQL的读写分离,实际上就是将不同的读写请求按一定的规则路由到不同的数据库上(可以是不同类 ...

  4. Mysql Workbench 连接CentOs MySQL

    系统环境: 计算机ip:192.168.1.105  CentOS+Mysql 远程计算机ip:192.168.1.118  Win7+MySQLWorkbench   登陆服务器:bin/mysql ...

  5. bzoj 3328 PYXFIB——单位根反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演主要就是有 \( [k|n] = \frac{1}{k}\sum\limit ...

  6. mysql5.7.12/13在安装新实例时报错:InnoDB: auto-extending data file ./ibdata1 is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero

    .bin/mysqld --initialize-insecure --basedir=xxx --datadir=xxx 然后 .bin/mysqld_safe --defaults-file=xx ...

  7. mysql-9索引

    mysql索引的建立对于mysql的高效运行是很重要的,索引可以大大提高mysql的检索速度. 索引分为单列索引和组合索引. 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索 ...

  8. Oracle的操作系统身份认证(转)

    oraclelogin数据库远程登录authenticationossqlnet.authentication_services=(NTS),在$ORACLE_HOME/network/admin/s ...

  9. canvas基础动画示例

    canvas基础动画示例 本文主要用最简单的例子,展示canvas动画效果是如何实现的 动画效果,是一个球绕着一点旋转 const canvas = document.getElementById(' ...

  10. ES6系列_16之模块化操作

    ES6的模块化操作主要包括两个方面. (1)export :负责进行模块化,也是模块的输出. (2)import : 负责把模块引,也是模块的引入操作. export的用法: export可以让我们把 ...