分布式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
 
 
 
 
 





附件列表

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM