本文目錄一覽:
- 1、java 分布式系統架構有哪些
- 2、Java分布式系統處理分布式事務有哪些經典解決方案
- 3、如何用java 建立一個分布式系統
- 4、求講解Java分布式架構?
- 5、java分布式架構有哪些技術
- 6、java 分布式系統解決方案
java 分布式系統架構有哪些
分布式架構的演進 系統架構演化歷程-初始階段架構 初始階段 的小型系統 應用程序、數據庫、文件等所有的資源都在一台服務器上通俗稱為LAMP 特徵: 應用程序、數據庫、文件等所有的資源都在一台服務器上。 描述: 通常服務器操作系統使用Linux
Java分布式系統處理分布式事務有哪些經典解決方案
為了解決大家在實施分布式服務化架構過程中關於分布式事務問題的困擾,將基於支付系統真實業務中的經典場景來對“可靠消息的最終一致性方案”、“TCC兩階段型方案”和“最大努力通知型方案”這3種柔性事務解決方案進行具體設計實現和詳細講解。
如何用java 建立一個分布式系統
分布式架構的演進
系統架構演化歷程-初始階段架構
初始階段 的小型系統 應用程序、數據庫、文件等所有的資源都在一台服務器上通俗稱為LAMP
特徵:
應用程序、數據庫、文件等所有的資源都在一台服務器上。
描述:
通常服務器操作系統使用Linux,應用程序使用PHP開發,然後部署在Apache上,數據庫使用MySQL,彙集各種免費開源軟件以及一台廉價服務器就可以開始系統的發展之路了。
系統架構演化歷程-應用服務和數據服務分離
好景不長,發現隨着系統訪問量的再度增加,webserver機器的壓力在高峰期會上升到比較高,這個時候開始考慮增加一台webserver
特徵:
應用程序、數據庫、文件分別部署在獨立的資源上。
描述:
數據量增加,單台服務器性能及存儲空間不足,需要將應用和數據分離,並發處理能力和數據存儲空間得到了很大改善。
系統架構演化歷程-使用緩存改善性能
特徵:
數據庫中訪問較集中的一小部分數據存儲在緩存服務器中,減少數據庫的訪問次數,降低數據庫的訪問壓力。
描述:
系統訪問特點遵循二八定律,即80%的業務訪問集中在20%的數據上。
緩存分為本地緩存和遠程分布式緩存,本地緩存訪問速度更快但緩存數據量有限,同時存在與應用程序爭用內存的情況。
系統架構演化歷程-使用應用服務器集群
在做完分庫分表這些工作後,數據庫上的壓力已經降到比較低了,又開始過着每天看着訪問量暴增的幸福生活了,突然有一天,發現系統的訪問又開始有變慢的趨勢了,這個時候首先查看數據庫,壓力一切正常,之後查看webserver,發現apache阻塞了很多的請求,而應用服務器對每個請求也是比較快的,看來 是請求數太高導致需要排隊等待,響應速度變慢
特徵:
多台服務器通過負載均衡同時向外部提供服務,解決單台服務器處理能力和存儲空間上限的問題。
描述:
使用集群是系統解決高並發、海量數據問題的常用手段。通過向集群中追加資源,提升系統的並發處理能力,使得服務器的負載壓力不再成為整個系統的瓶頸。
系統架構演化歷程-數據庫讀寫分離
享受了一段時間的系統訪問量高速增長的幸福後,發現系統又開始變慢了,這次又是什麼狀況呢,經過查找,發現數據庫寫入、更新的這些操作的部分數據庫連接的資源競爭非常激烈,導致了系統變慢
特徵:
多台服務器通過負載均衡同時向外部提供服務,解決單台服務器處理能力和存儲空間上限的問題。
描述:
使用集群是系統解決高並發、海量數據問題的常用手段。通過向集群中追加資源,使得服務器的負載壓力不在成為整個系統的瓶頸。
系統架構演化歷程-反向代理和CDN加速
特徵:
採用CDN和反向代理加快系統的 訪問速度。
描述:
為了應付複雜的網絡環境和不同地區用戶的訪問,通過CDN和反向代理加快用戶訪問的速度,同時減輕後端服務器的負載壓力。CDN與反向代理的基本原理都是緩存。
系統架構演化歷程-分布式文件系統和分布式數據庫
隨着系統的不斷運行,數據量開始大幅度增長,這個時候發現分庫後查詢仍然會有些慢,於是按照分庫的思想開始做分表的工作
特徵:
數據庫採用分布式數據庫,文件系統採用分布式文件系統。
描述:
任何強大的單一服務器都滿足不了大型系統持續增長的業務需求,數據庫讀寫分離隨着業務的發展最終也將無法滿足需求,需要使用分布式數據庫及分布式文件系統來支撐。
分布式數據庫是系統數據庫拆分的最後方法,只有在單表數據規模非常龐大的時候才使用,更常用的數據庫拆分手段是業務分庫,將不同的業務數據庫部署在不同的物理服務器上。
系統架構演化歷程-使用NoSQL和搜索引擎
特徵:
系統引入NoSQL數據庫及搜索引擎。
描述:
隨着業務越來越複雜,對數據存儲和檢索的需求也越來越複雜,系統需要採用一些非關係型數據庫如NoSQL和分數據庫查詢技術如搜索引擎。應用服務器通過統一數據訪問模塊訪問各種數據,減輕應用程序管理諸多數據源的麻煩。
系統架構演化歷程-業務拆分
特徵:
系統上按照業務進行拆分改造,應用服務器按照業務區分進行分別部署。
描述:
為了應對日益複雜的業務場景,通常使用分而治之的手段將整個系統業務分成不同的產品線,應用之間通過超鏈接建立關係,也可以通過消息隊列進行數據分發,當然更多的還是通過訪問同一個數據存儲系統來構成一個關聯的完整系統。
縱向拆分:
將一個大應用拆分為多個小應用,如果新業務較為獨立,那麼就直接將其設計部署為一個獨立的Web應用系統
縱向拆分相對較為簡單,通過梳理業務,將較少相關的業務剝離即可。
橫向拆分:將復用的業務拆分出來,獨立部署為分布式服務,新增業務只需要調用這些分布式服務
橫向拆分需要識別可復用的業務,設計服務接口,規範服務依賴關係。
系統架構演化歷程-分布式服務
特徵:
公共的應用模塊被提取出來,部署在分布式服務器上供應用服務器調用。
描述:
隨着業務越拆越小,應用系統整體複雜程度呈指數級上升,由於所有應用要和所有數據庫系統連接,最終導致數據庫連接資源不足,拒絕服務。
Q:分布式服務應用會面臨哪些問題?
A:
(1) 當服務越來越多時,服務URL配置管理變得非常困難,F5硬件負載均衡器的單點壓力也越來越大。
(2) 當進一步發展,服務間依賴關係變得錯蹤複雜,甚至分不清哪個應用要在哪個應用之前啟動,架構師都不能完整的描述應用的架構關係。
(3) 接着,服務的調用量越來越大,服務的容量問題就暴露出來,這個服務需要多少機器支撐?什麼時候該加機器?
(4) 服務多了,溝通成本也開始上升,調某個服務失敗該找誰?服務的參數都有什麼約定?
(5) 一個服務有多個業務消費者,如何確保服務質量?
(6) 隨着服務的不停升級,總有些意想不到的事發生,比如cache寫錯了導致內存溢出,故障不可避免,每次核心服務一掛,影響一大片,人心慌慌,如何控制故障的影響面?服務是否可以功能降級?或者資源劣化?
Java分布式應用技術基礎
分布式服務下的關鍵技術:消息隊列架構
消息對列通過消息對象分解系統耦合性,不同子系統處理同一個消息
分布式服務下的關鍵技術:消息隊列原理
分布式服務下的關鍵技術:服務框架架構
服務框架通過接口分解系統耦合性,不同子系統通過相同的接口描述進行服務啟用
服務框架是一個點對點模型
服務框架面向同構系統
適合:移動應用、互聯網應用、外部系統
分布式服務下的關鍵技術:服務框架原理
分布式服務下的關鍵技術:服務總線架構
服務總線同服務框架一樣,均是通過接口分解系統耦合性,不同子系統通過相同的接口描述進行服務啟用
服務總線是一個總線式的模型
服務總線面向同構、異構系統
適合:內部系統
分布式服務下的關鍵技術:服務總線原理
分布式架構下系統間交互的5種通信模式
request/response模式(同步模式):客戶端發起請求一直阻塞到服務端返回請求為止。
Callback(異步模式):客戶端發送一個RPC請求給服務器,服務端處理後再發送一個消息給消息發送端提供的callback端點,此類情況非常合適以下場景:A組件發送RPC請求給B,B處理完成後,需要通知A組件做後續處理。
Future模式:客戶端發送完請求後,繼續做自己的事情,返回一個包含消息結果的Future對象。客戶端需要使用返回結果時,使用Future對象的.get(),如果此時沒有結果返回的話,會一直阻塞到有結果返回為止。
Oneway模式:客戶端調用完繼續執行,不管接收端是否成功。
Reliable模式:為保證通信可靠,將藉助於消息中心來實現消息的可靠送達,請求將做持久化存儲,在接收方在線時做送達,並由消息中心保證異常重試。
五種通信模式的實現方式-同步點對點服務模式
五種通信模式的實現方式-異步點對點消息模式1
五種通信模式的實現方式-異步點對點消息模式2
五種通信模式的實現方式-異步廣播消息模式
分布式架構下的服務治理
服務治理是服務框架/服務總線的核心功能。所謂服務治理,是指服務的提供方和消費方達成一致的約定,保證服務的高質量。服務治理功能可以解決將某些特定流量引入某一批機器,以及限制某些非法消費者的惡意訪問,並在提供者處理量達到一定程度是,拒絕接受新的訪問。
基於服務框架Dubbo的服務治理-服務管理
可以知道你的系統,對外提供了多少服務,可以對服務進行升級、降級、停用、權重調整等操作
可以知道你提供的服務,誰在使用,因業務需求,可以對該消費者實施屏蔽、停用等操作
基於服務框架Dubbo的服務治理-服務監控
可以統計服務的每秒請求數、平均響應時間、調用量、峰值時間等,作為服務集群規劃、性能調優的參考指標。
基於服務框架Dubbo的服務治理-服務路由
基於服務框架Dubbo的服務治理-服務保護
基於服務總線OSB的服務治理-功能介紹
基於服務總線OSB的服務治理
Q:Dubbo到底是神馬?
A:
淘寶開源的高性能和透明化的RPC遠程調用服務框架
SOA服務治理方案
Q:Dubbo原理是?
A:
-結束-
求講解Java分布式架構?
這個你要看一些書才行,這裡簡單介紹下,用戶請求過來,我們要通過dns輪詢,將用戶請求到不同的機器上(如果同一台機器處理,超過上百萬肯定不行了),然後我們每一台機器處理幾十萬的請求(除非性能好的,所以這台服務器不是處理的服務器,而是轉發服務器),在這裡我們這台控制器可以軟件負載到實際要處理的機器上,或者硬件,比方說lvs,nigix轉發到實際的處理服務器,這時一台服務器最多處理幾萬個請求或者幾千個請求,一些稍微好點的機器基本都可以應付來了,在處理程序中又出現一個問題,既然分布式說明數據量大,這時有需要我們去將數據庫進行分布式,程序發一個請求給數據庫,這時數據庫應該也應該像處理用戶請求一樣進行分散,這裡涉及到數據庫主從,備份等等,用戶的請求還包括狀態保持等功能。大概就是這樣,具體的疏漏的可以去看看
大型網站技術架構 這本書
java分布式架構有哪些技術
既然是分布式系統,系統間通信的技術就不可避免的要掌握。
首先,我們必須掌握一些基本知識,例如網絡通信協議(例如TCP / UDP等),網絡IO(Blocking-IO,NonBlocking-IO,Asyn-IO),網卡(多隊列等)。 了解有關連接重用,序列化/反序列化,RPC,負載平衡等的信息。
在學習了這些基本知識之後,您基本上可以在分布式系統中編寫一個簡單的通信模塊,但這實際上還遠遠不夠。 現在,您已經進入了分布式字段,您已經對規模有很多要求。 這意味着需要一種通信程序,該程序可以支持大量連接,高並發性和低資源消耗。
大量的連接通常會有兩種方式:
大量client連一個server
當前在NonBlocking-IO非常成熟的情況下,支持大量客戶端的服務器並不難編寫,但是在大規模且通常是長連接的情況下,有一點需要特別注意 ,即服務器掛起時不可能所有客戶端都在某個時間點啟動重新連接。 那基本上是一場災難。 我見過一些沒有經驗的類似案例。 客戶端規模擴大後,服務器基本上會在重新啟動後立即刷新。 大量傳入連接中斷(當然,服務器的積壓隊列首先應設置為稍大一些)。 可以使用的通常方法是在客戶端重新連接之前睡眠一段隨機的時間。 另外,重連間隔採用避讓算法。
一個client連大量的server
有些場景也會出現需要連大量server的現象,在這種情況下,同樣要注意的也是不要並發同時去建所有的連接,而是在能力範圍內分批去建。
除了建連接外,另外還要注意的地方是並發發送請求也同樣,一定要做好限流,否則很容易會因為一些點慢導致內存爆掉。
這些問題在技術風險上得考慮進去,並在設計和代碼實現上體現,否則一旦隨着規模上去了,問題一時半會還真不太好解。
高並發這個點需要掌握CAS、常見的lock-free算法、讀寫鎖、線程相關知識(例如線程交互、線程池)等,通信層面的高並發在NonBlocking-IO的情況下,最重要的是要注意在整體設計和代碼實現上盡量減少對io線程池的時間佔用。
低資源消耗這點的話NonBlocking-IO本身基本已經做到。
伸縮性
分布式系統基本上意味着規模不小。 對於此類系統,在設計時必須考慮可伸縮性。 在體系結構圖上繪製的任何點,如果請求量或數據量繼續增加,該怎麼辦? 通過添加機器來解決。 當然,此過程不需要考慮無限的情況。 如果您有經驗的建築師,從相對較小的規模到非常大型的範圍,那麼優勢顯然並不小,而且它們也將越來越稀缺。 。
橫向可擴展性(Scale Out)是指通過增加服務器數量來提高群集的整體性能。 垂直可伸縮性(Scale Up)是指提高每台服務器的性能以提高集群的整體性能。 縱向可擴展性的上限非常明顯,而分布式系統則強調水平可伸縮性。
分布式系統應用服務最好做成無狀態的
應用服務的狀態是指運行時程序因為處理服務請求而存在內存的數據。分布式應用服務最好是設計成無狀態。因為如果應用程序是有狀態的,那麼一旦服務器宕機就會使得應用服務程序受影響而掛掉,那存在內存的數據也就丟失了,這顯然不是高可靠的服務。把應用服務設計成無狀態的,讓程序把需要保存的數據都保存在專門的存儲上(eg. 數據庫),這樣應用服務程序可以任意重啟而不丟失數據,方便分布式系統在服務器宕機後恢復應用服務。
伸縮性的問題圍繞着以下兩種場景在解決:
無狀態場景
對於無狀態場景,要實現隨量增長而加機器支撐會比較簡單,這種情況下只用解決節點發現的問題,通常只要基於負載均衡就可以搞定,硬件或軟件方式都有;
無狀態場景通常會把很多狀態放在db,當量到一定階段後會需要引入服務化,去緩解對db連接數太多的情況。
有狀態場景
所謂狀態其實就是數據,通常採用Sharding來實現伸縮性,Sharding有多種的實現方式,常見的有這麼一些:
2.1 規則Sharding
基於一定規則把狀態數據進行Sharding,例如分庫分表很多時候採用的就是這樣的,這種方式支持了伸縮性,但通常也帶來了很複雜的管理、狀態數據搬遷,甚至業務功能很難實現的問題,例如全局join,跨表事務等。
2.2 一致性Hash
一致性Hash方案會使得加機器代價更低一些,另外就是壓力可以更為均衡,例如分布式cache經常採用,和規則Sharding帶來的問題基本一樣。
2.3 Auto Sharding
Auto Sharding的好處是基本上不用管數據搬遷,而且隨着量上漲加機器就OK,但通常Auto Sharding的情況下對如何使用會有比較高的要求,而這個通常也就會造成一些限制,這種方案例如HBase。
2.4 Copy
Copy這種常見於讀遠多於寫的情況,實現起來又會有最終一致的方案和全局一致的方案,最終一致的多數可通過消息機制等,全局一致的例如zookeeper/etcd之類的,既要全局一致又要做到很高的寫支撐能力就很難實現了。
即使發展到今天,Sharding方式下的伸縮性問題仍然是很大的挑戰,非常不好做。
上面所寫的基本都還只是解決的方向,到細節點基本就很容易判斷是一個解決過多大規模場景問題的架構師,:)
穩定性
作為分布式系統,必須要考慮清楚整個系統中任何一個點掛掉應該怎麼處理(到了一定機器規模,每天掛掉一些機器很正常),同樣主要還是分成了無狀態和有狀態:
無狀態場景
對於無狀態場景,通常好辦,只用節點發現的機制上具備心跳等檢測機制就OK,經驗上來說無非就是純粹靠4層的檢測對業務不太夠,通常得做成7層的,當然,做成7層的就得處理好規模大了後的問題。
有狀態場景
對於有狀態場景,就比較麻煩了,對數據一致性要求不高的還OK,主備類型的方案基本也可以用,當然,主備方案要做的很好也非常不容易,有各種各樣的方案,對於主備方案又覺得不太爽的情況下,例如HBase這樣的,就意味着掛掉一台,另外一台接管的話是需要一定時間的,這個對可用性還是有一定影響的;
全局一致類型的場景中,如果一台掛了,就通常意味着得有選舉機制來決定其他機器哪台成為主,常見的例如基於paxos的實現。
可維護性
維護性是很容易被遺漏的部分,但對分布式系統來說其實是很重要的部分,例如整個系統環境應該怎麼搭建,部署,配套的維護工具、監控點、報警點、問題定位、問題處理策略等等。
java 分布式系統解決方案
EJB是sun的服務器端組件模型,設計目標與核心應用是部署分布式應用程序。憑藉java跨平台的優勢,用EJB技術部署的分布式系統可以不限於特定的平台。EJB (Enterprise JavaBean)是J2EE的一部分,定義了一個用於開發基於組件的企業多重應用程序的標準。其特點包括網絡服務支持和核心開發工具(SDK)。 在J2EE里,Enterprise Java Beans(EJB)稱為Java 企業Bean,是Java的核心代碼,分別是會話Bean(Session Bean),實體Bean(Entity Bean)和消息驅動Bean(MessageDriven Bean)。
相關知識請搜索“EJB”。
原創文章,作者:GRNP,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/135620.html