分布式是一種思想,范圍很廣,我得先知道它的誕生:
10余年的城東網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。營銷型網(wǎng)站建設的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調(diào)整城東建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“城東網(wǎng)站設計”,“城東網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
以前是一個數(shù)據(jù)庫 一個JSP 就可以做一個應用了,后來隨著業(yè)務復雜,我們開始分層,比如MVC之類的,再后來我們的數(shù)據(jù)越來越多了,比如有上億的數(shù)據(jù),這個時候我們一個數(shù)據(jù)庫查詢太慢了,就開始分庫,這也算是分布式的一種。
還有比如我們的系統(tǒng)訪問的人多了,比如雙11,上千萬人同時訪問,我們的服務器(網(wǎng)站)支持不住了,這個時候就要部署到很多個服務器,每個服務器分攤請求,這也是分布式
當然隨著業(yè)務擴大, 我們得分業(yè)務了,比如注冊登錄的,物流的,賣東西的 等等,不同的系統(tǒng),但是各個系統(tǒng)之間進行協(xié)調(diào),也算分布式一種
以上都算是分布式的來源,主要是解決 壓力過大,大家協(xié)同工作的,那么這就涉及到一些常用的東西,或者像你說的的技術
1.你用N個數(shù)據(jù)庫才放數(shù)據(jù),至少CRUD 方面就 麻煩些了,得用cobar,tddl,mysql-proxy 等協(xié)調(diào)
2.服務器:你部署了很多服務器,肯定得用個東西來分發(fā)請求這些吧,nginx,apache 等分發(fā)請求。
3.你公司有很多系統(tǒng),想很好的聯(lián)系在一起,光用接口不滿足了,得用一些JMS ,像activemq,ons 之類的來協(xié)調(diào)吧
4.為了解決io問題,得加緩存吧,那么緩存對應上面的,也得分布式吧,就涉及memcache,redies 等等
上面就簡單的介紹了下 分布式 的東西,還有很多啦,這是常用的一些,希望你能慢慢來,不是一下子 能理解得
一、高性能計算
Hadoop:Hadoop的框架最核心的設計就是:HDFS和MapReduce。HDFS為海量的數(shù)據(jù)提供了存儲,則MapReduce為海量的數(shù)據(jù)提供了計算。
Spark:Spark是UC Berkeley AMP lab所開源的類Hadoop MapReduce的通用的并行,Spark,擁有Hadoop MapReduce所具有的優(yōu)點;但不同于MapReduce的是Job中間輸出結(jié)果可以保存在內(nèi)存中,從而不再需要讀寫HDFS,因此Spark能更好地適用于數(shù)據(jù)挖掘與機器學習等需要迭代的map reduce的算法。
CUDA:CUDA(Compute Unified Device Architecture),是顯卡廠商NVIDIA推出的運算平臺。 CUDA是一種由NVIDIA推出的通用并行計算架構(gòu),該架構(gòu)使GPU能夠解決復雜的計算問題。 它包含了CUDA指令集架構(gòu)(ISA)以及GPU內(nèi)部的并行計算引擎。 開發(fā)人員現(xiàn)在可以使用C語言來為CUDA架構(gòu)編寫程序,C語言是應用最廣泛的一種高級編程語言。所編寫出的程序于是就可以在支持CUDA的處理器上以超高性能運行。CUDA3.0已經(jīng)開始支持C++和FORTRAN。
二、Hadoop生態(tài)系統(tǒng)
(1)海量數(shù)據(jù)怎么存,當然是用分布式文件系統(tǒng)——HDFS。
(2)數(shù)據(jù)怎么用呢,分析、處理MapReduce框架,讓你通過編寫代碼來實現(xiàn)對大數(shù)據(jù)的分析工作。
(3)非結(jié)構(gòu)化數(shù)據(jù)(日志)收集處理——Fuse、WebDAV、Chukwa、Flume和Scribe。
(4)數(shù)據(jù)導入HDFS中,RDBMS也可以加入HDFS的狂歡了——HIHO、Sqoop。
(5)MaoReduce太麻煩,用熟悉的方式操作Hadoop里的數(shù)據(jù)——Pig、Hive、Jaql。
(6)讓你的數(shù)據(jù)可見——Drilldown、Intellicus。
(7)用高級語言管理你的任務流——Oozie、Cascading。
(8)Hadoop自己的監(jiān)控管理工具——Hue、Karmasphere、Eclipse Plugin、Cacti、Ganglia。
(9)數(shù)據(jù)序列化處理與任務調(diào)度——Avro、ZooKeeper。
(10)更多構(gòu)建在Hadoop上層的服務——Mahout、Elastic Map Reduce。
(11)OLTP存儲系統(tǒng)——HBase。
(12)基于Hadoop的實時分析——Impala。
傳統(tǒng)的方法是:建一張表,字段有article和user。每點擊一次,增加一條記錄。一個大論壇幾天之內(nèi)記錄數(shù)就能達到千萬條。而沒有必要建索引,其他優(yōu)化的辦法,我還想不到,這樣的查詢別提多慢了。
傳統(tǒng)數(shù)據(jù)庫解決不了,那么分布式就該上場了。如果功能特別簡單,完全可以不去使用MAPREDUCE和Hbase,自己動手搞一個吧。
Java是一種跨平臺,適合于分布式計算環(huán)境的面向?qū)ο缶幊陶Z言。
具體來說,它具有如下特性:
簡單性、面向?qū)ο蟆⒎植际?、解釋型、可靠、安全、平臺無關、可移植、高性能、多線程、動態(tài)性等。
下面我們將重點介紹Java語言的面向?qū)ο?、平臺無關、分布式、多線程、可靠和安全等特性。
1.面向?qū)ο?/p>
面向?qū)ο笃鋵嵤乾F(xiàn)實世界模型的自然延伸?,F(xiàn)實世界中任何實體都可以看作是對象。對象之間通過消息相互作用。另外,現(xiàn)實世界中任何實體都可歸屬于某類事物,任何對象都是某一類事物的實例。如果說傳統(tǒng)的過程式編程語言是以過程為中心以算法為驅(qū)動的話,面向?qū)ο蟮木幊陶Z言則是以對象為中心以消息為驅(qū)動。用公式表示,過程式編程語言為:程序=算法+數(shù)據(jù);面向?qū)ο缶幊陶Z言為:程序=對象+消息。
所有面向?qū)ο缶幊陶Z言都支持三個概念:封裝、多態(tài)性和繼承,Java也不例外?,F(xiàn)實世界中的對象均有屬性和行為,映射到計算機程序上,屬性則表示對象的數(shù)據(jù),行為表示對象的方法(其作用是處理數(shù)據(jù)或同外界交互)。所謂封裝,就是用一個自主式框架把對象的數(shù)據(jù)和方法聯(lián)在一起形成一個整體??梢哉f,對象是支持封裝的手段,是封裝的基本單位。Java語言的封裝性較強,因為Java無全程變量,無主函數(shù),在Java中絕大部分成員是對象,只有簡單的數(shù)字類型、字符類型和布爾類型除外。而對于這些類型,Java也提供了相應的對象類型以便與其他對象交互操作。
多態(tài)性就是多種表現(xiàn)形式,具體來說,可以用“一個對外接口,多個內(nèi)在實現(xiàn)方法”表示。舉一個例子,計算機中的堆棧可以存儲各種格式的數(shù)據(jù),包括整型,浮點或字符。不管存儲的是何種數(shù)據(jù),堆棧的算法實現(xiàn)是一樣的。針對不同的數(shù)據(jù)類型,編程人員不必手工選擇,只需使用統(tǒng)一接口名,系統(tǒng)可自動選擇。運算符重載(operatoroverload)一直被認為是一種優(yōu)秀的多態(tài)機制體現(xiàn),但由于考慮到它會使程序變得難以理解,所以Java最后還是把它取消了。
繼承是指一個對象直接使用另一對象的屬性和方法。事實上,我們遇到的很多實體都有繼承的含義。例如,若把汽車看成一個實體,它可以分成多個子實體,如:卡車、公共汽車等。這些子實體都具有汽車的特性,因此,汽車是它們的“父親”,而這些子實體則是汽車的“孩子”。Java提供給用戶一系列類(class),Java的類有層次結(jié)構(gòu),子類可以繼承父類的屬性和方法。與另外一些面向?qū)ο缶幊陶Z言不同,Java只支持單一繼承。
2平臺無關性
Java是平臺無關的語言是指用Java寫的應用程序不用修改就可在不同的軟硬件平臺上運行。平臺無關有兩種:源代碼級和目標代碼級。C和C++具有一定程度的源代碼級平臺無關,表明用C或C++寫的應用程序不用修改只需重新編譯就可以在不同平臺上運行。
Java主要靠Java虛擬機(JVM)在目標碼級實現(xiàn)平臺無關性。JVM是一種抽象機器,它附著在具體操作系統(tǒng)之上,本身具有一套虛機器指令,并有自己的棧、寄存器組等。但JVM通常是在軟件上而不是在硬件上實現(xiàn)。(目前,SUN系統(tǒng)公司已經(jīng)設計實現(xiàn)了Java芯片,主要使用在網(wǎng)絡計算機NC上。
另外,Java芯片的出現(xiàn)也會使Java更容易嵌入到家用電器中。)JVM是Java平臺無關的基礎,在JVM上,有一個Java解釋器用來解釋Java編譯器編譯后的程序。Java編程人員在編寫完軟件后,通過Java編譯器將Java源程序編譯為JVM的字節(jié)代碼。任何一臺機器只要配備了Java解釋器,就可以運行這個程序,而不管這種字節(jié)碼是在何種平臺上生成的。另外,Java采用的是基于IEEE標準的數(shù)據(jù)類型。通過JVM保證數(shù)據(jù)類型的一致性,也確保了Java的平臺無關性。
Java的平臺無關性具有深遠意義。首先,它使得編程人員所夢寐以求的事情(開發(fā)一次軟件在任意平臺上運行)變成事實,這將大大加快和促進軟件產(chǎn)品的開發(fā)。其次Java的平臺無關性正好迎合了“網(wǎng)絡計算機”思想。如果大量常用的應用軟件(如字處理軟件等)都用Java重新編寫,并且放在某個Internet服務器上,那么具有NC的用戶將不需要占用大量空間安裝軟件,他們只需要一個
Java解釋器,每當需要使用某種應用軟件時,下載該軟件的字節(jié)代碼即可,運行結(jié)果也可以發(fā)回服務器。目前,已有數(shù)家公司開始使用這種新型的計算模式構(gòu)筑自己的企業(yè)信息系統(tǒng)。
3分布式
分布式包括數(shù)據(jù)分布和操作分布。數(shù)據(jù)分布是指數(shù)據(jù)可以分散在網(wǎng)絡的不同主機上,操作分布是指把一個計算分散在不同主機上處理。
Java支持WWW客戶機/服務器計算模式,因此,它支持這兩種分布性。對于前者,Java提供了一個叫作URL的對象,利用這個對象,你可以打開并訪問具有相同URL地址上的對象,訪問方式與訪問本地文件系統(tǒng)相同。對于后者,Java的applet小程序可以從服務器下載到客戶端,即部分計算在客戶端進行,提高系統(tǒng)執(zhí)行效率。
Java提供了一整套網(wǎng)絡類庫,開發(fā)人員可以利用類庫進行網(wǎng)絡程序設計,方便得實現(xiàn)Java的分布式特性。
4可靠性和安全性
Java最初設計目的是應用于電子類消費產(chǎn)品,因此要求較高的可靠性。Java雖然源于C++,但它消除了許多C++不可靠因素,可以防止許多編程錯誤。首先,Java是強類型的語言,要求顯式的方法聲明,這保證了編譯器可以發(fā)現(xiàn)方法調(diào)用錯誤,保證程序更加可靠;其次,Java不支持指針,這杜絕了內(nèi)存的非法訪問;第三,Java的自動單元收集防止了內(nèi)存丟失等動態(tài)內(nèi)存分配導致的問題;第四,Java解釋器運行時實施檢查,可以發(fā)現(xiàn)數(shù)組和字符串訪問的越界,最后,Java提供了異常處理機制,程序員可以把一組錯誤代碼放在一個地方,這樣可以簡化錯誤處理任務便于恢復。
由于Java主要用于網(wǎng)絡應用程序開發(fā),因此對安全性有較高的要求。如果沒有安全保證,用戶從網(wǎng)絡下載程序執(zhí)行就非常危險。Java通過自己的安全機制防止了病毒程序的產(chǎn)生和下載程序?qū)Ρ镜叵到y(tǒng)的威脅破壞。當Java字節(jié)碼進入解釋器時,首先必須經(jīng)過字節(jié)碼校驗器的檢查,然后,Java解釋器將決定程序中類的內(nèi)存布局,隨后,類裝載器負責把來自網(wǎng)絡的類裝載到單獨的內(nèi)存區(qū)域,避免應用程序之間相互干擾破壞。最后,客戶端用戶還可以限制從網(wǎng)絡上裝載的類只能訪問某些文件系統(tǒng)。
上述幾種機制結(jié)合起來,使得Java成為安全的編程語言。
5多線程
線程是操作系統(tǒng)的一種新概念,它又被稱作輕量進程,是比傳統(tǒng)進程更小的可并發(fā)執(zhí)行的單位。
C和C++采用單線程體系結(jié)構(gòu),而Java卻提供了多線程支持。
Java在兩方面支持多線程。一方面,Java環(huán)境本身就是多線程的。若干個系統(tǒng)線程運行負責必要的無用單元回收,系統(tǒng)維護等系統(tǒng)級操作;另一方面,Java語言內(nèi)置多線程控制,可以大大簡化多線程應用程序開發(fā)。Java提供了一個類Thread,由它負責啟動運行,終止線程,并可檢查線程狀態(tài)。Java的線程還包括一組同步原語。這些原語負責對線程實行并發(fā)控制。利用Java的多線程編程接口,開發(fā)人員可以方便得寫出支持多線程的應用程序,提高程序執(zhí)行效率。必須注意地是,Java的多線程支持在一定程度上受運行時支持平臺的限制。例如,如果操作系統(tǒng)本身不支持多線程,Java的多線程特性可能就表現(xiàn)不出來。
希望對你有幫助!
B/S與分布式無關
在B端只知道一個網(wǎng)站,與S端的具體實現(xiàn)也無關
在S端的后面可以有多種方式存取數(shù)據(jù),但如果自己用java來實現(xiàn)這多種方式,將會是非常麻煩的事情,所以一般情況下用第三方的數(shù)據(jù)訪問接口,這樣對于S端來說,只有一個接口存取數(shù)據(jù)
在這第三方數(shù)據(jù)接口的后面才是數(shù)據(jù)存貯層,這里就可以有多種方式的數(shù)據(jù)部署形式,比如分布式等等。
所以我們編程的 S端使用何種語言 都與 分布式無關。
一、使用分布式鎖要滿足的幾個條件:
系統(tǒng)是一個分布式系統(tǒng)(關鍵是分布式,單機的可以使用ReentrantLock或者synchronized代碼塊來實現(xiàn))
共享資源(各個系統(tǒng)訪問同一個資源,資源的載體可能是傳統(tǒng)關系型數(shù)據(jù)庫或者NoSQL)
同步訪問(即有很多個進程同事訪問同一個共享資源。沒有同步訪問,誰管你資源競爭不競爭)
二、應用的場景例子
管理后臺的部署架構(gòu)(多臺tomcat服務器+redis【多臺tomcat服務器訪問一臺redis】+mysql【多臺tomcat服務器訪問一臺服務器上的mysql】)就滿足使用分布式鎖的條件。多臺服務器要訪問redis全局緩存的資源,如果不使用分布式鎖就會出現(xiàn)問題。 看如下偽代碼:
long N=0L;
//N從redis獲取值
if(N5){
N++;
//N寫回redis
}
復制代碼