小白看完都会了!mysql面试题sql语句
開頭
Netty 作為當前流行的 NIO 框架,在游戲、大數(shù)據(jù)通訊,云計算、物聯(lián)網(wǎng)等領域都有廣泛的應用,大家熟知的 Dubbo,底層用的就是 Netty。尤其在高性能 RPC 方面,Netty 更是必不可少。然而,想要將 Netty 真正掌握并精通難度卻不小。一些學習者可能會遇到這些問題:
- 多線程編程、Socket 通信、TCP/IP 協(xié)議棧等知識掌握不扎實,學習過程比較吃力;
- 學習了不少理論知識,但真正跟具體項目結合在一起,解決實際問題時,又感覺比較棘手;
- 調用過程中遇到問題,不會定位,基本靠網(wǎng)上搜索,效率很低。
因此,如果沒有一個好的學習方法,抓不住重點,只靠閱讀源碼,既耗時又很難吃透,很容易半途而廢。
什么是 CAP
CAP 定理最初是由加州大學伯克利分校的計算機科學家埃里克·布魯爾(Eric Brewer)在 2000 年的 ACM PODC 上提出的一個猜想,也因此被叫做布魯爾定理。后來在 2002 年,麻省理工學院的賽斯·吉爾伯特(Seth Gilbert)和南希·林奇(Nancy Lynch)發(fā)表了 CAP 定理的證明,讓它成為分布式系統(tǒng)領域公認的一個定理。
CAP 定理指出了,在一個跨區(qū)域網(wǎng)絡連接,共享數(shù)據(jù)的分布式系統(tǒng)中,一致性(Consistency),可用性(Availability)和分區(qū)容錯性(Partition Tolerance) 這三個約束屬性最終只能同時滿足二個。
下面是關于這三個屬性的簡單描述:
- 一致性:客戶端進行讀操作得到的數(shù)據(jù)永遠是最近一次寫入的數(shù)據(jù),要求了對數(shù)據(jù)讀寫的強一致性。
- 可用性:客戶端的請求在限定時間內總能從非故障的系統(tǒng)節(jié)點得到正常的響應,其中不能有超時,不能出錯如 502之類。
- 分區(qū)容錯性:就是出現(xiàn)網(wǎng)絡分區(qū)現(xiàn)象,即節(jié)點間無法正常通信,數(shù)據(jù)同步出現(xiàn)延時等情況時,系統(tǒng)仍能繼續(xù)提供服務。
需要注意的是,CAP 描述了一個常規(guī)的分布式系統(tǒng)場景:有網(wǎng)絡連接,且數(shù)據(jù)跨節(jié)點進行共享。如果在整個系統(tǒng)中,數(shù)據(jù)只有一份,并且其他節(jié)點沒有對應的副本,也不需要進行跨節(jié)點的數(shù)據(jù)共享,這樣分布式系統(tǒng)就不是 CAP 關心的對象了,也談不上結合 CAP 定理去設計和實施。
深入認識 CAP
了解 CAP 基本概念之后,我們再來分別對 C,A,P 三個屬性進一步學習下,加深對 CAP 的理解。
C:一致性
這里的一致性從不同角度有著各自的描述方式,在分布式系統(tǒng)中表現(xiàn)是每個節(jié)點的數(shù)據(jù)是相同;而對于客戶端,表現(xiàn)是讀操作所得到的結果永遠是最新寫入的。其中需要明確的是,對于分布式系統(tǒng)節(jié)點來說,是可能出現(xiàn)某個時刻擁有不同的數(shù)據(jù)的情況:如果在某個節(jié)點執(zhí)行原子性操作時,對于執(zhí)行過程中的節(jié)點數(shù)據(jù)跟其他節(jié)點就并不完全一致,只有原子性操作執(zhí)行完成后,節(jié)點的數(shù)據(jù)才會繼續(xù)保持同步。比如常見的事務操作,只有事務提交后,客戶端才能讀取到事務寫入的數(shù)據(jù),失敗則回滾為舊的數(shù)據(jù),不會出現(xiàn)讀取事務中間寫入數(shù)據(jù)的情況。
一致性要求了在分布式環(huán)境下的操作要就像在單機上完成的一樣,當客戶端發(fā)起寫請求時,收到寫請求的節(jié)點會及時響應,并將更新的數(shù)據(jù)同步到另一個節(jié)點,保證數(shù)據(jù)一致性。具體的工作流程,如下所示:
一致性強調了數(shù)據(jù)的強一致,這一點要求對于一些系統(tǒng)可以說是十分重要的。比如電商系統(tǒng)的庫存扣減,金融系統(tǒng)的轉賬扣款等場景,任何出現(xiàn)一致性的問題,都可能會造成很嚴重的后果。
A:可用性
介紹完一致性,再來看下可用性,雖然可用性概念相對簡單,但重要程度跟一致性一樣。要讓系統(tǒng)滿足可用性,就是要保證無論除了所有節(jié)點出現(xiàn)故障的情況外,系統(tǒng)都能返回有效的響應,允許響應給客戶端是舊的數(shù)據(jù),但不能出現(xiàn)響應失敗,超時的情況。
可用性強調的是服務可用,但不保證數(shù)據(jù)的正確性。用一個簡單的例子來描述分布式系統(tǒng)的可用性如下:允許客戶端向節(jié)點 1 或者節(jié)點 2 發(fā)起讀操作,當其中某一個節(jié)點故障了,不管節(jié)點間數(shù)據(jù)是否一致,只要有節(jié)點服務能收到請求,就響應 X 的值,這樣就說明這兩個節(jié)點服務是滿足可用性。
在可用性的描述,還值得一提的是關于什么算有效的響應。要返回有效的響應,不能超時,也不能出錯,結果不一定是正確的,比如返回了舊數(shù)據(jù),但是客戶端接收到后是能進行正常業(yè)務處理的。
P:分區(qū)容錯性
講完 C 和 A 之后,最后再講一下 P: 分區(qū)容錯性。由于分布式系統(tǒng)多個節(jié)點往往部署在多個網(wǎng)絡環(huán)境下進行相互通信,就難免出現(xiàn)一些網(wǎng)絡故障,如網(wǎng)絡丟包,網(wǎng)絡消息延遲,網(wǎng)絡中斷等情況,會導致節(jié)點間的通信出現(xiàn)問題,數(shù)據(jù)同步操作無法完成,分區(qū)容錯性就要求了系統(tǒng)即使在網(wǎng)絡分區(qū)出現(xiàn)的情況下,能仍繼續(xù)對客戶端提供服務。
因為分布式系統(tǒng)與單機不同,它涉及到了多節(jié)點間的通信和數(shù)據(jù)交互,避免不了網(wǎng)絡問題,如果沒有分區(qū)容錯性,就意味著系統(tǒng)不允許出現(xiàn)節(jié)點間的通信出現(xiàn)任何錯誤,錯誤就意味著系統(tǒng)不可用,這在絕大數(shù)系統(tǒng)中無法接受的。因此對節(jié)點間的分區(qū)故障容錯是必須要考慮的,也是 CAP 定理中分區(qū)容錯性通常首先要保證的原因。
如何應用 CAP 定理
了解完 CAP 定理的一致性(C),可用性(A)和分區(qū)容錯性(P)之后,我們再來看下如何使用這個定理。CAP 定理指明了 C,A,P三個屬性無法同時滿足,而在必有網(wǎng)絡交互和數(shù)據(jù)同步的情況下,就一定會有延遲和數(shù)據(jù)丟失的情況,對于這種情況我們又必須接受且保證系統(tǒng)不能掛掉。所以分區(qū)容錯性是必須要保證的,剩下的就是在一致性 (C)和可用性(A)之間做選擇了。選擇了一致性,保證數(shù)據(jù)正確性,但也意味系統(tǒng)可能存在不可用的情況;而選擇可用性,保證服務的高可用,但也意味數(shù)據(jù)可能出現(xiàn)不一致性的情況。接下來就探討下應用采用 CP 架構,AP 架構所各自的特點,以及如何根據(jù)不同的分布式場景選擇適合的架構策略。
CP
對于 CP 架構的分布式系統(tǒng)來說,為了保證一致性,當出現(xiàn)網(wǎng)絡分區(qū)后,如果節(jié)點 1 上數(shù)據(jù) X 已經(jīng)更新為 2,但由于節(jié)點 間數(shù)據(jù)同步的通道已經(jīng)中斷,節(jié)點 1 數(shù)據(jù)無法同步到節(jié)點 2,節(jié)點 2 上的數(shù)據(jù) X 還是 1。此時如果客戶端訪問節(jié)點 2 的數(shù)據(jù) X,節(jié)點 2 就需要返回錯誤,提示系統(tǒng)發(fā)生了錯誤,直到節(jié)點間的數(shù)據(jù)保持同步。當然這樣的處理方式明顯違背了可用性的要求,因此在 CAP 定理只能滿足 CP。
如果一個分布式場景需要很強的一致性,或者能容忍系統(tǒng)長時間無響應但是數(shù)據(jù)要保持一致的情況,就比較適合使用 CP 架構設計對應的分布式系統(tǒng)。這樣的系統(tǒng)一旦發(fā)生網(wǎng)絡分區(qū)會導致數(shù)據(jù)無法同步情況,就要犧牲系統(tǒng)的可用性,直到節(jié)點數(shù)據(jù)達到一致后再響應。在開源社區(qū)中采用 CP 架構的應用不少,比如 Redis,HBase,MongoDB,ZooKeeper,Etcd,Consul 等都是放棄了一定可用性而選擇 CP 屬性。
AP
如果采用 AP 架構設計的分布式系統(tǒng),為了保證可用性,當網(wǎng)絡分區(qū)發(fā)生后,同樣節(jié)點 1 上數(shù)據(jù) X 已經(jīng)更新為 2,但由于節(jié)點間數(shù)據(jù)同步的通道已經(jīng)中斷,節(jié)點 1 數(shù)據(jù)無法同步到節(jié)點 2,節(jié)點 2 上的數(shù)據(jù) X 還是 1。這是客戶端訪問節(jié)點 2 獲取數(shù)據(jù) X 時,收到是正常的響應,舊數(shù)據(jù) X = 1,而實際上當前最新的數(shù)據(jù) X 已經(jīng)是 2 了,這里就不滿足一致性的要求了,因此在 CAP 定理只能滿足 AP。
同樣適合 AP 的場景有很多,比如一些查詢系統(tǒng),電商系統(tǒng)的商品查詢等,大多數(shù)為了保證系統(tǒng)的可用性,而犧牲一定的數(shù)據(jù)一致性,這樣也保證了用戶體驗,在開源界中采用 AP 模型的典型應用有 Eurka,Cassandra。
必須三選二嗎
提到了 CAP 定理,大多數(shù)人都認為無論什么情況,分布式系統(tǒng)只能在 C 和 A 中選擇一個。但這里的前提是系統(tǒng)發(fā)生了網(wǎng)絡分區(qū)情況,如果系統(tǒng)沒有發(fā)生網(wǎng)絡分區(qū)的情況,也就是說 P 不存在的時候,我們就沒有必要放棄 C 或者 A,因此進行架構設計時也應該考慮沒有分區(qū)情況下如何保證 CA。除此之外,一個分布式系統(tǒng)不一定只能從 AP 與 CP 中做選擇,內部不同模塊所應對的場景也不同,完全有可能是一個模塊采用 AP 架構,另一個模塊采用 CP 架構。作為優(yōu)秀的架構師,不應該受到大多數(shù)人對 CAP 定理所認識的局限,設計出符合自身業(yè)務場景的分布式系統(tǒng)才是重中之重。
總結
雖然我個人也經(jīng)常自嘲,十年之后要去成為外賣專員,但實際上依靠自身的努力,是能夠減少三十五歲之后的焦慮的,畢竟好的架構師并不多。
架構師,是我們大部分技術人的職業(yè)目標,一名好的架構師來源于機遇(公司)、個人努力(吃得苦、肯鉆研)、天分(真的熱愛)的三者協(xié)作的結果,實踐+機遇+努力才能助你成為優(yōu)秀的架構師。
如果你也想成為一名好的架構師,那或許這份Java成長筆記你需要閱讀閱讀,希望能夠對你的職業(yè)發(fā)展有所幫助。
資料領取方式:戳這里免費下載
式:戳這里免費下載](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)**
[外鏈圖片轉存中…(img-huZBUXj0-1621922401473)]
總結
以上是生活随笔為你收集整理的小白看完都会了!mysql面试题sql语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 点9图片的用法
- 下一篇: SQL中的关联子查询