Java高并發(fā)高性能分布式框架從無到有微服務架構設計說明_第1頁
Java高并發(fā)高性能分布式框架從無到有微服務架構設計說明_第2頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Java高并發(fā)高性能分布式框架從無到有微服務架構設計微服務架構模式(MicroserviceArchitectPattern)。近兩年在服務的瘋狂增長與云計算技術的進步,讓微服務架構受到重點關注微服務架構是一種架構模式,它提倡將單一應用程序劃分成一組小的服務,服務之間互相協(xié)調、互相配合,為用戶提供最終價值。每個服務運行在其獨立的進程中,服務與服務間采用輕量級的通信機制互相溝通(通常是基于HTTP的RESTfulAPI)。每個服務都圍繞著具體業(yè)務進行構建,并且能夠被獨立地部署到生產(chǎn)環(huán)境、類生產(chǎn)環(huán)境等。另外,應盡量避免統(tǒng)一的、集中式的服務管理機制,對具體的一個服務而言,應根據(jù)業(yè)務上下文,選擇合適的

2、語言、工具對其進行構建。微服務架構優(yōu)勢首先簡單介紹了微服務(Microservices)的涵及優(yōu)勢,微服務架構的本質,是用一些功能比較明確、業(yè)務比較精練的服務去解決更大、更實際的問題。微服務架構將服務拆分,分別采用相對獨立的服務對各方面進行管理,彼此之間使用統(tǒng)一的接口來進行交流,架構變得復雜,優(yōu)勢也很明顯:復雜度可控:在將應用分解的同時,規(guī)避了原本復雜度無止境的積累。每一個微服務專注于單一功能,并通過定義良好的接口清晰表述服務邊界。由于體積小、復雜度低,每個微服務可由一個小規(guī)模開發(fā)團隊完全掌控,易于保持高可維護性和開發(fā)效率。什么是微服務架構微服務架構優(yōu)勢獨立部署:由于微服務具備獨立的運行進程,

3、所以每個微服務也可以獨立部署。當某個微服務發(fā)生變更時無需編譯、部署整個應用。由微服務組成的應用相當于具備一系列可并行的發(fā)布流程,使得發(fā)布更加高效,同時降低對生產(chǎn)環(huán)境所造成的風險,最終縮短應用交付周期。技術選型靈活:微服務架構下,技術選型是去中心化的。每個團隊可以根據(jù)自身服務的需求和行業(yè)發(fā)展的現(xiàn)狀,自由選擇最適合的技術棧。由于每個微服務相對簡單,當需要對技術棧進行升級時所面臨的風險較低,甚至完全重構一個微服務也是可行的。容錯:當某一組建發(fā)生故障時,在單一進程的傳統(tǒng)架構下,故障很有可能在進程擴散,形成應用全局性的不可用。在微服務架構下,故障會被隔離在單個服務中。若設計良好,其他服務可通過重試、平穩(wěn)

4、退化等機制實現(xiàn)應用層面的容錯。擴展:單塊架構應用也可以實現(xiàn)橫向擴展,就是將整個應用完整的復制到不同的節(jié)點。當應用的不同組件在擴展需求上存在差異時,微服務架構便體現(xiàn)出其靈活性,因為每個服務可以根據(jù)實際需求獨立進行擴展。互聯(lián)網(wǎng)高并發(fā)相關名詞頁面瀏覽數(shù)(pageviews)唯一身份瀏覽量(UniquePageViews)獨立訪問者數(shù)量(uniquevisitors)重復訪問者數(shù)量(repeatvisitors)每個訪問者的頁面瀏覽數(shù)(PageViewsperuser)高并發(fā)之前我將高并發(fā)的解決方法誤認為是線程或者是隊列可以解決,因為高并發(fā)的時候是有很多用戶在訪問,導致出現(xiàn)系統(tǒng)數(shù)據(jù)不正確、丟失數(shù)據(jù)現(xiàn)象

