Ⅰ java的技術特點是什麼
JAVA的技術特點是什麼?
Java由美國SUN公司(被oracle公司收購)發明於1995年,是目前業界應用最廣泛、使用人數最多的語言,連續多年排名世界第一,可以稱之為「計算機語言界的英語」。
那麼Java這么高的評價它的特點有哪些,下面我來為題主解答:
一、跨平台/可移植性
這是Java的核心優勢。Java在設計時就很注重移植和跨平台性。比如:Java的int永遠都是32位。不像C++可能是16,32,可能是根據編譯器廠商規定的變化。這樣的話程序的移植就會非常麻煩。
Java首先利用文本編輯器編寫 Java源程序,源文件的後綴名為.java;再利用編譯器(javac)將源程序編譯成位元組碼文件,位元組碼文件的後綴名為.class; 最後利用虛擬機(解釋器,java)解釋執行。如下圖所示:
二、安全性
Java適合於網路/分布式環境,為了達到這個目標,在安全性方面投入了很大的精力,使Java可以很容易構建防病毒,防篡改的系統。比如Java取消了強大但又危險的指針。由於指針可進行移動運算,指針可隨便指向一個內存區域,而不管這個區域是否可用,這樣做是危險的。
三、面向對象
面向對象是一種程序設計技術,非常適合大型軟體的設計和開發。由於C++為了照顧大量C語言使用者而兼容了C,使得自身僅僅成為了帶類的C語言,多少影響了其面向對象的徹底性!Java則是完全的面向對象語言。
四、簡單性
Java就是C++語法的簡化版,我們也可以將Java稱之為「C++-」。跟我念「C加加減」,指的就是將C++的一些內容去掉;比如:頭文件,指針運算,結構,聯合,操作符重載,虛基類等等。同時,由於語法基於C語言,因此學習起來完全不費力。
五、高性能
Java最初發展階段,總是被人詬病「性能低」;客觀上,高級語言運行效率總是低於低級語言的,這個無法避免。Java語言本身發展中通過虛擬機的優化提升了幾十倍運行效率。比如,通過JIT(JUST IN TIME)即時編譯技術提高運行效率。 將一些「熱點」位元組碼編譯成本地機器碼,並將結果緩存起來,在需要的時候重新調用。這樣的話,使Java程序的執行效率大大提高,某些代碼甚至接近C++的效率。
因此,Java低性能的短腿,已經被完全解決了。業界發展上,我們也看到很多C++應用轉到Java開發,很多C++程序員轉型為Java程序員。
六、分布式
Java是為Internet的分布式環境設計的,因為它能夠處理TCP/IP協議。事實上,通過URL訪問一個網路資源和訪問本地文件是一樣簡單的。Java還支持遠程方法調用(RMI,Remote Method Invocation),使程序能夠通過網路調用方法。
七、多線程
多線程的使用可以帶來更好的交互響應和實時行為。 Java多線程的簡單性是Java成為主流伺服器端開發語言的主要原因之一。
八、健壯性
Java是一種健壯的語言,吸收了C/C++ 語言的優點,但去掉了其影響程序健壯性的部分(如:指針、內存的申請與釋放等)。Java程序不可能造成計算機崩潰。即使Java程序也可能有錯誤。如果出現某種出乎意料之事,程序也不會崩潰,而是把該異常拋出,再通過異常處理機制加以處理。
以上幾種特性你了解到啦嗎? 記得給個贊!
當然這些還沒完,Java除啦這些特性還有一些其他的特點我也來給你講一講!!
1.java的風格類似C++,從某種意義上講,java是C++的一個變種。但是java摒棄了C、C++中的容易引發錯誤和難以理解的指針,結構,以及內存管理等;
2.java是一種強類型的語言,比C/C++檢查還要嚴格,java區分大小寫字母;
3.java禁止非法訪問內存,因為java沒有指針,內存的申請和釋放;
4.對於不同的操作系統,會有不同的java虛擬機,這也就決定了java的可移植性;
5.java提供了自動垃圾回收機制gc,有效避免了C、C++的內存泄漏問題;
記得給個贊!
Ⅱ java分布式技術有哪些常用的有哪些
cloudstack,hadoop都是現在使用比較廣泛的java的分布式集群項目
Ⅲ java 分布式數據同步通過什麼實現的
Java是一種跨平台,適合於分布式計算環境的面向對象編程語言。
具體來說,它具有如下特性:
簡單性、面向對象、分布式、解釋型、可靠、安全、平台無關、可移植、高性能、多線程、動態性等。
下面我們將重點介紹Java語言的面向對象、平台無關、分布式、多線程、可靠和安全等特性。
1.面向對象
面向對象其實是現實世界模型的自然延伸。現實世界中任何實體都可以看作是對象。對象之間通過消息相互作用。另外,現實世界中任何實體都可歸屬於某類事物,任何對象都是某一類事物的實例。如果說傳統的過程式編程語言是以過程為中心以演算法為驅動的話,面向對象的編程語言則是以對象為中心以消息為驅動。用公式表示,過程式編程語言為:程序=演算法+數據;面向對象編程語言為:程序=對象+消息。
所有面向對象編程語言都支持三個概念:封裝、多態性和繼承,Java也不例外。現實世界中的對象均有屬性和行為,映射到計算機程序上,屬性則表示對象的數據,行為表示對象的方法(其作用是處理數據或同外界交互)。所謂封裝,就是用一個自主式框架把對象的數據和方法聯在一起形成一個整體。可以說,對象是支持封裝的手段,是封裝的基本單位。Java語言的封裝性較強,因為Java無全程變數,無主函數,在Java中絕大部分成員是對象,只有簡單的數字類型、字元類型和布爾類型除外。而對於這些類型,Java也提供了相應的對象類型以便與其他對象交互操作。
多態性就是多種表現形式,具體來說,可以用「一個對外介面,多個內在實現方法」表示。舉一個例子,計算機中的堆棧可以存儲各種格式的數據,包括整型,浮點或字元。不管存儲的是何種數據,堆棧的演算法實現是一樣的。針對不同的數據類型,編程人員不必手工選擇,只需使用統一介面名,系統可自動選擇。運算符重載(operatoroverload)一直被認為是一種優秀的多態機制體現,但由於考慮到它會使程序變得難以理解,所以Java最後還是把它取消了。
繼承是指一個對象直接使用另一對象的屬性和方法。事實上,我們遇到的很多實體都有繼承的含義。例如,若把汽車看成一個實體,它可以分成多個子實體,如:卡車、公共汽車等。這些子實體都具有汽車的特性,因此,汽車是它們的「父親」,而這些子實體則是汽車的「孩子」。Java提供給用戶一系列類(class),Java的類有層次結構,子類可以繼承父類的屬性和方法。與另外一些面向對象編程語言不同,Java只支持單一繼承。
2平台無關性
Java是平台無關的語言是指用Java寫的應用程序不用修改就可在不同的軟硬體平台上運行。平台無關有兩種:源代碼級和目標代碼級。C和C++具有一定程度的源代碼級平台無關,表明用C或C++寫的應用程序不用修改只需重新編譯就可以在不同平台上運行。
Java主要靠Java虛擬機(JVM)在目標碼級實現平台無關性。JVM是一種抽象機器,它附著在具體操作系統之上,本身具有一套虛機器指令,並有自己的棧、寄存器組等。但JVM通常是在軟體上而不是在硬體上實現。(目前,SUN系統公司已經設計實現了Java晶元,主要使用在網路計算機NC上。
另外,Java晶元的出現也會使Java更容易嵌入到家用電器中。)JVM是Java平台無關的基礎,在JVM上,有一個Java解釋器用來解釋Java編譯器編譯後的程序。Java編程人員在編寫完軟體後,通過Java編譯器將Java源程序編譯為JVM的位元組代碼。任何一台機器只要配備了Java解釋器,就可以運行這個程序,而不管這種位元組碼是在何種平台上生成的。另外,Java採用的是基於IEEE標準的數據類型。通過JVM保證數據類型的一致性,也確保了Java的平台無關性。
Java的平台無關性具有深遠意義。首先,它使得編程人員所夢寐以求的事情(開發一次軟體在任意平台上運行)變成事實,這將大大加快和促進軟體產品的開發。其次Java的平台無關性正好迎合了「網路計算機」思想。如果大量常用的應用軟體(如字處理軟體等)都用Java重新編寫,並且放在某個Internet伺服器上,那麼具有NC的用戶將不需要佔用大量空間安裝軟體,他們只需要一個
Java解釋器,每當需要使用某種應用軟體時,下載該軟體的位元組代碼即可,運行結果也可以發回伺服器。目前,已有數家公司開始使用這種新型的計算模式構築自己的企業信息系統。
3分布式
分布式包括數據分布和操作分布。數據分布是指數據可以分散在網路的不同主機上,操作分布是指把一個計算分散在不同主機上處理。
Java支持WWW客戶機/伺服器計算模式,因此,它支持這兩種分布性。對於前者,Java提供了一個叫作URL的對象,利用這個對象,你可以打開並訪問具有相同URL地址上的對象,訪問方式與訪問本地文件系統相同。對於後者,Java的applet小程序可以從伺服器下載到客戶端,即部分計算在客戶端進行,提高系統執行效率。
Java提供了一整套網路類庫,開發人員可以利用類庫進行網路程序設計,方便得實現Java的分布式特性。
4可靠性和安全性
Java最初設計目的是應用於電子類消費產品,因此要求較高的可靠性。Java雖然源於C++,但它消除了許多C++不可靠因素,可以防止許多編程錯誤。首先,Java是強類型的語言,要求顯式的方法聲明,這保證了編譯器可以發現方法調用錯誤,保證程序更加可靠;其次,Java不支持指針,這杜絕了內存的非法訪問;第三,Java的自動單元收集防止了內存丟失等動態內存分配導致的問題;第四,Java解釋器運行時實施檢查,可以發現數組和字元串訪問的越界,最後,Java提供了異常處理機制,程序員可以把一組錯誤代碼放在一個地方,這樣可以簡化錯誤處理任務便於恢復。
由於Java主要用於網路應用程序開發,因此對安全性有較高的要求。如果沒有安全保證,用戶從網路下載程序執行就非常危險。Java通過自己的安全機制防止了病毒程序的產生和下載程序對本地系統的威脅破壞。當Java位元組碼進入解釋器時,首先必須經過位元組碼校驗器的檢查,然後,Java解釋器將決定程序中類的內存布局,隨後,類裝載器負責把來自網路的類裝載到單獨的內存區域,避免應用程序之間相互干擾破壞。最後,客戶端用戶還可以限制從網路上裝載的類只能訪問某些文件系統。
上述幾種機制結合起來,使得Java成為安全的編程語言。
5多線程
線程是操作系統的一種新概念,它又被稱作輕量進程,是比傳統進程更小的可並發執行的單位。
C和C++採用單線程體系結構,而Java卻提供了多線程支持。
Java在兩方面支持多線程。一方面,Java環境本身就是多線程的。若干個系統線程運行負責必要的無用單元回收,系統維護等系統級操作;另一方面,Java語言內置多線程式控制制,可以大大簡化多線程應用程序開發。Java提供了一個類Thread,由它負責啟動運行,終止線程,並可檢查線程狀態。Java的線程還包括一組同步原語。這些原語負責對線程實行並發控制。利用Java的多線程編程介面,開發人員可以方便得寫出支持多線程的應用程序,提高程序執行效率。必須注意地是,Java的多線程支持在一定程度上受運行時支持平台的限制。例如,如果操作系統本身不支持多線程,Java的多線程特性可能就表現不出來。
希望對你有幫助!
Ⅳ JAVA是什麼意思
什麼是Java?
Java好象隨處可見 - 甚至在TV中。盡管如此,說清楚Java是什 么和它能做什麼卻不那麼容易。剛開始接觸Java的人通常有三
個問題:
什麼是Java?
Java能做什麼?
Java怎樣改變我的生活?
讓我們先回答第一個問題:什麼是Java?
Java既是一種編程語言,又是一個平台。
Java程序語言
Java是具有以下特徵的高級程序語言:
簡單
面向對象
可分布
可解釋
強壯
安全性
結構化
輕便
功能強大
多線程
動態
Java既可以被編譯,也可以被解釋。通過編譯器,可以把Java程序翻譯成一種中間代碼 - 稱為位元組碼 - 可以被Java解釋器
解釋的獨立於平台的代碼。通過解釋器,每條Java位元組指令被分析,然後在計算機上運行。只需編譯一次,程序運行時解釋執行。
一 有很多教程,叫學了也白搭
這年頭,網上的Java教程一堆一堆的,看的我們很多Java寶寶們是眼花繚亂,不知該如何是好,我當年也是從這個過程走過來的,每天看很多老師的Java教程,聽的自己暈頭轉向的,當然我不是說他們講錯了,他們講的知識層面的東西是對的,但是很多做Java教程的老師不善於深入淺出,通俗易懂的來為我們講解知識,什麼是好教程?好教程就是讓我們學了之後,有一種豁然開朗的感覺,而不是雲深不知處,我想說的是這種教程,不看也罷,浪費了時間,迷茫了自己。
二 有一種教程叫無論你身處何地,都能現場直播教你
現在很多網上流傳的教程都是很多年前的,遠遠的不適應現在Java新應用的需要,基本上都是一些淘汰貨,很多小夥伴們,從網上找這種破爛,學的還不亦樂乎,也是醉了。綜上所述,我們很多人學不好Java,是因為 一開始就選擇錯了,選擇不對,努力白費。為了能夠讓廣大Java學子們在網上學到Java的系統精華知識,通俗易懂的理解這些知識,我們決定現在每天晚上現場直播在網上教大家學習Java,我們的老師,一般的老師不用,我們只讓牛掰的老師講,而你什麼都不需要付出,你只需要來我們這個群里聽就行,開頭的的第一部分是:426.,位於中間的第二部分是:396,處於最後一部分的是:284,學習沒有任何借口,想強大就要努力,同時這也不是一個單打獨斗的時代了,大家在這里一塊學習,打拚出屬於我們的Java新天地。
基本概念:
1.OOP中唯一關系的是對象的介面是什麼,就像計算機的銷售商她不管電源內部結構是怎樣的,他只關系能否給你提供電就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的屬性和行為對象組成的,不同的對象的訪問通過函數調用來完成,對象間所有的交流都是通過方法調用,通過對封裝對象數據,很大限度上提高復用率。
2.OOP中最重要的思想是類,類是模板是藍圖,從類中構造一個對象,即創建了這個類的一個實例(instance)。
3.封裝:就是把數據和行為結合起在一個包中)並對對象使用者隱藏數據的實現過程,一個對象中的數據叫他的實例欄位(instance field)。
4.通過擴展一個類來獲得一個新類叫繼承(inheritance),而所有的類都是由Object根超類擴展而得,根超類下文會做介紹。
5.對象的3個主要特點
behavior---說明這個對象能做什麼.
state---當對象施加方法時對象的反映.
identity---與其他相似行為對象的區分標志.
每個對象有唯一的indentity 而這3者之間相互影響.
6.類之間的關系:
use-a :依賴關系
has-a :聚合關系
is-a :繼承關系--例:A類繼承了B類,此時A類不僅有了B類的方法,還有其自己的方法.(個性存在於共性中)
7.構造對象使用構造器:構造器的提出,構造器是一種特殊的方法,構造對象並對其初始化。
例:Data類的構造器叫Data
new Data()---構造一個新對象,且初始化當前時間.
Data happyday=new Data()---把一個對象賦值給一個變數happyday,從而使該對象能夠多次使用,此處要聲明的使變數與對象變數二者是不同的.new返回的值是一個引用。
構造器特點:構造器可以有0個,一個或多個參數
構造器和類有相同的名字
一個類可以有多個構造器
構造器沒有返回值
構造器總是和new運算符一起使用.
8.重載:當多個方法具有相同的名字而含有不同的參數時,便發生重載.編譯器必須挑選出調用哪個方法。
9.包(package)Java允許把一個或多個類收集在一起成為一組,稱作包,以便於組織任務,標准Java庫分為許多包.java.lang java.util java,net等,包是分層次的所有的java包都在java和javax包層次內。
10.繼承思想:允許在已經存在的類的基礎上構建新的類,當你繼承一個已經存在的類時,那麼你就復用了這個類的方法和欄位,同時你可以在新類中添加新的方法和欄位。
11.擴展類:擴展類充分體現了is-a的繼承關系. 形式為:class (子類) extends (基類)。
12.多態:在java中,對象變數是多態的.而java中不支持多重繼承。
13.動態綁定:調用對象方法的機制。
(1)編譯器檢查對象聲明的類型和方法名。
(2)編譯器檢查方法調用的參數類型。
(3)靜態綁定:若方法類型為priavte static final 編譯器會准確知道該調用哪個方法。
(4)當程序運行並且使用動態綁定來調用一個方法時,那麼虛擬機必須調用x所指向的對象的實際類型相匹配的方法版本。
(5)動態綁定:是很重要的特性,它能使程序變得可擴展而不需要重編譯已存代碼。
14.final類:為防止他人從你的類上派生新類,此類是不可擴展的。
15.動態調用比靜態調用花費的時間要長。
16.抽象類:規定一個或多個抽象方法的類本身必須定義為abstract。
例: public abstract string getDescripition
17.Java中的每一個類都是從Object類擴展而來的。
18.object類中的equal和toString方法。
equal用於測試一個對象是否同另一個對象相等。
toString返回一個代表該對象的字元串,幾乎每一個類都會重載該方法,以便返回當前狀態的正確表示.
(toString 方法是一個很重要的方法)
19.通用編程:任何類類型的所有值都可以同object類性的變數來代替。
20.數組列表:ArrayList動態數組列表,是一個類庫,定義在java.uitl包中,可自動調節數組的大小。
21.class類 object類中的getclass方法返回ckass類型的一個實例,程序啟動時包含在main方法的類會被載入,虛擬機要載入他需要的所有類,每一個載入的類都要載入它需要的類。
22.class類為編寫可動態操縱java代碼的程序提供了強大的功能反射,這項功能為JavaBeans特別有用,使用反射Java能支持VB程序員習慣使用的工具。
能夠分析類能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射機制十分強大.
1.在運行時分析類的能力。
2.在運行時探察類的對象。
3.實現通用數組操縱代碼。
4.提供方法對象。
而此機制主要針對是工具者而不是應用及程序。
反射機制中的最重要的部分是允許你檢查類的結構.用到的API有:
java.lang.reflect.Field 返回欄位.
java.reflect.Method 返回方法.
java.lang.reflect.Constructor 返回參數.
方法指針:java沒有方法指針,把一個方法的地址傳給另一個方法,可以在後面調用它,而介面是更好的解決方案。
23.介面(Interface)說明類該做什麼而不指定如何去做,一個類可以實現一個或多個interface。
24.介面不是一個類,而是對符合介面要求的類的一套規范。
若實現一個介面需要2個步驟:
1.聲明類需要實現的指定介面。
2.提供介面中的所有方法的定義。
聲明一個類實現一個介面需要使用implements 關鍵字
class actionB implements Comparable 其actionb需要提供CompareTo方法,介面不是類,不能用new實例化一個介面.
25.一個類只有一個超類,但一個類能實現多個介面。Java中的一個重要介面:Cloneable
26.介面和回調.編程一個常用的模式是回調模式,在這種模式中你可以指定當一個特定時間發生時回調對象上的方法。
例:ActionListener 介面監聽.
類似的API有:java.swing.JOptionPane
java.swing.Timer
java.awt.Tookit
27.對象clone:clone方法是object一個保護方法,這意味著你的代碼不能簡單的調用它。
28.內部類:一個內部類的定義是定義在另一個內部的類。
原因是:
1.一個內部類的對象能夠訪問創建它的對象的實現,包括私有數據。
2.對於同一個包中的其他類來說,內部類能夠隱藏起來。
3.匿名內部類可以很方便的定義回調。
4.使用內部類可以非常方便的編寫事件驅動程序。
29.代理類(proxy):
1.指定介面要求所有代碼
2.object類定義的所有的方法(toString equals)
30.數據類型:Java是強調類型的語言,每個變數都必須先申明它都類型,java中總共有8個基本類型.4種是整型,2種是浮點型,一種是字元型,被用於Unicode編碼中的字元,布爾型。
Ⅳ 有沒有大佬,知道java分布式怎麼實現單列模式。描述一個大概的原理就OK。感謝!
好奇怪的問題,分布式和單例模式沒什麼關系吧。
或許你想問的是如何實現分布式事務,或者分布式環境下變數的一致性,
如果是這樣一個問題,就等價於多進程之間如何共享內存。
兩種方法,一種是通過磁碟來共享內存,走的是操作系統層面的技術。
另一種是一致性演算法,通常有paxos和raft兩種,前者有zookeeper這個分布式組件可用
Ⅵ 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的分布式計算有什麼用
你好
根據你的描述,建議參考網路文庫這篇關於Java的分布式計算文章
http://www..com/link?url=_MTFA-_a3bhi
Ⅷ 有沒有用Java寫的輕量級開源的分布式存儲系統
以下內容源於分布式內存文件系統:Tachyon 14年9月的文章
Tachyon是一個分布式內存文件系統,可以在集群里以訪問內存的速度來訪問存在tachyon里的文件。把Tachyon是架構在最底層的分布式文件存儲和上層的各種計算框架之間的一種中間件。主要職責是將那些不需要落地到DFS里的文件,落地到分布式內存文件系統中,來達到共享內存,從而提高效率。同時可以減少內存冗餘,GC時間等。
<img src="https://pic3.mg.com/_b.png" data-rawwidth="810" data-rawheight="311" class="origin_image zh-lightbox-thumb" width="810" data-original="https://pic3.mg.com/_r.png">
Tachyon架構
Tachyon的架構是傳統的Master—slave架構,這里和Hadoop類似,TachyonMaster里WorkflowManager是 Master進程,因為是為了防止單點問題,通過Zookeeper做了HA,可以部署多台Standby Master。Slave是由Worker Daemon和Ramdisk構成。這里個人理解只有Worker Daemon是基於JVM的,Ramdisk是一個off heap memory。Master和Worker直接的通訊協議是Thrift。
下圖來自Tachyon的作者Haoyuan Li:
<img src="https://pic4.mg.com/_b.png" data-rawwidth="854" data-rawheight="571" class="origin_image zh-lightbox-thumb" width="854" data-original="https://pic4.mg.com/_r.png">
三、Fault Tolerant
Tachyon是一個分布式文件存儲系統,但是如果Tachyon里的容錯機制是怎麼樣的呢?
Tachyon使用血統這個我們在Spark里的RDD里已經很熟悉了,這里也有血統這一概念。會使用血統,通過非同步的向Tachyon的底層文件系統做Checkpoint。
當我們向Tachyon裡面寫入文件的時候,Tachyon會在後台非同步的把這個文件給checkpoint到它的底層存儲,比如HDFS,S3.. etc...
這里用到了一個Edge的演算法,來決定checkpoint的順序。
比較好的策略是每次當前一個checkpoint完成之後,就會checkpoint一個最新生成的文件。當然想Hadoop,Hive這樣的中間文件,需要刪除的,是不需要checkpoint的。
下圖來自Tachyon的作者Haoyuan Li:
<img src="https://pic1.mg.com/_b.png" data-rawwidth="822" data-rawheight="609" class="origin_image zh-lightbox-thumb" width="822" data-original="https://pic1.mg.com/_r.png">
關於重新計算時,資源的分配策略:
目前Tachyon支持2種資源分配策略:
1、優先順序的資源分配策略
2、公平調度的分配策略
<img src="https://pic2.mg.com/_b.png" data-rawwidth="940" data-rawheight="621" class="origin_image zh-lightbox-thumb" width="940" data-original="https://pic2.mg.com/_r.png">
四、總結
Tachyon是一個基於內存的分布式文件系統,通常位於分布式存儲系統和計算框架直接,可以在不同框架內共享內存,同時可以減少內存冗餘和基於Jvm內存計算框架的GC時間。
Tachyon也有類似RDD的血統概念,input文件和output文件都是會有血統關系,這樣來達到容錯。並且Tachyon也利用血統關系,非同步的做checkpoint,文件丟失情況下,也能利用兩種資源分配策略來優先計算丟失掉的資源。
Ⅸ java解決分布式存儲計算
一、高性能計算
Hadoop:Hadoop的框架最核心的設計就是:HDFS和MapRece。HDFS為海量的數據提供了存儲,則MapRece為海量的數據提供了計算。
Spark:Spark是UC Berkeley AMP lab所開源的類Hadoop MapRece的通用的並行,Spark,擁有Hadoop MapRece所具有的優點;但不同於MapRece的是Job中間輸出結果可以保存在內存中,從而不再需要讀寫HDFS,因此Spark能更好地適用於數據挖掘與機器學習等需要迭代的map rece的演算法。
CUDA:CUDA(Compute Unified Device Architecture),是顯卡廠商NVIDIA推出的運算平台。 CUDA是一種由NVIDIA推出的通用並行計算架構,該架構使GPU能夠解決復雜的計算問題。 它包含了CUDA指令集架構(ISA)以及GPU內部的並行計算引擎。 開發人員現在可以使用C語言來為CUDA架構編寫程序,C語言是應用最廣泛的一種高級編程語言。所編寫出的程序於是就可以在支持CUDA的處理器上以超高性能運行。CUDA3.0已經開始支持C++和FORTRAN。
二、Hadoop生態系統
(1)海量數據怎麼存,當然是用分布式文件系統——HDFS。
(2)數據怎麼用呢,分析、處理MapRece框架,讓你通過編寫代碼來實現對大數據的分析工作。
(3)非結構化數據(日誌)收集處理——Fuse、WebDAV、Chukwa、Flume和Scribe。
(4)數據導入HDFS中,RDBMS也可以加入HDFS的狂歡了——HIHO、Sqoop。
(5)MaoRece太麻煩,用熟悉的方式操作Hadoop里的數據——Pig、Hive、Jaql。
(6)讓你的數據可見——Drilldown、Intellicus。
(7)用高級語言管理你的任務流——Oozie、Cascading。
(8)Hadoop自己的監控管理工具——Hue、Karmasphere、Eclipse Plugin、Cacti、Ganglia。
(9)數據序列化處理與任務調度——Avro、ZooKeeper。
(10)更多構建在Hadoop上層的服務——Mahout、Elastic Map Rece。
(11)OLTP存儲系統——HBase。
(12)基於Hadoop的實時分析——Impala。
Ⅹ java怎麼實現redis分布式鎖
Redis有一系列的命令,特點是以NX結尾,NX是Not eXists的縮寫,如SETNX命令就應該理解為:SET if Not eXists。這系列的命令非常有用,這里講使用SETNX來實現分布式鎖。
用SETNX實現分布式鎖
利用SETNX非常簡單地實現分布式鎖。例如:某客戶端要獲得一個名字foo的鎖,客戶端使用下面的命令進行獲取:
SETNX lock.foo <current Unix time + lock timeout + 1>
如返回1,則該客戶端獲得鎖,把lock.foo的鍵值設置為時間值表示該鍵已被鎖定,該客戶端最後可以通過DEL lock.foo來釋放該鎖。
如返回0,表明該鎖已被其他客戶端取得,這時我們可以先返回或進行重試等對方完成或等待鎖超時。
解決死鎖
上面的鎖定邏輯有一個問題:如果一個持有鎖的客戶端失敗或崩潰了不能釋放鎖,該怎麼解決?我們可以通過鎖的鍵對應的時間戳來判斷這種情況是否發生了,如果當前的時間已經大於lock.foo的值,說明該鎖已失效,可以被重新使用。
發生這種情況時,可不能簡單的通過DEL來刪除鎖,然後再SETNX一次,當多個客戶端檢測到鎖超時後都會嘗試去釋放它,這里就可能出現一個競態條件,讓我們模擬一下這個場景:
C0操作超時了,但它還持有著鎖,C1和C2讀取lock.foo檢查時間戳,先後發現超時了。
C1 發送DEL lock.foo
C1 發送SETNX lock.foo 並且成功了。
C2 發送DEL lock.foo
C2 發送SETNX lock.foo 並且成功了。
這樣一來,C1,C2都拿到了鎖!問題大了!
幸好這種問題是可以避免D,讓我們來看看C3這個客戶端是怎樣做的:
C3發送SETNX lock.foo 想要獲得鎖,由於C0還持有鎖,所以Redis返回給C3一個0
C3發送GET lock.foo 以檢查鎖是否超時了,如果沒超時,則等待或重試。
反之,如果已超時,C3通過下面的操作來嘗試獲得鎖:
GETSET lock.foo <current Unix time + lock timeout + 1>
通過GETSET,C3拿到的時間戳如果仍然是超時的,那就說明,C3如願以償拿到鎖了。
如果在C3之前,有個叫C4的客戶端比C3快一步執行了上面的操作,那麼C3拿到的時間戳是個未超時的值,這時,C3沒有如期獲得鎖,需要再次等待或重試。留意一下,盡管C3沒拿到鎖,但它改寫了C4設置的鎖的超時值,不過這一點非常微小的誤差帶來的影響可以忽略不計。
注意:為了讓分布式鎖的演算法更穩鍵些,持有鎖的客戶端在解鎖之前應該再檢查一次自己的鎖是否已經超時,再去做DEL操作,因為可能客戶端因為某個耗時的操作而掛起,操作完的時候鎖因為超時已經被別人獲得,這時就不必解鎖了。
示例偽代碼
根據上面的代碼,我寫了一小段Fake代碼來描述使用分布式鎖的全過程:
# get lock
lock = 0
while lock != 1:
timestamp = current Unix time + lock timeout + 1
lock = SETNX lock.foo timestamp
if lock == 1 or (now() > (GET lock.foo) and now() > (GETSET lock.foo timestamp)):
break;
else:
sleep(10ms)
# do your job
do_job()
# release
if now() < GET lock.foo:
DEL lock.foo
是的,要想這段邏輯可以重用,使用python的你馬上就想到了Decorator,而用Java的你是不是也想到了那誰?AOP + annotation?行,怎樣舒服怎樣用吧,別重復代碼就行。