天天看點

看完吊打面試官!全網最細節的sds講解,項目實戰一、二、三、四、五、

概述

毫無疑問,Spring Cloud是目前微服務架構領域的翹楚,無數的書籍部落格都在講解這個技術。不過大多數講解還停留在對Spring Cloud功能使用的層面,其底層的很多原理,很多人可能并不知曉。是以本文将通過大量的手繪圖,給大家談談Spring Cloud微服務架構的底層原理。

實際上,Spring Cloud是一個全家桶式的技術棧,包含了很多元件。本文先從其最核心的幾個元件入手,來剖析一下其底層的工作原理。也就是Eureka、Ribbon、Feign、Hystrix、Zuul這幾個元件。

一、

前些年,網際網路行業裡對架構師這個崗位的标準還不是很清晰。是以,很多架構師的工作往往就是一些技術被公司認可的資深工程師負責。

彼時,正巧我也是這類人員之一,故也得到了一個從零開始架設一套廣告投放平台的機會。

我很喜歡鑽研技術,對這種機會自然很看重。

那時候,架構并無如今這麼複雜,一開始就是前面搞幾個 Web 應用,後面共享個資料庫。大緻像這樣:

看完吊打面試官!全網最細節的sds講解,項目實戰一、二、三、四、五、

當然,上面的架構其實做了很多簡化,省略了很多細節。比如,為了提高性能做的緩存,為了提高吞吐做的負載均衡統統沒有在上圖給出。因為這些和本章話題無關,暫時咱們就忽略這些東西,隻看核心部分。

這套架構初期運作還是沒什麼問題的,再加上一些緩存機制,初期一些性能問題都通過調整緩存提升緩存的碰撞率應付了過去。

可是,随着廣告投放量的增大,廣告的通路量也在暴漲。這些暴漲的通路量引發了性能問題。當時,由于前端有負載均衡,應用層倒是沒出現什麼問題……

問題出在後面的資料庫上

二、

這套架構資料庫用的是 MySQL,本身也隻有一台主庫在對外服務,另外一台備庫采用了 MySQL 自己的全同步機制做實時備份。

當廣告通路量暴漲的時候,因為業務需要,很多資料需要在資料庫中做實時插入,這就導緻了大量的磁盤 IO 産生。這些大量的磁盤 IO 造成了資料庫本身性能的急劇下降。

悲催的是,整套廣告平台的所有功能又都是共享一個資料庫的,是以随着資料庫本身的性能下降,平台的所有功能都受到了影響。

由于問題主要在于大量廣告流量的寫入,是以,靠讀寫分離的方案去緩解問題這條路就走不通了。

隻好先更新硬體了。在經過了幾輪硬體更新和資料庫調優之後,單資料庫再也無法支撐不斷上漲的流量了。沒辦法,要考慮搞資料庫切分了。

那時候,我個人是很恐懼資料庫切分的。

原因不僅僅在于需要在應用層多寫很多複雜的邏輯,其根本原因是當時流行的 2PC(兩階段送出)方案,這個方案本身能保證在資料庫切分的情況下,原來的事務依然保留着自身的 ACID 性質。即:

  1. Atomicity(原子性),不管事務裡執行多少指令,對外它們都是一體的,要麼都執行,要麼都不執行。
  2. Consistency(一緻性),正因為事務裡要麼做要麼都不做,是以資料庫的狀态變化隻能由事務變更後,才會叫一緻性狀态。
  3. Isolation(隔離性),事務裡做的事兒事務外面誰也看不到,就跟個盒子把資料罩起來一樣,到底中間怎麼變化的,事務外面的觀察不到。
  4. Durability(持久性),事務确認成功了,那這狀态就永久不變了。

但也正因為這 4 個特性,2PC 才讓我顧慮重重。

顧慮1:首先,資料庫拆分了,那麼根據事務的原子性,事務自身必須是一體的,那麼事務涉及到的不同的資料庫就必須都通路一遍,而這本身就意味着很高的通信成本。

看完吊打面試官!全網最細節的sds講解,項目實戰一、二、三、四、五、

再加上,為了保持一緻性,事務失敗後,還必須恢複各個資料庫原來的狀态,這就必須讓已經成功執行過本地事務的資料庫全部復原。

而稍微懂點資料庫的人都知道,這個成本有多大。

看完吊打面試官!全網最細節的sds講解,項目實戰一、二、三、四、五、

更可怕的是,本身事務的隔離性還可能加上鎖。一旦一個熱點資料區域被大量通路,最差情況就可能出現串行通路。而這對此套平台,包括我自己都将是個悲劇。

顧慮2:資料庫的拆分會造成整個平台的可用性下降。

假設我現在有一台資料庫,它的可用性是 99.9%。如果因為分庫,資料庫從一台變成兩台,那麼平台的可用性就會變成:

平台的可用性 = 99.9% * 99.9% = 99.8%

從 99.9% 變成了 99.8%,這意味着可用性下降了 0.1%,每個月的不可用時間會增加 43 分鐘之多。

一邊是硬體更新已經到頂,單機資料庫也優化到了極限,再不做資料庫拆分,平台可能随時癱瘓。一邊是沒有好的政策,可能拆分資料庫後,每個月都有當機的風險,同時性能也可能會出現劇烈的下降。

我被逼入了死角。

三、

這種痛苦的糾結折磨了我大概一周,直到我看到了 CAP 定理。當 CAP 定理說分布式系統在分區容錯的時候,隻能一緻性和可用性二選一時,我高興的蹦了起來。