5、,所以想到的是用隊列解決,其實隊列解決的方式也可以處理,比如我們在競拍商品、轉發(fā)評論微博或者是秒殺商品等,同一時間訪問量特別大,隊列在此起到特別的作用,將所有請求放入隊列,以毫秒計時單位,有序的進行,從而不會出現(xiàn)數(shù)據(jù)丟失系統(tǒng)數(shù)據(jù)不正確的情況。經(jīng)過查資料,高并發(fā)的解決方法有倆種,一種是使用緩存、另一種是使用生成靜態(tài)頁面;還有就是從最基礎的地方優(yōu)化我們寫代碼減少不必要的資源浪費:(1.不要頻繁的new對象,對于在整個應用中只需要存在一個實例的類使用單例模式.對于String的連接操作,使用StringBuffer或者StringBuilder.對于utility類型的類通過靜態(tài)方法來訪問。2.避免

6、使用錯誤的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要不要使用instanceof做條件判斷,盡量使用比的條件判斷方式.使用JAVA中效率高的類,比如ArrayList比Vector性能好。高并發(fā)-需要解決的問題一:應用緩存二:HTTP緩存三:多級緩存四:池化五:異步并發(fā)六:擴容七:隊列高并發(fā)-應用緩存堆緩存使用Java堆存來存儲緩存對象。使用堆緩存的好處是沒有序列化/反序列化,是最快的緩存。缺點也很明顯,當緩存的數(shù)據(jù)量很大時,GC(垃圾回收)暫停時間會變長,存儲容量受限于堆空間大小。一般通過軟引用/弱引用來存儲緩存對象,即當堆

7、存不足時,可以強制回收這部分存釋放堆存空間。一般使用堆緩存存儲較熱的數(shù)據(jù)。有GuavaCache:緩存和ConcurrentMap是非常相像的,但是它們也不完全一樣。最根本的區(qū)別就是,ConcurrentMap會持有所有添加的對象,直到被顯示的移除。而緩存為了限制其存的使用,通常都會配置成可以自動的將對象移除。在某些情況下即使不自動移除對象也是非常有用的,如LoadingCache它會自動加載緩存對象。Ehcache3.x:是一種廣泛使用的開源Java分布式緩存。主要面向通用緩存,JavaEE和輕量級容器。它具有存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servle

8、t過濾器,支持REST和SOAPapi等特點。MapDB:mapdb是一個嵌的純java的數(shù)據(jù)庫,提供了并發(fā)的HashMap、TreeMap、Queue,可以基于堆外或者磁盤來存儲數(shù)據(jù)高并發(fā)-應用緩存堆外緩存即緩存數(shù)據(jù)存儲在堆外存,可以減少GC暫停時間(堆對象轉移到堆外,GC掃描和移動的對象變少),但是,讀取數(shù)據(jù)時需要序列化/反序列化,因此會比堆緩存要慢很多。有Ehcache3.x、MapDB實現(xiàn)磁盤緩存即緩存數(shù)據(jù)存儲在磁道上,在JVM重啟時數(shù)據(jù)還存在的,而堆緩存/堆外緩存數(shù)據(jù)會丟失,需要重新加載。有Ehcache3.x、MapDB實現(xiàn)分布式緩存進程緩存和磁盤緩存,在多JVM實例的情況下,會存

9、在兩個問題:1、單機容量問題;2、數(shù)據(jù)一致性問題(多臺JVM實例的緩存數(shù)據(jù)不一致怎么辦?)這個問題不用糾結,既然數(shù)據(jù)允許緩存,則表示允許一定時間的不一致,因此可以設置緩存數(shù)據(jù)的過期時間來定期更新數(shù)據(jù);3、緩存不命中時,需要回源到DB/服務請求多變問題:每個實例在緩存不命中的情況下都會回源到DB加載數(shù)據(jù),因此多實例后DB整體的訪問量變多了解決辦法是可以使用如一致性哈希分片算法。因此,這些情況可以考慮使用分布式緩存來解決??梢允褂胑hcache-clustered(配合Terracottaserver)實現(xiàn)JAVA進程間分布式緩存。最好的辦法是使用redis實現(xiàn)分布式緩存。高并發(fā)-HTTP緩存瀏覽

10、器緩存是指當我們使用瀏覽器訪問一些頁面或者http服務時,根據(jù)服務端返回的緩存設置響應頭將響應容緩存到瀏覽器,下次可以直接使用緩存容或者僅需要去服務端驗證容是否過期即可。這樣的好處可以減少瀏覽器和服務端之間來回傳輸?shù)臄?shù)據(jù)量,節(jié)省帶寬提升性能。解決辦法:容不需要動態(tài)(計算、渲染等)速度更快,容越接近于用戶速度越快。像apachetrafficserver、squid、varnish、nginx等技術都可以來進行容緩存。還有CDN就是用來加速用戶訪問的:即用戶首先訪問到全國各地的CDN節(jié)點(使用如ATS、Squid實現(xiàn)),如果CDN沒命中,會回源到中央nginx集群,該集群如果沒有命中緩存(該集群

11、的緩存不是必須的,要根據(jù)實際命中情況等決定),最后回源到后端應用集群。高并發(fā)-多級緩存(分布式緩存)高并發(fā)-池化在應用系統(tǒng)開發(fā)過程中,我們經(jīng)常會用到池化技術,如對象池、連接池、線程池等,通過池化來減少一些消耗,以提升性能。對象池通過復用對象從而減少創(chuàng)建對象、垃圾回收的開銷。但是,池化不能太大,太大會影響GC時的掃描時間。連接池如數(shù)據(jù)庫連接池、Redis連接池、Http連接池,通過復用TCP連接減少創(chuàng)建和釋放連接的時間來提升性能。線程池也是類似的,通過復用線程提升性能。也就是說池化的目的就是通過復用技術提升性能。高并發(fā)-擴容1、讀寫分離:當數(shù)據(jù)庫訪問量還不是很大的時候,我們可以適當增加服務器,數(shù)

12、據(jù)庫主從復制的方式將讀寫分離2、垂直分區(qū):當寫入操作一旦增加的時候,那么主從數(shù)據(jù)庫將花更多的時間的放在數(shù)據(jù)同步上,這個時候服務器也是不堪重負的;那么就有了數(shù)據(jù)的垂直分區(qū),數(shù)據(jù)的垂直分區(qū)思路是將寫入操作比較頻繁的數(shù)據(jù)表,如用戶表_user,或者訂單表orders,那么我們就可以把這個兩個表分離出來,放在不同的服務器,如果這兩個表和其他表存在聯(lián)表查詢,那么就只能把原來的sql語句給拆分了,先查詢一個表,在查詢另一個,雖然說這個會消耗更過性能,但比起那種大量數(shù)據(jù)同步,負擔還是減輕了不少;3、水平分區(qū):但是往往事情不盡人意,可能采取垂直分區(qū)能撐一段時間,由于太火了,訪問量又每日100w,下子蹦到了lOOOw,這個時候可以采取數(shù)據(jù)的進行分離,我們可以根據(jù)user的Id不同進行分配,如采取%2、%10形式,當然這

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論