1. 程式人生 > >Java面試總結——如何處理項目的高並發、大數據

Java面試總結——如何處理項目的高並發、大數據

Java Java開發 Java面試

技術分享圖片

鎮樓×××姐


1.HTML靜態化

如果網站的請求量過大,我們可以將頁面靜態化提供訪問來緩解服務器壓力,能夠緩解服務器壓力加大以及降低數據庫數據的頻繁交換。適合於某些訪問了過大,但是內容不經常改變的頁面,如首頁、新聞頁等

2.文件服務器

顧名思義,文件服務器就是將文件系統單獨拿出來提供專註於處理文件的存儲訪問系統,甚至於對個文件服務器。因為對於圖片這種資源的訪問存儲是web服務最耗資源的地方,將文件服務器單獨部署既可以將壓力轉移,交給專門的系統處理,又可以分擔風險,如果圖片服務器出現問題,那麽主服務器能夠保證正常,頂多就是文件請求不到。

3.負載均衡

負載均衡將是大型網站解決高負荷訪問和大量並發請求采用的終極解決辦法。

負載均衡建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。其原理就是將大量工作分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。

技術分享圖片


四個分類

軟件負載均衡

解決方案是指在一臺或多臺服務器相應的操作系統上安裝一個或多個附加軟件來實現負載均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的優點是基於特定環境,配置簡單,使用靈活,成本低廉,可以滿足一般的負載均衡需求。

軟件解決方案缺點也較多,因為每臺服務器上安裝額外的軟件運行會消耗系統不定量的資源,越是功能強大的模塊,消耗得越多,所以當連接請求特別大的時候,軟件本身會成為服務器工作成敗的一個關鍵;軟件可擴展性並不是很好,受到操作系統的限制;由於操作系統本身的Bug,往往會引起安全問題。

硬件負載均衡

解決方案是直接在服務器和外部網絡間安裝負載均衡設備,這種設備通常稱之為負載均衡器,由於專門的設備完成專門的任務,獨立於操作系統,整體性能得到大量提高,加上多樣化的負載均衡策略,智能化的流量管理,可達到最佳的負載均衡需求。

負載均衡器有多種多樣的形式,除了作為獨立意義上的負載均衡器外,有些負載均衡器集成在交換設備中,置於服務器與Internet鏈接之間,有些則以兩塊網絡適配器將這一功能集成到PC中,一塊連接到Internet上,一塊連接到後端服務器群的內部網絡上。

一般而言,硬件負載均衡在功能、性能上優於軟件方式,不過成本昂貴。

本地/全局

負載均衡從其應用的地理結構上分為本地負載均衡(Local Load Balance)和全局負載均衡(Global Load Balance,也叫地域負載均衡)

本地負載均衡是指對本地的服務器群做負載均衡,全局負載均衡是指對分別放置在不同的地理位置、有不同網絡結構的服務器群間作負載均衡。

本地負載均衡能有效地解決數據流量過大、網絡負荷過重的問題,並且不需花費昂貴開支購置性能卓越的服務器,充分利用現有設備,避免服務器單點故障造成數據流量的損失。其有靈活多樣的均衡策略把數據流量合理地分配給服務器群內的服務器共同負擔。即使是再給現有服務器擴充升級,也只是簡單地增加一個新的服務器到服務群中,而不需改變現有網絡結構、停止現有的服務。

全局負載均衡主要用於在一個多區域擁有自己服務器的站點,為了使全球用戶只以一個IP地址或域名就能訪問到離自己最近的服務器,從而獲得最快的訪問速度,也可用於子公司分散站點分布廣的大公司通過Intranet(企業內部互聯網)來達到資源統一合理分配的目的。

全局負載均衡有以下的特點:

實現地理位置無關性,能夠遠距離為用戶提供完全的透明服務。

除了能避免服務器、數據中心等的單點失效,也能避免由於ISP專線故障引起的單點失效。

解決網絡擁塞問題,提高服務器響應速度,服務就近提供,達到更好的訪問質量。

技術分享圖片


4.反向代理

客戶端直接訪問的服務器並不是直接提供服務的服務器,它從別的服務器獲取資源,然後將結果返回給用戶。

代理服務器和反向代理服務器:

