![分布式架構(gòu)設(shè)計(jì)面試寶典_第1頁](http://file4.renrendoc.com/view/1a325a3dbd95c4b05cb763cb9274bd3f/1a325a3dbd95c4b05cb763cb9274bd3f1.gif)
![分布式架構(gòu)設(shè)計(jì)面試寶典_第2頁](http://file4.renrendoc.com/view/1a325a3dbd95c4b05cb763cb9274bd3f/1a325a3dbd95c4b05cb763cb9274bd3f2.gif)
![分布式架構(gòu)設(shè)計(jì)面試寶典_第3頁](http://file4.renrendoc.com/view/1a325a3dbd95c4b05cb763cb9274bd3f/1a325a3dbd95c4b05cb763cb9274bd3f3.gif)
![分布式架構(gòu)設(shè)計(jì)面試寶典_第4頁](http://file4.renrendoc.com/view/1a325a3dbd95c4b05cb763cb9274bd3f/1a325a3dbd95c4b05cb763cb9274bd3f4.gif)
![分布式架構(gòu)設(shè)計(jì)面試寶典_第5頁](http://file4.renrendoc.com/view/1a325a3dbd95c4b05cb763cb9274bd3f/1a325a3dbd95c4b05cb763cb9274bd3f5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
請(qǐng)列舉出在JDK單例模式(Singletonpattern)用于Runtime,Calendar和其他的一些類中。工廠模式(Factorypattern)被用于各種不可變的類如Boolean,像Boolean.valueOf,觀察者模式(Observerpattern)被用于Swing和很多的事件中。裝飾器設(shè)計(jì)模式(Decoratordesignpattern)被用于多個(gè)JavaIO類中。設(shè)計(jì)模式分類:創(chuàng)建型模式,結(jié)構(gòu)型模式,行為型靜態(tài)、JDK動(dòng)態(tài)以及CGLIB動(dòng)模式是jva中最常用的設(shè)計(jì)模式之一,尤其是在sping框架中廣泛應(yīng)用。對(duì)于ja的一般可分為:靜態(tài)、動(dòng)態(tài)、以及CGLIB實(shí)現(xiàn)動(dòng)態(tài)。對(duì)于上述三種模式,分別進(jìn)行說明靜態(tài)其實(shí)就是在程序運(yùn)行之前,提前寫好被方法的類,編譯后運(yùn)行。在程序運(yùn)行之前class已經(jīng)存下面實(shí)現(xiàn)一個(gè)靜態(tài)定義一個(gè)接packagepackagepublic publicString}Impl實(shí)現(xiàn)接packagepackagepublicImpl{publicString{System.out.println("return"execute";}Impl}類packagepackagepublicclassProxy{;public{}=);publicString{System.out.println("perProcess");Stringresult=this. returnresult;}}測(cè)試類packagepackagepublicclassProxyTestpublicstaticvoidmain(String[]args)=Proxyp=newStringresult=}}運(yùn)行結(jié)果動(dòng)態(tài)主要是通過反射機(jī)制,在運(yùn)行時(shí)動(dòng)態(tài)生成所需的接packagepackagepublic{publicString}實(shí)現(xiàn)packagepackagepublicImpl{publicString{System.out.println("return"execute";}Impl}類packagepackage{{ }publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{Objectresult=method.invoke( returnresult;}});importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;publicclassDynamicProxyHandlerimplements測(cè)試packagepackageimportpublicclassDynamicProxyTestpublicstaticvoidmain(String[] =new proxySubject= Stringresult=}}運(yùn)行結(jié)果Impl無論是動(dòng)態(tài)還是靜態(tài)帶領(lǐng),都需要定義接口,然后才能實(shí)現(xiàn)功能。這同樣存在局限性,因此,為了解決這個(gè)問題,出現(xiàn)了第三種方式:clb。Cb采用了非常底層的字節(jié)碼技術(shù),其原理是通過字節(jié)碼技術(shù)為一個(gè)類創(chuàng)建子類,并在子類中采用方法的技術(shù)所有父類方法的調(diào)用,順勢(shì)織入橫切邏輯。JDK動(dòng)態(tài)與Cib動(dòng)態(tài)均是實(shí)現(xiàn)SprigAOP的基礎(chǔ)。目標(biāo)packagepackagepublic{publicStringexecute()Stringmessage="----------- returnmessage;}}通用xy.MethodInterceptor;importxy.MethodProxy;importpublicclassMyMethodInterceptorimplementspublicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{Objectresult=proxy.invokeSuper(obj,args);System.out.println(">>>>MethodInterceptorending...");return"result";}}測(cè)試packagepackageimportpublicclassCglibTestpublicstaticvoidmain(String[]{= }}}publicObject {Enhancerenhancer=newEnhancer(); enhancer.setCallback(newMyMethodInterceptor());returnenhancer.create();}) =Stringres=CglibTesttest=new執(zhí)行結(jié)果>>>>MethodInterceptor>>>>MethodInterceptorending...對(duì)象的生成過程由Enhancer類實(shí)現(xiàn),大概步驟如生成類Class的二進(jìn)制字節(jié)碼通過Class.forName加載二進(jìn)制字節(jié)碼,生成Class對(duì)象通過反射機(jī)制獲取實(shí)例構(gòu)造,并初始化類對(duì)象單例模式(SingletonPattern)是Java中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模意圖:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)它的全局點(diǎn)代碼實(shí)例publicpublicclassSingleton2privatestaticSingleton2privateSingleton2()publicstaticsynchronizedSingleton2{if(instance==null){instance=newSingleton2();}return}}餓漢式,線程安代碼實(shí)例publicpublicclassSingleton3privatestaticSingleton3instance=newprivateSingleton3()publicstaticSingleton3{return}}雙檢鎖/雙重校驗(yàn)鎖+volatile關(guān)鍵代碼實(shí)例publicpublicclassSingleton7privatestaticvolatileSingleton7instance=privateSingleton7()publicstaticSingleton7{if(instance==null){{if(instance==null){instance=newSingleton7();}}}return}}工廠模式(FactoryPattern)是Java中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模意圖:定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類自己決定實(shí)例化哪一個(gè)工廠類,工廠模式使其創(chuàng)建過程延遲到子類進(jìn)行。主要解決:主要解決接口選擇的問題創(chuàng)建一個(gè) 接口 接口的實(shí)體類。下一步是定義工廠類 FactoryFactoryPatternDemo,的演示類使用Sh Factory來獲取Sh 對(duì)象。它將向Sh Factory傳遞信息(CIRCLE/RECTANGLE/SQUARE),以便獲取它所需對(duì)象的類型。步驟創(chuàng)建一個(gè)接 publicpublicinterface{void}步驟創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類publicpublicclassRectangleimplements{publicvoiddraw()System.out.println("InsideRectangle::draw()}}publicpublicclassSquareimplements{publicvoiddraw()System.out.println("InsideSquare::draw()}}publicpublicclassCircleimplements{publicvoiddraw()System.out.println("InsideCircle::draw()}}步驟創(chuàng)建一個(gè)工廠,生成基于給定信息的實(shí)體類的對(duì) publicpublicclass //使用public{if方法獲取形狀類(StringType==null)return} Type= switch {casecase"rectangle":case"square":return}}}步驟使用該工廠,通過傳遞類型信息來獲取實(shí)體類的對(duì)publicpublicclassFactoryPatternDemopublicstaticvoidmain(String[]{Sh Factorysh //獲取Circle的對(duì)象,并調(diào)用它的draw方 1= //調(diào)用Circle的draw方 //獲取Rectangle的對(duì)象,并調(diào)用它的draw方 2= //調(diào)用Rectangledraw方////Squaredraw 3= //Squaredraw }}步驟驗(yàn)證輸出InsideCircleInsideCircle::draw()method.InsideSquare::draw()method.當(dāng)對(duì)象間存在一對(duì)多關(guān)系時(shí),則使用觀察者模式(OsrverPtrn)意圖:定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。主要解決:一個(gè)對(duì)象狀態(tài)改變給其他對(duì)象通知的問題,而且要考慮到易用和低耦合,保證高度的協(xié)作。實(shí)現(xiàn)觀察者模式使用三個(gè)類Subject、Observer和Client。Subject對(duì)象帶有綁定觀察者到Client對(duì)象和從Client對(duì)象解綁觀察者的方法。創(chuàng)建Subject類、Observer抽象類和擴(kuò)展了抽象類Observer的實(shí)ObserverPatternDemo,的演示類使用Subject和實(shí)體類對(duì)象來演示觀察者模式步驟創(chuàng)建Subject類publicpublicclassSubjectist<Observer>observers=newprivateintpublicint{return}publicvoidsetState(int{this.state=state;}publicvoidattach(Observer{}publicvoidnotifyAllObservers(){}}}步驟ObserverclassObserverprotectedSubjectvoid}步驟創(chuàng)建實(shí)體觀察者類publicpublicclassBinaryObserverextendsObserverpublicBinaryObserver(Subject{this.subject=subject;}}}publicvoid+}publicpublicclassOctalObserverextendsObserverpublicsubject){this.subject=subject;}publicvoid"+Integer.toOctalString(subject.getState())}subject){this.subject=subject;}publicvoid"+Integer.toHexString(subject.getState()).toUpperCase()}步驟使用Subject和實(shí)體觀察者對(duì)象publicpublicclassObserverPatternDemopublicstaticvoidmain(String[]{Subjectsubject=newnewHexaObserver(subject);}}}System.out.println("Secondstatechange:new步驟驗(yàn)證輸出statestatechange:BinaryString:1111HexString:FOctalString:BinaryString:1010HexString:AOctalString:裝飾器模式(DcoaorPattrn)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個(gè)包裝。意圖:動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來說,裝飾器模式相比生成子類更為靈主要解決:一般的,為了擴(kuò)展一個(gè)類經(jīng)常使用繼承方式實(shí)現(xiàn),由于繼承為類引入靜態(tài)特征,并且隨著擴(kuò)展功能的增多,子類會(huì)很膨脹。實(shí)創(chuàng)建一個(gè)Sh 接口了Sh 接口的實(shí)體類。然后創(chuàng)建一個(gè)實(shí)現(xiàn)了Sh 象裝飾類Sh Decorator,并把Sh Decorator是實(shí)現(xiàn)了 Decorator的實(shí)體類DecoratorPatternDemo,的演示類使用 Decorator來裝飾 對(duì)象步驟創(chuàng)建一個(gè)接 publicpublicinterface{void}步驟創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類publicpublicclassRectangleimplements{publicvoid{System.out.println("Sh }publicpublicclassCircleimplements publicvoid{ :}}步驟創(chuàng)建實(shí)現(xiàn)了 接口的抽象裝飾類 Decoratorimplements{protected { = }publicvoid{ }}步驟創(chuàng)建擴(kuò)展了 Decorator類的實(shí)體裝飾類 publicpublicclass Decoratorextends Decorator { }publicvoid{decoratorSh }privatevoid {System.out.println("BorderColor:}}步驟使用 Decorator來裝飾 對(duì)象publicpublicclassDecoratorPatternDemopublicstaticvoidmain(String[]{Shcircle=newredCircle=new Decorator(newredRectangle=newDecorator(new}}步驟驗(yàn)證輸出 :CircleCircleofredborder :CircleBorderColor:Red :RectangleBorderColor:Red秒通俗一點(diǎn)講就是網(wǎng)絡(luò)商家為促銷等目的組織的網(wǎng)上限時(shí)搶購業(yè)務(wù)特高并發(fā):秒殺的特點(diǎn)就是這樣時(shí)間極短、瞬間用戶量大請(qǐng)求,數(shù)據(jù)庫壓力解決方前端:頁面資源靜態(tài)化,按鈕控制,使用答題可以防止秒殺器的干擾,讓用戶有機(jī)會(huì)搶nginx:校驗(yàn)請(qǐng)求,轉(zhuǎn)發(fā)請(qǐng)求,負(fù)載均衡;動(dòng)靜分離,不走tomcat獲取靜態(tài)資源;gzip壓縮,減靜態(tài)文件傳輸?shù)捏w積,節(jié)省帶寬,提高渲染速業(yè)務(wù)層:集群,多臺(tái)機(jī)器處理,提高并發(fā)redis:集群保證高可用,持久化數(shù)據(jù);分布式鎖(悲觀鎖);緩存熱點(diǎn)數(shù)據(jù)(庫存數(shù)據(jù)庫:讀寫分離,拆分事務(wù)提高并秒殺系統(tǒng)設(shè)計(jì)小秒殺系統(tǒng)就是一個(gè)“三高”系統(tǒng),即高并發(fā)、高性能和高可用的分布式系秒殺設(shè)計(jì)原則:前臺(tái)請(qǐng)求盡量少,數(shù)據(jù)盡量少,調(diào)用鏈路盡量短,盡量不要有單秒殺高并發(fā)方法:、分流、動(dòng)靜分秒殺數(shù)據(jù)方法:減庫存策略、熱點(diǎn)、異步、限流分流主要思路:通過分布式集群技術(shù),多臺(tái)機(jī)器處理,提高并發(fā)能分布該領(lǐng)域需要解決的問題極多,在不同的技術(shù)層面上,又包括:分布式緩存、分布式數(shù)據(jù)庫、分布式計(jì)算、分布式文件系統(tǒng)等,一些技術(shù)如MQReiszookeeper等都跟分布式有關(guān)。從理念上講,分布式的實(shí)現(xiàn)有兩種形水平擴(kuò)展:當(dāng)一臺(tái)機(jī)器扛不住流量時(shí),就通過添加機(jī)器的方式,將流量平分到所有服務(wù)器上,所有機(jī)器都可以提供相同的服務(wù);垂直拆分:前端有多種查詢需求時(shí),一臺(tái)機(jī)器扛不住,可以將不同的業(yè)務(wù)需求分發(fā)到不同的機(jī)器上,比A機(jī)器處理余票查詢的請(qǐng)求,B機(jī)器處理支付的請(qǐng)求。兩個(gè)特可擴(kuò)展性:集群中的服務(wù)節(jié)點(diǎn),可以動(dòng)態(tài)的添加機(jī)器,從而增加集群的處理能高可用性:如果集群某個(gè)節(jié)點(diǎn)發(fā)生故障,這臺(tái)節(jié)點(diǎn)上面運(yùn)行的服務(wù),可以被其他服務(wù)節(jié)點(diǎn)接管,從而增強(qiáng)集群的高可用性。兩大能負(fù)載均衡:負(fù)載均衡能把任務(wù)比較均衡地分布到集群環(huán)境下的計(jì)算和網(wǎng)絡(luò)資集群容錯(cuò):當(dāng)?shù)南到y(tǒng)中用到集群環(huán)境,因?yàn)樵诩赫{(diào)用失敗時(shí),集群容錯(cuò)起到關(guān)鍵性的作用。微服務(wù)就是很小的服務(wù),小到一個(gè)服務(wù)只對(duì)應(yīng)一個(gè)單一的功能,只做一件事。這個(gè)服務(wù)可以單獨(dú)部署運(yùn)行,服務(wù)之間通過調(diào)用協(xié)同工作,每個(gè)微服務(wù)都是由獨(dú)立的小團(tuán)隊(duì)開發(fā),測(cè)試,部署,上線,負(fù)責(zé)它的整個(gè)生命周期。多線程(ultithread):多線程是指程序中包含多個(gè)執(zhí)行流,即在一個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線程來執(zhí)行不同的任務(wù)。多線程是為了提高CPU的利用率。高并發(fā)(HighConcurrency)是一種系統(tǒng)運(yùn)行過程中發(fā)生了一種“短時(shí)間內(nèi)遇到大量請(qǐng)求”發(fā)對(duì)應(yīng)的是請(qǐng)求,多線程是解決高并發(fā)的方法之一,高并發(fā)還可以通過分布式,集群,算法優(yōu)化,數(shù)據(jù)庫優(yōu)化等方法解決。分布式系統(tǒng)的目標(biāo)是提升系統(tǒng)的整體性能和吞吐量另外還要盡量保證分布式系統(tǒng)的容錯(cuò)性(假如增加臺(tái)服務(wù)器才達(dá)到單機(jī)運(yùn)行效果2倍左右的性能,那么這個(gè)分布式系統(tǒng)就根本沒有存在的意義)。即使采用了分布式系統(tǒng),也要盡力運(yùn)用并發(fā)編程、高性能網(wǎng)絡(luò)框架等等提升單機(jī)上的程序性能。中心化設(shè)兩個(gè)角色:中心化的設(shè)計(jì)思想很簡(jiǎn)單,分布式集群中的節(jié)點(diǎn)機(jī)器按照角色分工,大體上分為兩種角色:“”和“干活的”角色職責(zé):“”通常負(fù)責(zé)分發(fā)任務(wù)并監(jiān)督“干活的”,發(fā)現(xiàn)誰太閑了,就想發(fā)設(shè)法地給其安排新任務(wù),確保沒有一個(gè)“干活的”能夠偷懶,如果“”發(fā)現(xiàn)某個(gè)“干活的”因?yàn)閯诶圻^度而病倒了,則是不會(huì)考慮先嘗試“醫(yī)治”他的,而是一腳踢出去,然后把他的任務(wù)分給其他人。其中微服務(wù)架構(gòu)ubernetes就恰好采用了這一設(shè)計(jì)思路。中心化設(shè)計(jì)的問中心化設(shè)計(jì)還存在另外一個(gè)潛在的問題,既“”的能力問題:可以10個(gè)人高效工作并不意味著可以100個(gè)人高效工作,所以如果系統(tǒng)設(shè)計(jì)得不好,問題就會(huì)卡在“”身上安危問題的解決辦法:大多數(shù)中心化系統(tǒng)都采用了主備兩個(gè)“”的設(shè)計(jì)方案,可以是熱備或者冷備,也可以是自動(dòng)切換或者手動(dòng)切換,而且越來越多的新系統(tǒng)都開始具備自動(dòng)切換“”的能力,以提升系統(tǒng)的可用性。去中心化設(shè)眾生地位:在去中心化的設(shè)計(jì)里,通常沒有“”和“干活的”這兩種角色的區(qū)分,大家的角色都是一樣的,地位是的,全球互聯(lián)網(wǎng)就是一個(gè)典型的去中心化的分布式系統(tǒng),聯(lián)網(wǎng)的任意節(jié)點(diǎn)設(shè)備宕機(jī),都只會(huì)影響很小范圍的功能?!叭ブ行幕辈皇遣灰行?,而是由節(jié)點(diǎn)來中心。(集群的成員會(huì)自發(fā)的舉行“會(huì)議”新去中心化設(shè)計(jì)的問題:去中心化設(shè)計(jì)里最難解決的一個(gè)問題是“腦裂”問題,這種情況的發(fā)生概率很低,但影響很大。腦裂指一個(gè)集群由于網(wǎng)絡(luò)的故障,被分為至少兩個(gè)彼此無法通信的單獨(dú)集群,此時(shí)如果兩個(gè)集群都各自工作,則可能會(huì)產(chǎn)生嚴(yán)重的數(shù)據(jù)和錯(cuò)誤。一般的設(shè)計(jì)思路是,當(dāng)集群判斷發(fā)生了腦裂問題時(shí),規(guī)模較小的集群就“”或者服務(wù)。分布式:一個(gè)業(yè)務(wù)分拆多個(gè)子業(yè)務(wù),部署在不同的服務(wù)集群:同一個(gè)業(yè)務(wù),部署在多個(gè)服務(wù)器上。比如之前做搭的redis集群以及solr是屬于將redis服務(wù)器提供的緩存服務(wù)以及solr服務(wù)器提供的搜索服務(wù)部署在多個(gè)服務(wù)器上以提高系統(tǒng)性能、并發(fā)量解決海量問題。在理論計(jì)算機(jī)科學(xué)中,CAP定理(CAPtheorem),又被稱作布定理(Brewer’stheorem),它選描指數(shù)據(jù)在多個(gè)副本之間能夠保持一致的特性(嚴(yán)格的一致性SpringCloud在CAP法則上主要滿足的是A和P法則,Dubbo和Zookeeper在CAP法則主要滿足的是和P法CAP僅適用于原子讀寫的NOSQL場(chǎng)景中,并不適合數(shù)據(jù)庫系統(tǒng)?,F(xiàn)在的分布式系統(tǒng)具有特性比如擴(kuò)展性、可用性等等,在進(jìn)行系統(tǒng)設(shè)計(jì)和開發(fā)時(shí),不應(yīng)該僅僅局限在CAP問題上。注意:不是所謂的3選2(不要被網(wǎng)上大多數(shù)文章誤導(dǎo)了現(xiàn)實(shí)生活中,大部分人解釋這一定律時(shí),常常簡(jiǎn)單的表述為:“一致性、可用性、分區(qū)性三者你只能同時(shí)達(dá)到其中兩個(gè),不可能同時(shí)達(dá)到”。實(shí)際上這是一個(gè)非常具有誤導(dǎo)性質(zhì)的說法,而且在CAP12年之后,CAP之父也在2012年重寫了之前的。當(dāng)發(fā)生網(wǎng)絡(luò)分區(qū)的時(shí)候,如果要繼續(xù)服務(wù),那么強(qiáng)一致性和可用性只能2選1。也就是說當(dāng)網(wǎng)絡(luò)分區(qū)之后P是前提,決定了P之后才有C和A的選擇。也就是說分區(qū)容錯(cuò)性(Parttiontoleance)是必須要實(shí)現(xiàn)的。CAP定理的證關(guān)于CAP這三個(gè)特性就介紹完了,接下來試著證明一下為什么CAP不能同時(shí)滿足為了簡(jiǎn)化證明的過程,假設(shè)整個(gè)集群里只有兩個(gè)N1和N2兩個(gè)節(jié)點(diǎn),如下圖N1和N2當(dāng)中各自有一個(gè)應(yīng)用程序AB和數(shù)據(jù)庫,當(dāng)系統(tǒng)滿足一致性的時(shí)候,認(rèn)為N1N2數(shù)據(jù)庫中的數(shù)據(jù)保持一致。在滿足可用性的時(shí)候,認(rèn)為無論用戶N1還N2都以得正的結(jié),在滿足分區(qū)容錯(cuò)性的時(shí)候,認(rèn)為無論N1還是N2宕機(jī)或者是兩者的通信中斷,都不影響系統(tǒng)的運(yùn)行假設(shè)一種情況,假設(shè)某個(gè)時(shí)刻N(yùn)1N2之間的網(wǎng)絡(luò)通信突然中斷了。如果系統(tǒng)性,那么顯然可以支持這種異常。問題是在此前提下,一致性和可用性是否可以做到不受影響呢?做個(gè)假象實(shí)驗(yàn),如下圖,突然某一時(shí)刻N(yùn)1和N2之間的關(guān)聯(lián)斷開有用戶向N1發(fā)送了請(qǐng)求更改了數(shù)據(jù),將數(shù)據(jù)庫從0更新成了1。由于網(wǎng)絡(luò)斷開,所以N2數(shù)據(jù)庫依然是0,如果這個(gè)時(shí)候有一個(gè)請(qǐng)求發(fā)給了N2,但是N2并沒有辦法可以直接給出的結(jié)果1,這個(gè)時(shí)候該怎么辦呢?這個(gè)時(shí)候無法兩種方法,一種是將錯(cuò)就錯(cuò),將錯(cuò)誤的V0數(shù)據(jù)返回給用戶。第二種是阻塞等待,等待網(wǎng)絡(luò)通信恢復(fù),N2中的數(shù)據(jù)更新之后再返回給用戶。顯然前者犧牲了一致性,后者犧牲了可用性。這個(gè)例子雖然簡(jiǎn)單,但是說明的內(nèi)容卻很重要。在分布式系統(tǒng)當(dāng)中,CAP個(gè)特性是法同滿足的,必然要舍棄一個(gè)。三者舍棄一個(gè),顯然排列組合一共有三種可能。BASEBASE理論由eBay架構(gòu)師DanPritchet提出,在2008年上被分表為,并且eBay踐中總結(jié)的基于BASE理論的一套新的分布式事務(wù)解決方案。BASE是BasicallyAvailable(基本可用)、Soft-state(軟狀態(tài))和EvetuallyConset(最終一致性)三個(gè)短語的縮寫。BASE理論是對(duì)CAP中一致性和可用性權(quán)衡的結(jié)果,其來源于對(duì)大規(guī)?;ヂ?lián)網(wǎng)系統(tǒng)分布式實(shí)踐的總結(jié),是基于CAP定理逐步演化而來的,它大大降低了對(duì)系統(tǒng)的要求。BASE理論的思即使無法做到強(qiáng)一致性,但每個(gè)應(yīng)用都可以根據(jù)自身業(yè)務(wù)特點(diǎn),采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達(dá)到最終一致性。也就是犧牲數(shù)據(jù)的一致性來滿足系統(tǒng)的高可用性,系統(tǒng)中一部分?jǐn)?shù)據(jù)不可用或者不一致時(shí),仍需要保持系統(tǒng)整體“主要可用”。針對(duì)數(shù)據(jù)庫領(lǐng)域,BASE思想的主要實(shí)現(xiàn)是對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行拆分,讓不同的數(shù)據(jù)分布在不同的機(jī)器上,以提升系統(tǒng)的可用性,當(dāng)前主要有以下兩種做法:按功能劃分?jǐn)?shù)據(jù)分片(如開源的Mycat、Amoeba等)由于拆分后會(huì)涉及分布式事務(wù)問題,所以eBay在該BASE中提到了如何用最終一致性的思路來實(shí)現(xiàn)高性能的分布式事務(wù)?;究苫究捎檬侵阜植际较到y(tǒng)在出現(xiàn)不可預(yù)知故障的時(shí)候,允許損失部分可用性。但是,這絕不等價(jià)于系統(tǒng)不可用。比如響應(yīng)時(shí)間上的損失:正常情況下,一個(gè)搜索引擎需要在05秒之返回用戶應(yīng)的詢結(jié)果,但由于出現(xiàn)故障,查詢結(jié)果的響應(yīng)時(shí)間增加了1~2秒系統(tǒng)功能上的損失:正常情況下,在一個(gè)電子商務(wù)上進(jìn)行購物的時(shí)候,消費(fèi)者幾乎能夠順利完成每一筆訂單,但是在一些節(jié)日大促購物的時(shí)候,由于消費(fèi)者的購物行為激增,為了保護(hù)購物系統(tǒng)的穩(wěn)定性,部分消費(fèi)者可能會(huì)被引導(dǎo)到一個(gè)降級(jí)頁面軟狀軟狀態(tài)指允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài),并認(rèn)為該中間狀態(tài)的存在不會(huì)影響系統(tǒng)的整體可用性,即允許系統(tǒng)在不同節(jié)點(diǎn)的數(shù)據(jù)副本之間進(jìn)行數(shù)據(jù)同步的過程存在延時(shí)最終一致最終一致性強(qiáng)調(diào)的是系統(tǒng)中所有的數(shù)據(jù)副本,在經(jīng)過一段時(shí)間的同步后,最終能夠達(dá)到一個(gè)一致的狀態(tài)。性數(shù)據(jù)結(jié)構(gòu)與算冒泡排序是一種簡(jiǎn)單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,依次比較兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端算法描比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換它們兩對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì),這樣在最后的元素應(yīng)該會(huì)是最大的數(shù);動(dòng)圖演代碼實(shí)下面的排序算法使用的測(cè)試代碼如下,源publicpublicstaticvoidmain(String[]args)int[]array={3,44,38,5,47,15,36,26,27,2,46,4,19,50,//*@paramarray需要排序的數(shù)@author@date2019/7/11publicstaticvoidbubbleSort(int[]{if(array==null||array.length<={}intlength=//外層循環(huán)控制比較輪數(shù)for(inti=0;i<length;i++)內(nèi)層循環(huán)控制每輪比較次數(shù),每進(jìn)行輪排序都會(huì)找出個(gè)較(array.length1)防止索引越界,(array.length1i)減少比較次數(shù)for(intj=0;j<length-1-i;j++){//if(array[j]>array[j+{inttemp=array[j+1];array[j+1]=array[j];array[j]=temp;}}}}}算法分最佳情況:T(n)=O(n)情況:T(n)=O(n2)平均情況:T(n)=表現(xiàn)最穩(wěn)定的排序算法之一,因?yàn)闊o論什么數(shù)據(jù)進(jìn)去都是O()的時(shí)間復(fù)雜度,所以用到它的時(shí)候,數(shù)據(jù)規(guī)模越小越好。唯一的好處可能就是不占用額外的內(nèi)存空間了吧。理論上講,選擇排序可能也是平時(shí)排序一般人想到的最多的排序方法了吧。選擇排序(Selection-sort)是一種簡(jiǎn)單直觀的排序算法。它的工作原理:首先在未排序序列中找到最(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最?。ù螅┧惴鑞個(gè)記錄的直接選擇排序可經(jīng)過1趟直接選擇排序得到有序結(jié)果。具體算法描述如下:初始狀態(tài):無序區(qū)為R1…n],有序區(qū)為空;第趟排序,n1)開始時(shí),當(dāng)前有序區(qū)和無序區(qū)分別為R[1…i1]和R(i…)。該趟排序從當(dāng)前無序區(qū)中-選出關(guān)鍵字最小的記錄R[k],將它與無序區(qū)的第1個(gè)記錄R交換,使R1]和Ri+1…n)分別變?yōu)橛涗泜€(gè)數(shù)增加1個(gè)的新有序區(qū)和記錄個(gè)數(shù)減少1個(gè)的新無序區(qū);代碼實(shí)下面的排序算法使用的測(cè)試代碼如下,源publicpublicstaticvoidmain(String[]args)int[]array={3,44,38,5,47,15,36,26,27,2,46,4,19,50,//Description:*@param@return@author@date2019/7/11publicstaticvoidselectionSort(int[]{if(array==null||array.length<={}intlength=for(inti=0;i<length-1;i++)//intminIndex=for(intj=i+1;j<length;j++)//找到最小的if(array[j]<{minIndex=}}//交換元素位if(i!={swap(array,minIndex,}}}Description:@param@param@param@return@author@date2019/7/11privatestaticvoidswap(int[]array,inta,int{inttemp=array[a];array[a]=array[b];算法分最佳情況:T(n)=O(n2)情況:T(n)=O(n2)平均情況:T(n)=快速排序的基本思想:通過一趟排序?qū)⒋庞涗浄指舫瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字均比另一部分的關(guān)鍵字小,則可分別對(duì)這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個(gè)序列有序。算法描快速排序使用分治法來把一個(gè)串(list)分為兩個(gè)子串(sub-lists)。具體算法描述如從數(shù)列中挑出一個(gè)元素,稱為“基準(zhǔn)重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為(partition)操作遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排動(dòng)圖演代碼實(shí)下面的排序算法使用的測(cè)試代碼如下,源publicpublicstaticvoidmain(String[]args)int[]array={3,44,38,5,47,15,36,26,27,2,46,4,19,50,//Description:*@param@return@author@date2019/7/11publicstaticvoidquickSort(int[]{quickSort(array,0,array.length-}privatestaticvoidquickSort(int[]array,intleft,int{if(array==null||left>=right||array.length<=1){}intmid=partition(array,left,right);quickSort(array,left,mid);quickSort(array,mid+1,right);}privatestaticintpartition(int[]array,intleft,int{inttemp=array[left];while(right>left){//whilewhile(temp<=array[right]&&left<right)}if(left<right){array[left]=}while(temp>=array[left]&&left<right)}if(left<{array[right]=}}returnleft;算法分最佳情況:T(n)=O(nlogn)情況:T(n)=O(n2)平均情況:T(n)=什么叫遞遞歸函數(shù)就是直接或間接調(diào)用自身的函數(shù),也就是自身調(diào)用自一般什么時(shí)候使用遞歸還有些數(shù)據(jù)結(jié)構(gòu)如二叉樹,結(jié)構(gòu)本身固有遞歸特性;此外,有一類問題,其本身沒有明顯的遞歸結(jié)構(gòu),但用遞歸程序求解比其他方法更容易編寫程序。需滿足的兩個(gè)條有反復(fù)執(zhí)行的過程(調(diào)用自身有跳出反復(fù)執(zhí)行過程的條件(遞歸出口經(jīng)典問題遞遞歸階乘nn*(n-1*(n-2*...*1(n>0)publicstaticIntegerrecursionMulity(Integer{if(n==1){return1;}returnn*recursionMulity(n-}經(jīng)典問題:不死神兔(那契數(shù)列3個(gè)月起每個(gè)月都生一對(duì)兔子,小兔子長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)兔子,假如兔子都不死,問每個(gè)月的兔子總數(shù)為多少?分析:首先要明白題目的意思指的是每個(gè)月的兔子總對(duì)數(shù);假設(shè)將兔子分為小中大三種,兔子從出生后三個(gè)月后每個(gè)月就會(huì)生出一對(duì)兔子,那么假定第一個(gè)月的兔子為小兔子,第二個(gè)月為中兔子,第三個(gè)月之后就為大兔子,那么第一個(gè)月分別有1、0、0,第二個(gè)月分別為0、1、0,第三個(gè)月分別為1、0、1,第四個(gè)月分別為,1、1、1,第五個(gè)月分別為2、1、2,第六個(gè)月分別為32、3,第七個(gè)月分別為5、3、兔子總數(shù)分別為:1、1、2、3、5、8、于是得出了一個(gè)規(guī)律,從第三個(gè)月起,后面的兔子總數(shù)都等于前面兩個(gè)月的兔子總數(shù)之和,即為那契數(shù)列。publicpublicstaticintfib(int{if(mon<2){return1;}elsereturnfib(mon-1)+fib(mon-}}在數(shù)組1111222223]中查找數(shù)字190,紅色為二分線(折半線)查找區(qū)域,黑色為排除區(qū)域。二分查找也稱折半查找(BinaySearch),它是一種效率較高的查找方法,前提是數(shù)據(jù)結(jié)構(gòu)必須先排好序,時(shí)間復(fù)雜度可以表示OhOlo2n),以2為底,n的對(duì)數(shù)。其缺點(diǎn)是要求待查表為有序表,且插入刪除。左加右不加,找右縮左,找左publicstaticvoidmain(String[]{int[]arr={5,12,23,43,66,}}System.out.println(binarySort(arr,}*@param@parampublicstaticintbinarySearch(int[]arr,intkey)//第個(gè)下標(biāo)intlow=//inthigh=arr.length-1;intmid=0;if(key<arr[low]||key>arr[high]||low>{return-}while(low<=high)mid=(low+high)>>>1;if(key<arr[mid]){high=mid-}elseif(key>{low=mid+}elsereturn}}}二分查找間值的計(jì)這是一個(gè)經(jīng)典的話題,如何計(jì)算二分查找中的中值?大家一般給出了兩種計(jì)算方mid=(low+high)/mid=(low+high)/mid=low+(high–乍看起來,算法一簡(jiǎn)潔,算法二提取之后,跟算法一沒有什么區(qū)別。但是實(shí)際上,區(qū)別是存在的。算法一的做法,在情況下,low+igh)存在著溢出的風(fēng)險(xiǎn),進(jìn)而得到錯(cuò)誤的md誤。而算法二能夠保證計(jì)算出來的d,一定大于low,小于gh,不存在溢出的問題。一致性Hash是一種特殊的Hash算法,由于其均衡性、持久性的特點(diǎn),被廣泛的應(yīng)用于負(fù)載均衡領(lǐng)普通的Hash函數(shù)最大的作用是散列,或者說是將一系列在形式上具有相似性質(zhì)的數(shù)據(jù),打散成的、均勻分布的數(shù)據(jù)。不難發(fā)現(xiàn),這樣的Hash只要集群的數(shù)量N發(fā)生變化,之前的所有Hash就會(huì)全部失效。如果集群中的每個(gè)機(jī)器提供的服務(wù)沒有差別,倒不會(huì)產(chǎn)生什么影響,但對(duì)于分布式緩存這樣的系統(tǒng)而言,全部失效就意味著之前的緩存全部失效,將會(huì)是 良好的分布式cahce系統(tǒng)中的一致性hash算法應(yīng)該滿足以下幾個(gè)方平衡性平衡性是指哈希的結(jié)果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。很多哈希算法都能夠滿足這一條件。單調(diào)性單調(diào)性是指如果已經(jīng)有一些內(nèi)容通過哈希分派到了相應(yīng)的緩沖中,又有新的緩沖區(qū)加入到系統(tǒng)中,那么哈希的結(jié)果應(yīng)能夠保證原有已分配的內(nèi)容可以被到新的緩沖區(qū)中去,而不會(huì)被到舊的緩沖集合中的其他緩沖區(qū)。分散性在分布式環(huán)境中,終端有可能看不到所有的緩沖,而是只能看到其中的一部分。當(dāng)終端希望通過哈希過內(nèi)容到緩沖上時(shí),由于不同終端所見的緩沖范圍有可能不同,從而導(dǎo)致哈希的結(jié)果不一致,最終的結(jié)果是相同的內(nèi)容被不同的終端到不同的緩沖區(qū)中。這種情況顯然是應(yīng)該避免的,因?yàn)樗鼘?dǎo)致相同內(nèi)容被到不同緩沖中去,降低了系統(tǒng)的效率。分散性的定義就是上述情況發(fā)生的嚴(yán)重程度。負(fù)載負(fù)載問題實(shí)際上是從另一個(gè)角度看待分散性問題。既然不同的終端可能將相同的內(nèi)容到不同的緩沖區(qū)中,那么對(duì)于一個(gè)特定的緩沖區(qū)而言,也可能被不同的用戶為不同的內(nèi)容。與分散性一樣,這種情況也是應(yīng)當(dāng)避免的,因此好的哈希算法應(yīng)能夠盡量降低緩沖的負(fù)荷。平滑性平滑性是指緩存服務(wù)器的數(shù)目平滑改變和緩存對(duì)象的平滑改變是一致232-1在零點(diǎn)中方向重合下一步將各個(gè)服務(wù)器使用Hsh進(jìn)行一次哈希,具體可以選擇服務(wù)器的ip或主機(jī)名作為關(guān)鍵字進(jìn)行哈希,這樣每臺(tái)機(jī)器就能確定其在哈希環(huán)上的位置,這里假設(shè)將上文中四臺(tái)服務(wù)器使用ip地址哈希后在環(huán)空間的位置如下:接下來使用如下算法定位數(shù)據(jù)到相應(yīng)服務(wù)器:將數(shù)據(jù)key使用相同的函數(shù)Hash計(jì)算出哈希值,并定此數(shù)據(jù)在環(huán)上的位置,從此位置沿環(huán)順時(shí)針“行走”,第一臺(tái)遇到的服務(wù)器就是其應(yīng)該定位到的服務(wù)器例如有ObjectA、ObjectB、ObjectC、ObjectD四個(gè)數(shù)據(jù)對(duì)象,經(jīng)過哈希計(jì)算后,在環(huán)空間上的根據(jù)一致性哈希算法,數(shù)據(jù)A會(huì)被定為到oeA上,B被定為到NodeB上,C被定為到NodeC上,D被定為到NodeD上。下面分析一致性哈希算法的容錯(cuò)性和可擴(kuò)展性?,F(xiàn)假設(shè)NodeC不幸宕機(jī),可以看到此時(shí)對(duì)象A、B、不會(huì)受到影響,只有C對(duì)象被重定位到oeD。一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西省2024七年級(jí)道德與法治上冊(cè)第二單元成長(zhǎng)的時(shí)空第四課幸福和睦的家庭情境基礎(chǔ)小練新人教版
- 2025年臨時(shí)租房協(xié)議考研范文(2篇)
- 2025年倉儲(chǔ)租賃合同例文(三篇)
- 游戲廳裝修工程協(xié)議
- 主題公園商鋪居間合同
- 體育館裝修施工合同協(xié)議書
- 鹽田古典聲學(xué)裝修施工方案
- 機(jī)場(chǎng)候機(jī)廳墻面裝修協(xié)議
- 木材短途運(yùn)輸協(xié)議
- 服裝店內(nèi)部裝修項(xiàng)目協(xié)議
- 父母贈(zèng)與協(xié)議書
- 2025節(jié)后復(fù)工安全工作重點(diǎn)(培訓(xùn)課件)
- 員工之愛崗敬業(yè)培訓(xùn)課件1
- 高校鑄牢中華民族共同體意識(shí)教育的路徑研究
- 《宗教與文化》課件
- 醫(yī)療機(jī)構(gòu)依法執(zhí)業(yè)自查管理辦法
- 《個(gè)人所得稅征管問題及對(duì)策研究》
- 2020-2024年五年高考?xì)v史真題分類匯編(全國)專題14 中國古代史(非選擇題)(原卷版)
- JGJT46-2024《施工現(xiàn)場(chǎng)臨時(shí)用電安全技術(shù)標(biāo)準(zhǔn)》條文解讀
- 2022年云南省公務(wù)員錄用考試《申論》真題(縣鄉(xiāng)卷)及答案解析
- 大學(xué)輔導(dǎo)員崗位考核參考指標(biāo)
評(píng)論
0/150
提交評(píng)論