該文已加入筆主的開源項目——JavaGuide(一份涵蓋大部分Java程序員所須要掌握的核心知識的文檔類項目),地址: https://github.com/Snailclimb/JavaGuide 。以爲不錯的話,記得點個Star。
下面這些問題都是一線大廠的真實面試問題,不管是對你面試仍是說拓寬知識面都頗有幫助。以前發過一篇8 張圖讀懂大型網站技術架構 能夠做爲不太瞭解大型網站系統技術架構朋友的入門文章。html
<!-- MarkdownTOC -->git
<!-- /MarkdownTOC -->面試
如今大公司都在用而且將來的趨勢都是 Spring Cloud,而阿里開源的 Spring Cloud Alibaba 也是 Spring Cloud 規範的實現 。spring
咱們一般把 Spring Cloud 理解爲一系列開源組件的集合,可是 Spring Cloud並非等同於 Spring Cloud Netflix 的 Ribbon、Feign、Eureka(中止更新)、Hystrix 這一套組件,而是抽象了一套通用的開發模式。它的目的是經過抽象出這套通用的模式,讓開發者更快更好地開發業務。可是這套開發模式運行時的實際載體,仍是依賴於 RPC、網關、服務發現、配置管理、限流熔斷、分佈式鏈路跟蹤等組件的具體實現。數據庫
Spring Cloud Alibaba 是官方認證的新一套 Spring Cloud 規範的實現,Spring Cloud Alibaba 是一套國產開源產品集合,後續還會有中文 reference 和一些原理分析文章,因此,這對於國內的開發者是很是棒的一件事。阿里的這一舉動勢必會推進國內微服務技術的發展,由於在沒有 Spring Cloud Alibaba 以前,咱們的第一選擇是 Spring Cloud Netflix,可是它們的文檔都是英文的,出問題後排查也比較困難, 在國內並非有特別多的人精通。Spring Cloud Alibaba 由阿里開源組件和阿里雲產品組件兩部分組成,其致力於提供微服務一站式解決方案,方便開發者經過 Spring Cloud 編程模型輕鬆開發微服務應用。apache
另外,Apache Dubbo Ecosystem 是圍繞 Apache Dubbo 打造的微服務生態,是通過生產驗證的微服務的最佳實踐組合。在阿里巴巴的微服務解決方案中,Dubbo、Nacos 和 Sentinel,以及後續將開源的微服務組件,都是 Dubbo EcoSystem 的一部分。阿里後續也會將 Dubbo EcoSystem 集成到 Spring Cloud 的生態中。編程
具體能夠看公衆號-阿里巴巴中間件的這篇文章:獨家解讀:Dubbo Ecosystem - 從微服務框架到微服務生態後端
Dubbo 與 Spring Cloud 並非競爭關係,Dubbo 做爲成熟的 RPC 框架,其易用性、擴展性和健壯性已獲得業界的承認。將來 Dubbo 將會做爲 Spring Cloud Alibaba 的 RPC 組件,並與 Spring Cloud 原生的 Feign 以及 RestTemplate 進行無縫整合,實現「零」成本遷移。
在阿里巴巴的微服務解決方案中,Dubbo、Nacos 和 Sentinel,以及後續將開源的微服務組件,都是 Dubbo EcoSystem 的一部分。咱們後續也會將 Dubbo EcoSystem 集成到 Spring Cloud 的生態中。
性能測試指經過自動化的測試工具模擬多種正常、峯值以及異常負載條件來對系統的各項性能指標進行測試。性能測試是總稱,一般細分爲:
後端程序員或者測試日常比較經常使用的測試工具是 JMeter(官網:https://jmeter.apache.org/)。Apache JMeter 是一款基於Java的壓力測試工具(100%純Java應用程序),旨在加載測試功能行爲和測量性能。它最初被設計用於 Web 應用測試但後來擴展到其餘測試領域。
這個時候就要考慮擴容了。《億級流量網站架構核心技術》這本書上面介紹到咱們能夠考慮下面幾步來解決這個問題:
對於系統設計,理想的狀況下應支持線性擴容和彈性擴容,即在系統瓶頸時,只須要增長機器就能夠解決系統瓶頸,如下降延遲提高吞吐量,從而實現擴容需求。
若是你想擴容,則支持水平/垂直伸縮是前提。在進行拆分時,必定要清楚知道本身的目的是什麼,拆分後帶來的問題如何解決,拆分後若是沒有獲得任何收益就不要爲了
拆而拆,即不要過分拆分,要適合本身的業務。
當MySQL單表記錄數過大時,數據庫的CRUD性能會明顯降低,一些常見的優化措施以下:
下面補充一下數據庫分片的兩種常見方案:
《大型網站技術架構》第四章和第七章均有提到消息隊列對應用性能及擴展性的提高。
如上圖,在不使用消息隊列服務器的時候,用戶的請求數據直接寫入數據庫,在高併發的狀況下數據庫壓力劇增,使得響應速度變慢。可是在使用消息隊列以後,用戶的請求數據發送給消息隊列以後當即 返回,再由消息隊列的消費者進程從消息隊列中獲取數據,異步寫入數據庫。因爲消息隊列服務器處理速度快於數據庫(消息隊列也比數據庫有更好的伸縮性),所以響應速度獲得大幅改善。
經過以上分析咱們能夠得出消息隊列具備很好的削峯做用的功能——即經過異步處理,將短期高併發產生的事務消息存儲在消息隊列中,從而削平高峯期的併發事務。 舉例:在電子商務一些秒殺、促銷活動中,合理使用消息隊列能夠有效抵禦促銷活動剛開始大量訂單涌入對系統的衝擊。以下圖所示:
由於用戶請求數據寫入消息隊列以後就當即返回給用戶了,可是請求數據在後續的業務校驗、寫數據庫等操做中可能失敗。所以使用消息隊列進行異步處理以後,須要適當修改業務流程進行配合,好比用戶在提交訂單以後,訂單數據寫入消息隊列,不能當即返回用戶訂單提交成功,須要在消息隊列的訂單消費者進程真正處理完該訂單以後,甚至出庫後,再經過電子郵件或短信通知用戶訂單成功,以避免交易糾紛。這就相似咱們平時手機訂火車票和電影票。
咱們知道模塊分佈式部署之後聚合方式一般有兩種:1.分佈式消息隊列和2.分佈式服務。
先來簡單說一下分佈式服務:
目前使用比較多的用來構建SOA(Service Oriented Architecture面向服務體系結構)的分佈式服務框架是阿里巴巴開源的Dubbo.若是想深刻了解Dubbo的能夠看我寫的關於Dubbo的這一篇文章:《高性能優秀的服務框架-dubbo介紹》:http://www.javashuo.com/article/p-elojngof-dp.html
再來談咱們的分佈式消息隊列:
咱們知道若是模塊之間不存在直接調用,那麼新增模塊或者修改模塊就對其餘模塊影響較小,這樣系統的可擴展性無疑更好一些。
咱們最多見的事件驅動架構相似生產者消費者模式,在大型網站中一般用利用消息隊列實現事件驅動結構。以下圖所示:
消息隊列使利用發佈-訂閱模式工做,消息發送者(生產者)發佈消息,一個或多個消息接受者(消費者)訂閱消息。 從上圖能夠看到消息發送者(生產者)和消息接受者(消費者)之間沒有直接耦合,消息發送者將消息發送至分佈式消息隊列即結束對消息的處理,消息接受者從分佈式消息隊列獲取該消息後進行後續處理,並不須要知道該消息從何而來。對新增業務,只要對該類消息感興趣,便可訂閱該消息,對原有系統和業務沒有任何影響,從而實現網站業務的可擴展性設計。
消息接受者對消息進行過濾、處理、包裝後,構形成一個新的消息類型,將消息繼續發送出去,等待其餘消息接受者訂閱該消息。所以基於事件(消息對象)驅動的業務架構能夠是一系列流程。
另外爲了不消息隊列服務器宕機形成消息丟失,會將成功發送到消息隊列的消息存儲在消息生產者服務器上,等消息真正被消費者服務器處理後才刪除消息。在消息隊列服務器宕機後,生產者服務器會選擇分佈式消息隊列服務器集羣中的其餘服務器發佈消息。
備註: 不要認爲消息隊列只能利用發佈-訂閱模式工做,只不過在解耦這個特定業務環境下是使用發佈-訂閱模式的,好比在咱們的ActiveMQ消息隊列中還有點對點工做模式,具體的會在後面的文章給你們詳細介紹,這一篇文章主要仍是讓你們對消息隊列有一個更透徹的瞭解。
這個問題通常會在上一個問題問完以後,緊接着被問到。「使用消息隊列會帶來什麼問題?」這個問題要引發重視,通常咱們都會考慮使用消息隊列會帶來的好處而忽略它帶來的問題!
在理論計算機科學中,CAP定理(CAP theorem),又被稱做布魯爾定理(Brewer's theorem),它指出對於一個分佈式計算系統來講,不可能同時知足如下三點:
CAP僅適用於原子讀寫的NOSQL場景中,並不適合數據庫系統。如今的分佈式系統具備更多特性好比擴展性、可用性等等,在進行系統設計和開發時,咱們不該該僅僅侷限在CAP問題上。
注意:不是所謂的3選2(不要被網上大多數文章誤導了):
大部分人解釋這必定律時,經常簡單的表述爲:「一致性、可用性、分區容忍性三者你只能同時達到其中兩個,不可能同時達到」。實際上這是一個很是具備誤導性質的說法,並且在CAP理論誕生12年以後,CAP之父也在2012年重寫了以前的論文。
當發生網絡分區的時候,若是咱們要繼續服務,那麼強一致性和可用性只能2選1。也就是說當網絡分區以後P是前提,決定了P以後纔有C和A的選擇。也就是說分區容錯性(Partition tolerance)咱們是必需要實現的。
我在網上找了不少文章想看一下有沒有文章提到這個不是所謂的3選2,用百度半天沒找到了一篇,用谷歌搜索找到一篇比較不錯的,若是想深刻學習一下CAP就看這篇文章把,我這裏就很少BB了:《分佈式系統之CAP理論》 : http://www.cnblogs.com/hxsyl/p/4381980.html
BASE 是 Basically Available(基本可用) 、Soft-state(軟狀態) 和 Eventually Consistent(最終一致性) 三個短語的縮寫。BASE理論是對CAP中一致性和可用性權衡的結果,其來源於對大規模互聯網系統分佈式實踐的總結,是基於CAP定理逐步演化而來的,它大大下降了咱們對系統的要求。
BASE理論的核心思想: 即便沒法作到強一致性,但每一個應用均可以根據自身業務特色,採用適當的方式來使系統達到最終一致性。也就是犧牲數據的一致性來知足系統的高可用性,系統中一部分數據不可用或者不一致時,仍須要保持系統總體「主要可用」。
BASE理論三要素:
專一Java知識和麪試技能分享!我已經整理好了一份Java 學習必備的書籍+視頻+文檔彙總,內容比較多,你能夠在公衆號後臺回覆關鍵「1」,我會免費無套路把這些都給你。