zoukankan      html  css  js  c++  java
  • 分布式java应用基础与实践

     
    始读于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
     
     
     
     
     





    附件列表

  • 相关阅读:
    PSR-2 编码风格规范
    Git中删除冗余的分支
    linux下ssh连接缓慢详解
    pytest框架之fixture详细使用
    如何利用jenkins插件查看allure报告-----完整篇
    CentOS上安装配置Python3.7
    [Python]requests使用代理
    Selenium
    Python性能分析工具-cProfile
    subprocessf运行window程序
  • 原文地址:https://www.cnblogs.com/dimmacro/p/4459767.html
Copyright © 2011-2022 走看看