⑴ 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分布式技術都包括什麼能詳細列舉么
分布式是一種思想,范圍很廣,我得先知道它的誕生:
以前是一個資料庫 一個JSP 就可以做一個應用了,後來隨著業務復雜,我們開始分層,比如MVC之類的,再後來我們的數據越來越多了,比如有上億的數據,這個時候我們一個資料庫查詢太慢了,就開始分庫,這也算是分布式的一種。
還有比如我們的系統訪問的人多了,比如雙11,上千萬人同時訪問,我們的伺服器(網站)支持不住了,這個時候就要部署到很多個伺服器,每個伺服器分攤請求,這也是分布式
當然隨著業務擴大, 我們得分業務了,比如注冊登錄的,物流的,賣東西的 等等,不同的系統,但是各個系統之間進行協調,也算分布式一種
以上都算是分布式的來源,主要是解決 壓力過大,大家協同工作的,那麼這就涉及到一些常用的東西,或者像你說的的技術
1.你用N個資料庫才放數據,至少CRUD 方面就 麻煩些了,得用cobar,tddl,mysql-proxy 等協調
2.伺服器:你部署了很多伺服器,肯定得用個東西來分發請求這些吧,nginx,apache 等分發請求。
3.你公司有很多系統,想很好的聯系在一起,光用介面不滿足了,得用一些JMS ,像activemq,ons 之類的來協調吧
4.為了解決io問題,得加緩存吧,那麼緩存對應上面的,也得分布式吧,就涉及memcache,redies 等等
上面就簡單的介紹了下 分布式 的東西,還有很多啦,這是常用的一些,希望你能慢慢來,不是一下子 能理解得
⑶ 分布式常用技術有哪些
這個太多了,大數據方面常用的分布式存儲技術為HDFS、HBase,分布式計算技術有MapRece、Spark等等。
⑷ java 分布式 用到哪些技術
分布式是一種思想,范圍很廣,我得先知道它的誕生:
以前是一個資料庫 一個JSP 就可以做一個應用了,後來隨著業務復雜,我們開始分層,比如MVC之類的,再後來我們的數據越來越多了,比如有上億的數據,這個時候我們一個資料庫查詢太慢了,就開始分庫,這也算是分布式的一種。
還有比如我們的系統訪問的人多了,比如雙11,上千萬人同時訪問,我們的伺服器(網站)支持不住了,這個時候就要部署到很多個伺服器,每個伺服器分攤請求,這也是分布式
當然隨著業務擴大, 我們得分業務了,比如注冊登錄的,物流的,賣東西的 等等,不同的系統,但是各個系統之間進行協調,也算分布式一種
當時在遠標培訓這些都學得比較全面。
⑸ 如何學習分布式系統
有一些系統設計基礎的話,給你推薦幾本書吧: 《面向模式的軟體架構 卷4:分布式計算的模式語言》出版社:人民郵電出版社 主要講分布式計算系統軟體的設計和實現。 偏軟體方向,相對較專業。 《分布式計算(第二版)》出版社:電子工業出版社 主要介紹分布式計算的數學基礎和理論,揭示設計分布式系統的底層問題(通信、協調、同步及不確定)和基本的演算法概念及下界技術。 容易理解,適合自學。 《分布式系統原理與范型》出版社:清華大學出版社 全書的第一部分討論了分布式系統的原理、概念和技術,其中包括通信、進程、命名、同步、一致性和復制、容錯以及安全。第二部分給出了一些實際的分布式系統:基於對象的分布式系統、分布式文件系統、基於文檔的分布式系統以及基於協作的分布式系統,介紹了一些實際系統的設計思想和實現技術。 容易理解,適合自學。
⑹ 分布式架構需要哪些技術
我做過50w用戶的小型棋牌游戲。 當時使用了20台伺服器集群,前段伺服器用websocket和客戶端連接, 伺服器是c++寫的。 之後據說被人用nodejs重構了...
大致說一下吧。 分布式有邏輯層和數據層這一分。而且架構也分前端(處理客戶端連接和session管理)後端(負責數據, 業務)還有lbs伺服器。 一般客戶端訪問lbs伺服器, 會得到一個路由(前段伺服器的ip),然後連接到前端上。 前端會生成session以及連接, 用戶通過前端的介面來訪問後端伺服器來完成數據交互,
用到的技術有redis(數據共享以及緩存) mq(解耦合以及伺服器之前的消息發送) rpc(伺服器之間的數據實時同步) sysstat(子伺服器狀態監控)nginx(負載均衡。
⑺ 搭建一個大型網站分布式架構需要哪些技術
大型分布式網站架構設計與實踐 這本書可以看看。
⑻ 要在java分布式開發領域發展,需要學習的技術路線
先理解為什麼需要分布式,因為伺服器處理的能力需要提升,這里有兩個方面,第一是縱向 也就是增加cpu的能力,或者加內存;另一個方向就是 橫向 ,就是分布式。將本來一台計算機的壓力分給多太計算機,從而可以平均分布io,同時提升響應速度。
建議先從分布式 資料庫看起,之後你可以用 虛擬機,和 本機進行測試 分布式資料庫。
之後你可以使用 java操作這種分布式 資料庫。
從而 依舊用虛擬機練習web項目,將原來的項目改為分布的,練練tomcat集群。
最好的學習方式就是項目驅動,做幾個分布式的項目就差不多了。 從項目中逐漸找自己不會的知識點去學習是最快的。
⑼ 網站分布式技術有哪些
分布式軟體系統(Distributed Software Systems)是支持分布式處理的軟體系統,是在由通信網路互聯的多處理機體系結構上執行任務的系統。它包括分布式操作系統、分布式程序設計語言及其編譯(解釋)系統、分布式文件系統和分布式資料庫系統等。
分布式操作系統負責管理分布式處理系統資源和控制分布式程序運行。它和集中式操作系統的區別在於資源管理、進程通信和系統結構等方面。也可以利用nicebox來進行。
分布式程序設計語言用於編寫運行於分布式計算機系統上的分布式程序。一個分布式程序由若干個可以獨立執行的程序模塊組成,它們分布於一個分布式處理系統的多台計算機上被同時執行。它與集中式的程序設計語言相比有三個特點:分布性、通信性和穩健性。
分布式文件系統具有執行遠程文件存取的能力,並以透明方式對分布在網路上的文件進行管理和存取。
⑽ 當前最流行的分布式對象技術有哪些
分布式對象技術(DOT-Distributed Object Technology)是當前國內外學術界和企業應用界研究與應用的熱點,是關於在分布式網路計算環境下分布式對象特性和應用的研究技術,以組件技術、網路技術、體系結構技術、分布式系統技術和軟體工程技術等當前熱點技術為支撐,代表了未來重用和分布式領域理論和應用的研究方向.該論文在系統分析和總結前人工作基礎上,對DOT展開理論基礎、體系結構、管理技術、分析建模和實踐應用的研究和實踐.