始读于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应用之基础与实践》读书笔记三
对于大型分布式Java应用与SOA,我们可以从以下几个方面来分析: 为什么需要SOA SOA是什么 eBay的SOA平台 可实现SOA的方法 为什么需要SOA 第一个现象是系统多元化带来的问题,可 ...
- 《分布式Java应用之基础与实践》读书笔记一
分布式Java应用的体系结构知识简单分为: 网络通信:包括协议和IO 消息方式的系统间通信:包括基于Java包.基于开源框架.性能角度 远程调用方式的系统间通信:包括基于Java包.基于开源框架.性能 ...
- 《分布式Java应用之基础与实践》读书笔记四
Java代码作为一门跨操作系统的语言,最终是运行在JVM中的,所以对于JVM的理解就变得非常重要了.整体上,我们可以从三个方面来深入理解JVM. Java代码的执行 内存管理 线程资源同步和交互机制 ...
- 2018.3.5 Java语言基础与面向对象编程实践
Java语言基础与面向对象编程实践 第一章 初识Java 1.Java特点 http://www.manew.com/blog-166576-20164.html Java语言面向对象的 Java语言 ...
- Java生鲜电商平台-SpringCloud分布式请求跟踪系统设计与实践
Java生鲜电商平台-SpringCloud分布式请求跟踪系统设计与实践 Java生鲜电商平台微服务现状 某个服务挂了,导致上游大量报警,如何快速定位哪个服务出问题? 某个核心挂了,导致大量报错,如何 ...
- 分布式Java应用与实践 (一)
一) 分布式Java应用 1.1 基于消息方式实现系统间的通信 数据传输 TCP/IP 可靠的网络传输协议,首先给通信双方建立链接之后再进行数据传输,保证链接及数据传输的可靠,因此会牺牲一些性能 UD ...
- Java底层基础题
一.Java底层基础题 1.SpringMVC的原理以及返回数据如何渲染到jsp/html上? 答:Spring MVC的核心就是DispatcherServlet , 一个请求经过Dispatche ...
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
- 使用DataStax Java驱动程序的最佳实践
引言 如果您想开始建立自己的基于Cassandra的Java程序,欢迎! 也许您已经参加过我们精彩的DataStax Academy课程或开发者大会,又或者仔细阅读过Cassandra Java驱动的 ...
随机推荐
- 《DSP using MATLAB》 Problem 2.3
本题主要是显示周期序列的. 1.代码: %% ------------------------------------------------------------------------ %% O ...
- 白帽子讲web安全——一个安全解决方案的诞生细节
1.白帽子:做安全的人.主要做的事,防御,是制定一套解决攻击的方案.而不是只是解决某个漏洞. 2.黑帽子:现在说的黑客.让web变的不安全的人.利用漏洞获取特权.主要做的事,攻击,组合各种方法利用漏洞 ...
- 【linux】du命令
Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...
- Python自然语言处理(1):初识NLP
由于我们从美国回来就是想把医学数据和医学人工智能的事认真做起来,所以我们选择了比较扎实的解决方法,想快速出成果的请绕道.我们的一些解决方法是:1.整合公开的所有医学词典,尽可能包含更多的标准医学词汇: ...
- C#综合揭秘——细说事务
引言 其实事务在数据层.服务层.业务逻辑层多处地方都会使用到,在本篇文章将会为大家一一细说. 其中前面四节是事务的基础,后面的三节是事务的重点,对事务有基础的朋友可以跳过前面四节. 文章有错漏的地方欢 ...
- unity里面的gameobject和transform的关系
一切都是物体(gameobject),而transform是物体的一个基本属性类,包含位置,旋转,缩放,三个基本属性,两者之间可以互相转换 查找物体,建议用transform,GameObject无法 ...
- 关于 android 环信无法正确获取昵称的问题
本案例中 username 记录成 userId了, nick 始终为空...,这是 getNick() 取得的就是 username..... 如果想自己取得自己系统的nickname则 做以下调整 ...
- pythonNet day07
信号 一个进程向另外一个进程通过信号的方式传递某种讯息,接收方在接收到信号后作出相应的处理 查看信号:kill -l kill -signum PID 给PID的进程发送一个信号 信号名称:信号的名字 ...
- jQuery的文档操作
1.插入操作 一.父元素.append(子元素) 追加某元素 父元素中添加新的元素 var oli = document.createElement('li'); oli.innerHTML = '哈 ...
- Linux知识温习
进程间通信(IPC)介绍 mmap - 用户空间与内核空间 linux 进程地址空间的一步步探究 mmap 还是 shmget ? linux C/C++服务器后台开发面试题总结 Trie树详解及其应 ...