代理服務器是代我們訪獲取資源,然後將結果返回。例如,訪問外網的代理服務器。反向代理服務器是我們正常訪問一臺服務器的時候,服務器自己調用了別的服務器。

反向代理就是說,用戶的請求請求到負載均衡的設備上,負載均衡設備再講請求分發到空閑的應用服務器上處理,處理完成之後再通過負載均衡設備返回給用戶,這樣對於用戶來說,後來的分發是不可見的。

反向代理的實現

1)需要有一個負載均衡設備來分發用戶請求,將用戶請求分發到空閑的服務器上

2)服務器返回自己的服務到負載均衡設備

3)負載均衡將服務器的服務返回用戶

代理服務器我們主動使用,是為我們服務的,不需要有自己的域名;反向代理是服務器自己使用的,我們並不知道,有自己的域名。

5.動靜分離

所謂動靜分離就是將網站靜態資源(HTML,JavaScript,CSS,img等文件)與後臺應用分開部署,提高用戶訪問靜態代碼的速度,降低對後臺應用訪問。上面的文件服務器就是動靜分離的一部分。

動靜分離的一種做法是將靜態資源部署在nginx上,後臺項目部署到應用服務器上,根據一定規則靜態資源的請求全部請求nginx服務器,達到動靜分離的目標。

靜態資源部署至CDN上

我們的方案是直接將靜態資源全部存放在CDN服務器上。因為之前項目中的JavaScript,CSS以及img文件都是存放在CDN服務器上,將HTML文件一起存放到CDN上之後,可以將靜態資源統一放置在一種服務器上,便於前端進行維護;而且用戶在訪問靜態資源時,可以很好利用CDN的優點——CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。

後端API提供數據

後端應用提供API,根據前端的請求進行處理,並將處理結果通過JSON格式返回至前端。目前應用主要采用Java平臺開發,因此應用服務器主要是Tomcat服務器,現在也開始有部分應用采用 node進行開發,應用服務器也開始使用node服務器。

前後端域名

動靜分離因為靜態資源和應用服務分別部署在不同的服務器上,因此會面臨域名策略的選擇。

相同域名

采用相同域名下,用戶請求api時可以避免跨域所帶來的問題,相對開發更為快速,工作量也相對小一些。

不同域名

前後端采用不同域名時,需要前後端開發時兼容跨域請求的情況,開發量相對上一種會稍多一些。解決跨域方式最常用的方式就是采用JSONP,還有一種解決方式使用CORS(HTTP訪問控制)允許某些域名下的跨域請求。

目前在我們的項目中JSONP方式更多,CORS因為需要瀏覽器支持,因此只會在APP內嵌HTML5,且需要POST方式時中使用。

采用不同域名的方式優點也是非常明顯的,不同域名采用兩個域名服務器,不同的域名服務器根據請求的不同采用不同的負載均衡策略;而且不同域名也可以郵箱方式前端攜帶過多的Cookie。

技術分享圖片


優點

api接口服務化:動靜分離之後,後端應用更為服務化,只需要通過提供api接口即可,可以為多個功能模塊甚至是多個平臺的功能使用,可以有效的節省後端人力,更便於功能維護。

前後端開發並行:前後端只需要關心接口協議即可,各自的開發相互不幹擾,並行開發,並行自測,可以有效的提高開發時間,也可以有些的減少聯調時間

減輕後端服務器壓力,提高靜態資源訪問速度:後端不用再將模板渲染為html返回給用戶端,且靜態服務器可以采用更為專業的技術提高靜態資源的訪問速度。

缺點

不利於網站SEO(搜索引擎優化):搜索引擎的網絡爬蟲一般是根據url訪問頁面,獲取頁面的內容後去掉沒用的信息例如:CSS,JavaScript,然後分析剩下的文本內容;動靜分離架構模式前端數據即在是由JavaScript來完成,這就會導致網絡爬蟲得到的信息部分丟失。在開發中可以采用前端緩存不經常變化數據的方式來解決,只有哪些經常發生變化的數據才每次向後端請求。

開發量變大,前後端交流成本升高:後端api返回的數據,往往是有自身邏輯在內的,比如返回數據中的包含status(1-處理中,2-處理成功,3-處理失敗),前端需要理解status的不同含義,對應的前端操作需要理解(如,status =1 or status = 2,不可提交)。