原來,可用性和一緻性是不能兼得的。

為何我會那麼高興?因為逼我入死角的可不僅是技術上的問題了,我還承受着來自于業務方和上司的壓力。每天一上班,我就需要面對業務各方的抱怨,以及上司一輪又一輪的催促。

有了 CAP 定理的支援,我知道我最終是要面臨選擇的。既然在這個世界上做分布式架構的所有人都要面臨選擇,那我又怎麼可能獨善其身呢?

在對單機資料庫引發的各種問題做了一次徹底的各種歸因以後,我下了決心:

一定要搞定拆分資料庫并給出良好方案。

隻是,2PC 這個攔路虎,它成為了我的大敵。通過 CAP 定理,我非常肯定,隻要我選了 2PC 方案,可用性就一定會出現嚴重的問題,這個方案也肯定不可能拿出來丢人現眼的。

我唯一的方向就是去犧牲一些一緻性,往可用性方向走。可是,怎麼走呢?

也許是老天眷顧,也許是大家都承受着和我一樣夜不能寐的壓力,很快,BASE 理論在國内傳開了。

BASE 理論讓我知道了,這個世上能排到前幾名的技術大公司也一樣會出問題,也一樣會對這些問題進行妥協。而且 BASE 理論的思想讓我的思路一下子就打開了,苦思而不得的問題開始有了頭緒。

我要開始着手制定技術方案了。

四、

BASE 思想中的 BA(Basically Available)基本可用,是鼓勵通過預先的架構設計或者前期規劃,盡量在分布式的系統中,把以前可能影響全平台的嚴重問題,變成隻會影響平台中的一部分資料或者功能的非嚴重問題。

有了這個思想之後,我就對廣告平台中的很多重要的資料表進行了拆分,并将這些表的資料分散到了不同的資料庫中。

比如,有個廣告流量詳情表,每當使用者點選廣告或者廣告展示出來的時候,為了保證不丢失,這些資料都是實時插入到這個表裡的。

我對這張表是怎麼切分的呢?

當有人點選廣告了,他的點選記錄會被傳到我的應用層,然後我會在應用層根據廣告 ID 做哈希,再根據哈希結果的不同,分别存到不同的資料庫中去。

看完吊打面試官!全網最細節的sds講解,項目實戰一、二、三、四、五、

假如這三個資料庫中的一個出現了問題,則隻會有三分之一的資料受到影響。這就實作了 BASE 理論中的 BA——基本可用了。基本可用其實也真的就是表達的這麼一回事:

通過一些架構設計,即使平台中某部分元件出現了問題,也不會導緻整個平台不可用。

好了,既然采取了資料庫拆分的政策,又根據 BASE 理論中的 BA 思想拆分了一些重要的表,那麼,到了現在,可能也無從後悔,隻能繼續沿着 BASE 這條路,一條路走到黑了。

五、

接下來,需要着手解決性能問題了。2PC 方案……算了……它瘋狂的一緻性性格會要了我的狗命的。

那麼極端點,我們不搞事務可不可以呢?

還用前面說的那套廣告平台舉例。

當時,從業務上,要求廣告的通路資料都要保證及時入庫不能丢,因為丢了就可能造成計費的損失,而這些損失全是錢。是以,每當使用者點選廣告或者廣告展示出來的時候,為了保證不丢失,這些資料都是實時入庫的。

又根據業務需求,當廣告流量入庫時,還需要往廣告預算表和媒體流水表裡同時根據這筆流量進行記賬,以供後續财務計算。

看完吊打面試官!全網最細節的sds講解,項目實戰一、二、三、四、五、

如果完全不考慮事務,則拆分庫後,操作可能會是這個樣子。

看完吊打面試官!全網最細節的sds講解,項目實戰一、二、三、四、五、

這三個操作可能會并行發往不同的資料庫執行。由于三個操作之間沒有事務的限制,是以,一個操作出問題了,另外的操作并不會受到影響。

而這卻也引發了另外一個問題,資料狀态不一緻。

如果在上面的業務中,插入廣告流量表的操作失敗了,但其餘兩張表插入成功了,業務就會面臨一個很尴尬的情況:他們算出的财務報表沒有依據。财務流水中找不到産生了這筆流水的依據。

而這種不一緻的狀态由于已經被持久化到了資料庫中,就會導緻這種不一緻的狀态永久存在了資料庫中。這業務能接受嗎?但凡有點職業精神的程式員能接受嗎?

最後的話

無論是哪家公司,都很重視Spring架構技術,重視基礎,是以千萬别小看任何知識。面試是一個雙向選擇的過程,不要抱着畏懼的心态去面試,不利于自己的發揮。

同時看中的應該不止薪資,還要看你是不是真的喜歡這家公司,好了希望這篇文章對大家有幫助!

另外本人整理收藏了多家公司面試知識點整理 ,以及各種Java核心知識點免費分享給大家,

下方隻是部分截圖 想要資料的話可以戳這裡即可免費領取。

還要看你是不是真的喜歡這家公司,好了希望這篇文章對大家有幫助!

另外本人整理收藏了多家公司面試知識點整理 ,以及各種Java核心知識點免費分享給大家,

下方隻是部分截圖 想要資料的話可以戳這裡即可免費領取。**

看完吊打面試官!全網最細節的sds講解,項目實戰一、二、三、四、五、