大型網站系統與Java中介軟體實踐讀書筆記
1.分散式系統相對集中式而言,是指多臺計算機互相通過訊息通訊進行協作而對外提供服務;可解決大型機的伸縮性和單點等問題;
2.網路i/o有bio/nio,還有aio,aio是指執行緒拿到訊息後並不自己處理或等處理結束之後再響應,而是將訊息投遞之後繼續後面的處理,只將回撥傳遞給被呼叫方,訊息處理完成之後自動由被呼叫方完成回撥,也就是非同步io,java7支援aio;
3.分散式系統有幾個難點:缺乏全域性時鐘(可以把時間序號獲取交給單獨叢集來做);面對故障的獨立性(要考慮其它模組可靠與不可靠的情況);單點故障處理(能拆分的拆分,能換叢集的換叢集,不能拆分到最細的做到備份以備自動恢復);事務的挑戰(兩階段提交協議,最終一致性等);
4.單機應用演化過程:
1)單機負載告警後,資料庫與應用伺服器做分享;
2)應用伺服器負載告警後應用伺服器做叢集,涉及負載均衡裝置,涉及session問題可將session存cookie或session拷貝或統一session服務管理中心;
3)資料庫壓力變大,讀寫分離,涉及資料複製問題和應用對資料來源的選擇問題,讀庫前面也可再加快取,資料實時要求不高還可採用搜索引擎作為讀;
4)快取除了可用來快取資料,還可用來快取頁面,快取一切對實時性要求不高的內容;
5)引入分散式儲存(檔案/kv)系統緩解資料庫的存取;
6)讀寫分離後資料庫仍有瓶頸,採用專庫專用,資料庫的垂直拆分;
7)資料庫垂直拆分後再遇到資料庫單機瓶頸,考慮水平拆分;此時引入資料存取中介軟體;
8)資料庫問題解決後,新的挑戰時採用應用拆分服務化方式;此時引入訊息中介軟體的服務框架中介軟體;
5.Java中介軟體主要有三類:服務框架中介軟體,訊息中介軟體和資料訪問中介軟體;
6.votatile和synchronized的區別:volatile表示每次讀寫都直接讀寫主存,不會拷貝到執行緒儲存中,也就是所有執行緒操作的都是同一份,這並不表示只有一個執行緒能同時操作;sychronized是表示加鎖,保持資料的一致性;
7.Java的Atomics包中的類是一些支援原子性操作的類,它們的效能會有明顯的提升是因為Java使用了硬體特性來支援;
8.CountDownLatch是等待執行緒呼叫latch.await,等待latch減少到0就能往下走了,而釋放執行緒則使用latch.countDown來每次呼叫釋放1;
9.CyclicBarrier是指所有呼叫barrier.await的執行緒都要等到其它執行緒都執行到這一條語句之後才往後執行,barrier還可以預設一個執行緒在滿足條件後執行;
10.Exchanger是指兩個執行緒都執行到這條語句時互換一個訊號,然後各自繼續執行;
11.Future是指獲取這個結果的執行緒呼叫是非同步的,程式碼可以先往下執行,等到要真正要使用這個返回值時如果仍未返回才會停下來,FutureTask是其實現類。
12.併發容器如果有合適場景儘量使用Java提供的,不要自己基於鎖去實現;
13.動態代理,是指把類和介面,介面Handler等名稱傳遞進去給Proxy.newProxyInstance方法來動態建立代理的方式,可在方法觸發前後甚至觸發時進行對應處理,這在服務呼叫框架之類的客戶端或服務端,一些能用Bean可以讓使用者配置介面,從而生成代理,由代理來處理來自外部的呼叫,而在呼叫前後進行替換。
14.服務框架大致是這樣實現的:
1)呼叫端:通過bean配置方式來配置遠端服務,服務提供方地址一般通過一個配置中心來給出,動態代理在介面呼叫時通過服務框架的方法來獲取遠端對應服務提供方地址,接裝請求引數等來進行序列化進行Socket直連(採用bio/nio等),得到響應結果後反序列化為對應的物件返回給上層呼叫方;超時等問題的處理可通過Future來實現,還可以實現多個呼叫之間的合併優化,即發起多個類似非同步呼叫,在使用到它們結果時才會卡住;
2)服務方:通過bean配置方式來配置遠端服務提供者,啟動後註冊到對應的配置中心,啟動若干個執行緒(池,用來處理流控)來監聽某一個埠的請求,當連線到來時呼叫具體實現類之前做一些返序列化工具,呼叫之後再進行一些序列化操作返回給遠端呼叫者;應用本身與框架的jar包衝突問題通過ClassLoader來解決;
3)服務註冊中心:主要用來管理註冊來上的呼叫者和服務提供方,同時可兼具路由管理,資訊檢視等功能;路由可細化到類或方法,還可通過分組來把同一機房的提供者標識出來;服務升級一般是採用版本號的方式來,即先將服務升級,新老並存,老的呼叫方全升級後再下線老服務;
15.服務框架實戰中的優化,即服務治理需要的內容:服務資訊管理,服務質量管理評估,服務容量評估,服務依賴展示,服務分佈展示,服務統計,服務報表,服務元資料等;服務管理還有服務的限流,上下線,降級,路由,服務授權管理等等;
16.服務框架與ESB異同,都是面向服務化,服務框架主要考慮同構系統不考慮異構,ESB會考慮不同廠商的實現;
17.資料庫水平/垂直拆分的困難:
1)單機的事務機制被打破,要考慮分散式事務的控制;
2)一些單庫操作需要到多個庫中操作,表連線需要用應用方式來實現;
3)外來鍵約束需要程式來保證而非資料庫;
4)依靠單庫的自增序列方式要改變;
18.分散式事務有兩階段提交協議,但對大型網站來說還是太複雜而且會有效能問題,比之更輕量的有Paxos協議,其核心原則是少數服務多數;一般能不引入分散式事務就不要引入,如果一定要引入也不追求強一致性而只要求最終一致性,即通過重試的方式把未完成的做完而不回滾;
19.大型網站一致性理論:CAP,即一致性,響應/可用性,部分出問題時仍能工作(Partition-Tolerance),這幾個屬性之間是互斥的,因此更多是放棄完全一致性,只追求最終一致性即可;
20.跨庫查詢且要排序是最難處理的問題,等於要將所有分庫的資料查出來再運算,應該儘量避免這種情況,尤其是分頁到後面資料量更在,如果資料量巨大的,可考慮使用搜索引擎;
21.資料訪問中介軟體的設計一般是在jdbc/orm框架之下加一層用來處理路由,sql分析等;一般會有一堆的資料來源需要處理,包括資料的劃分規則(取模不易於擴充套件,考慮一致性雜湊,有人退出時旁邊的接管之,可以將一個物理結點虛出多個虛擬結點方式緩解任務過於集中的問題),而資料層需要進行如下轉換:sql解析,規則處理,sql改寫(在各庫中表名可能不一樣),資料來源選擇,sql執行,結果集返回合併處理這些步驟。
22.資料訪問中介軟體可以在應用中以jar包方式引入,也可以考慮單獨部署一個應用,業務應用只與這個應用打交道,而各種規則由這個應用來解析與執行。
23.讀寫分享等的資料同步,主要由otter來完成,基於資料庫日誌解析的,國際站可做到秒級延時,國內可做到ms級,阿里內部現在在做單元化,多地多活等方案,也需要這些同步技術。
24.平滑資料遷移其實是先全量遷移,然後再將這一過程中老庫的變更記錄在新庫執行,這個遞迴過程會越來越短,當需要遷移的增量很少時,暫停對這部分資料的寫操作,然後快速完成處理,切換路由到新庫。
25.訊息中介軟體可解耦應用之間的依賴,而且一般用業解決非同步呼叫等實時性要求不高的問題,比如登入後發簡訊或是資料同步,記錄日誌這些。
26.訊息投遞與業務處理的一致性問題很長時候都需要保證,一些可讓使用者隨意重複的除外,因此需要引入事務類似的方式,但分散式事務成本太高,所以一個相對摺中的方案是:
1)傳送訊息給訊息中介軟體;
2)訊息中介軟體入庫訊息;
3)訊息中介軟體返回結果;
4)業務操作;
5)傳送業務操作結果給訊息中介軟體;
6)更改儲存中的訊息狀態;
這個方案只有第5第6步可能引發不一致性問題,但這種情況下訊息都可以通過訊息中介軟體的未處理訊息狀態來問訊息傳送源進行反查。
27.訊息中介軟體一般有topic和queue兩種,有不同的應用場景,有時候還需要級聯的方式來處理。
28.訊息傳送端及傳送過程的可靠性是通過本地儲存+重試的方式來保證,對於失敗的訊息會保留下來並在訊息中心恢復之後重新發送;而對於儲存端則一般可採用資料庫來儲存訊息,還可以採用雙機記憶體的方式來加快速度,使儲存只在記憶體中運轉並兩臺機器之間相互備份,一旦一臺掛掉則另一臺落磁碟儲存並接管訊息。
29.訊息處理端一般都需要保證訊息處理操作的等冪性以防止訊息投遞出錯有重複的訊息產生;