在業務高速發展時需要慎重考慮:因為開發量變大,如果在業務開始階段,缺乏前端又要求開發速度很快,就需要慎重考慮這種方式的實現成本對業務發展的影響。

6.數據庫sql優化

對於相同功能的sql,如果數據庫的sql沒有做過優化和做過優化的sql比較起來,其處理能力完全是天壤之別,其差距可以有幾倍甚至幾十上百上千的速度差距、資源消耗差距。所以對於一個優秀的web應用,sql優化是必須做的。

7.緩存

對於緩存我想大家都不陌生,緩存可以讓我們將一些有時效性的、經常訪問的、不便於存儲數據庫等的數據,我們可以將數據存儲在專門的用於緩存的應用程序中,如果有必要,還可以將緩存應用服務器單獨部署,如果數據量過大,我們還可以組成緩存服務器集群,比如:cache、redis等都是比較專註於緩存數據的。

只所以使用緩存,是因為一是減少數據庫的訪問壓力,二是一般專註於緩存的應用對於數據的讀寫較於數據庫都是非常快的

8.數據庫讀寫分離

讀寫分離是為了提供程序的性能,隨著用戶的增加,數據庫的壓力也會越來越大,對數據庫或者SQL的基本優化可能達不到最終的效果,讀寫分離簡單的說是把對數據庫讀和寫的操作分開對應不同的數據庫服務器,這樣能有效地減輕數據庫壓力,也能減輕io壓力。主數據庫提供寫操作,從數據庫提供讀操作。主數據庫提供寫操作,從數據庫提 供讀操作,其實在很多系統中,主要是讀的操作。當主數據庫進行寫操作時,數據要同步到從的數據庫,這樣才能有效保證數據庫完整性。Quest SharePlex就是比較牛的同步數據工具,聽說比oracle本身的流復制還好,mysql也有自己的同步數據技術。mysql只要是通過二進制日誌來復制數據。通過日誌在從數據庫重復主數據庫的操作達到復制數據目的。這個復制比較好的就是通過異步方法,把數據同步到從數據庫。

當然同樣的因為數據的復制同步需要時間,對於一些實時性要求非常高的邏輯可能會有問題。

9.數據庫活躍數據分離

所謂的活躍數據就是經常用到的數據,比如經常活躍的用戶數據等。不活躍數據,比如好長時間不等路的用戶數據,還有幾個月前的數據等等。

對於這種不活躍的數據參與到查詢中,會很大的拖累查詢速度嗎,所以講非活躍數據單獨同步到一個數據庫中,這樣大概率的查詢只需要查活躍數據的數據庫,只有活躍數據的數據庫查不到時,才去查非活躍數據庫。

10.批量讀取和延遲修改

高並發情況可以將多個查詢請求合並到一個。同一查詢,同一返回處理,降低短時間內的數據庫請求數量。高並發且頻繁修改的可以暫存緩存中,然後統一進行修改。

11.數據庫集群和庫表散列

通常對於一個服務器的處理的瓶頸大多在於數據庫的瓶頸,對於大數據量的請求處理,單個數據庫處理能力有限,所以我們可以部署多個數據庫,然後將數據庫組成一個集群。

對於數據庫集群,每個成熟的數據庫都有自己的解決方案,我們按照方案進行擴展即可。

上面提到的數據庫集群由於在架構、成本、擴張性方面都會受到所采用DB類型的限制,於是我們需要從應用程序的角度來考慮改善系統架構,庫表散列是常用並且最有效的解決方案。我們在應用程序中安裝業務和應用或者功能模塊將數據庫進行分離,不同的模塊對應不同的數據庫或者表,再按照一定的策略對某個頁面或者功能進行更小的數據庫散列,比如用戶表,按照用戶ID進行表散列,這樣就能夠低成本的提升系統的性能並且有很好的擴展性。sohu的論壇就是采用了這樣的架構,將論壇的用戶、設置、帖子等信息進行數據庫分離,然後對帖子、用戶按照板塊和ID進行散列數據庫和表,最終可以在配置文件中進行簡單的配置便能讓系統隨時增加一臺低成本的數據庫進來補充系統性能。

愛惜貞操的小編給大家推薦我們的Java交流:309603235,群內有Java的技術大牛,還有各種Java學習資料,歡迎菜鳥,老鳥入坑。

Java面試總結——如何處理項目的高並發、大數據