Nginx負載均衡策略有哪些?知識點總結+面試題解析

前言

看日期,今天都是4月了,這春招也差不多進入尾聲了。

近期任有不少朋友都在找工作,很多人開始抱怨,工作可真難找啊!身邊不少朋友問我咋搞呀,秋招都要結束了,工作還沒著落呢…額…這個…今年是有點難啊。說實話,面試只是對個人技術及應變能力的一次考驗。只有解決了一個問題,你才有機會遇見下一個問題。

這不,今天我總結了餓了么4面(Java崗)面經,問題如下,都是真真的經歷,準備面試找工作的朋友可自行檢測一下。

image

一、

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

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

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

那時候,架構并無如今這么復雜,一開始就是前面搞幾個 Web 應用,后面共享個數據庫。大致像這樣:

image

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

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

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

問題出在后面的數據庫上

二、

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

當廣告訪問量暴漲的時候,因為業務需要,很多數據需要在數據庫中做實時插入,這就導致了大量的磁盤 IO 產生。這些大量的磁盤 IO 造成了數據庫本身性能的急劇下降。

悲催的是,整套廣告平臺的所有功能又都是共享一個數據庫的,所以隨著數據庫本身的性能下降,平臺的所有功能都受到了影響。

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

只好先升級硬件了。在經過了幾輪硬件升級和數據庫調優之后,單數據庫再也無法支撐不斷上漲的流量了。沒辦法,要考慮搞數據庫切分了。

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

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

  1. Atomicity(原子性),不管事務里執行多少命令,對外它們都是一體的,要么都執行,要么都不執行。
  2. Consistency(一致性),正因為事務里要么做要么都不做,所以數據庫的狀態變化只能由事務變更后,才會叫一致性狀態。
  3. Isolation(隔離性),事務里做的事兒事務外面誰也看不到,就跟個盒子把數據罩起來一樣,到底中間怎么變化的,事務外面的觀察不到。
  4. Durability(持久性),事務確認成功了,那這狀態就永久不變了。

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

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

image

再加上,為了保持一致性,事務失敗后,還必須恢復各個數據庫原來的狀態,這就必須讓已經成功執行過本地事務的數據庫全部回滾。

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

image

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

顧慮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 做哈希,再根據哈希結果的不同,分別存到不同的數據庫中去。

image

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

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

好了,既然采取了數據庫拆分的策略,又根據 BASE 理論中的 BA 思想拆分了一些重要的表,那么,到了現在,可能也無從后悔,只能繼續沿著 BASE 這條路,一條路走到黑了。

五、

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

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

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

當時,從業務上,要求廣告的訪問數據都要保證及時入庫不能丟,因為丟了就可能造成計費的損失,而這些損失全是錢。所以,每當用戶點擊廣告或者廣告展示出來的時候,為了保證不丟失,這些數據都是實時入庫的。

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

image

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

image

這三個操作可能會并行發往不同的數據庫執行。由于三個操作之間沒有事務的約束,所以,一個操作出問題了,另外的操作并不會受到影響。

而這卻也引發了另外一個問題,數據狀態不一致。

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

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

最后

小編精心為大家準備了一手資料

**點擊這里免費領取**以上Java高級架構資料、源碼、筆記、視頻。Dubbo、Redis、設計模式、Netty、zookeeper、Spring cloud、分布式、高并發等架構技術

【附】架構書籍贈送

  1. BAT面試的20道高頻數據庫問題解析
  2. Java面試寶典
  3. Netty實戰
  4. 算法

BATJ面試要點及Java架構師進階資料

. BAT面試的20道高頻數據庫問題解析
2. Java面試寶典
3. Netty實戰
4. 算法

[外鏈圖片轉存中…(img-B8JlV3Qv-1624600668862)]

BATJ面試要點及Java架構師進階資料

[外鏈圖片轉存中…(img-jtAPFKBC-1624600668863)]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385900.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385900.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java bean jsp_JavaBean與Jsp

這一節我們總結一下JavaBean和Jsp的關系。1. JavaBeanjavaBean是一個遵循特定寫法的Java類,它通常具有如下特點:1)這個java類必須具有一個無參構造函數;2)屬性必須私有化;3)私有化的屬性必須通過public類型的方法暴露給其他程序&a…

P8級別的頂級“并發編程”寶典,最全指南

前言 前幾天我上班路上,和小區門口開車的師傅閑聊,發現他們雖然學歷不高,但掙錢的途徑不少,比如固定接送多位客戶,然后能通過朋友圈拓展新客戶,而且通過客戶口口相傳,也能不斷拉到生意&#xf…

java 追加寫入txt文件_ava如何追加寫入txt文件

(二)方法1public void method1() {FileWriter fw null;try {//如果文件存在,則追加內容;如果文件不存在,則創建文件File fnew File("E:\dd.txt");fw new FileWriter(f, true);} catch (IOException e) {e.printStackTrace();}Pri…

Redis宕機數據丟失解決方案,不吃透都對不起自己

前言 昨天,有個女孩子問我提高數據庫查詢性能有什么立竿見影的好方法? 這簡直是一道送分題,我自豪且略帶鄙夷的說,當然是加「索引」了。 她又不緊不慢的問,索引為什么就能提高查詢性能。 這還用問,索引…

c 加密 java解密錯誤_java解密出錯

展開全部你那個代碼少得東西太多,我左試右試,都是錯,也不知道你的初始32313133353236313431303231363533e78988e69d8331333332613762值都是什么。給你寫了一個加密解密的,希望對你有幫助。import java.security.NoSuchAlgorithmEx…

Redis成神之路電子版教程已問世,面試題+筆記+項目實戰

前言 我想對所有程序員說:除了看視頻、做項目來提高自身的技術之外,還有一種提升自己的專業技能就是:多!看!書!(本文內提到的書單筆者整理出了一份電子檔作為分享,文末有免費獲取方式…

java 中的event_Java中this與event有什么不同

Java中this與event有什么不同發布時間:2021-02-11 10:37:25來源:億速云閱讀:61作者:LeahJava中this與event有什么不同?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法&#xff…

Redis有幾種數據類型?文末領取面試資料

前言 其實前幾篇文章已經寫了好多有關于Spring源碼的文章,事實上,很多同學雖然一直在跟著閱讀、學習這些Spring的源碼教程,但是一直都很迷茫,這些Spring的源碼學習,似乎只是為了面試吹逼用,我大概問過一些…

java 多重屬性_最全面的44個Java 性能調優細節

我認為,代碼優化的最重要的作用應該是:避免未知的錯誤。在代碼上線運行的過程中,往往會出現很多我們意想不到的錯誤,因為線上環境和開發環境是非常不同的,錯誤定位到最后往往是一個非常小的原因。然而為了解決這個錯誤…

Redis靈魂14問?真香

前言 今日博主聽聞,現在很多培訓出來的應屆生薪資都趕上了摸爬滾打兩三年的朋友,講道理,這說不過去啊 作為同行來說,這個行業發展很快,技術更新很快,淘汰也很快,千萬不要再找借口了&#xff0…

java主流微服務框架_Spring Boot作為當下最流行的微服務開發框架,一名合格的Java開發者一定有所了解,...

Spring Boot作為當下最流行的微服務開發框架,一名合格的Java開發者一定有所了解,Spring Boot相對于傳統的SSM框架來說:springboot使用了特定的配置方式,開發人員不需要再定義樣板化的配置,簡化項目的初始構建springboo…

Redis面試復習大綱在手面試不慌,內含福利

前言 這幾年在Java工程師招聘時,會看到很多人的簡歷都寫著使用了Spring Cloud做微服務實現,使用Docker做自動化部署,并且也會把這些做為自己的亮點。而比較有趣的這其中以小公司出來的人為絕大多數,大的公司出來的人簡歷上倒是很…

java注解編程_Java注解編程原理

一、先了解以下4個元注解Documented具體來說是生成說明文檔時把類的解釋添加進去。Inherited 允許子類繼承父類中的注解Target 表示該注解用于什么地方,可能的值在枚舉類 ElemenetType 中public enum ElementType {TYPE, //給類(型)注解FIELD, //給字段注解&#x…

Redis面試復習大綱在手面試不慌,講的明明白白!

前言 面試時間將近兩個小時(期間等待二面面試官來面我的時候等了半個多小時)面試官問的東西很多,還挖了好幾個坑,一個技術點套著一個技術點的問,一定要做好萬全的準備。問了一些基本層面上的技術點都答出來了&#xf…

python sendline_python Pexpect模塊的使用

Pexpect簡介在講解Pexpect之前,我們需要先了解一下Expect這個腳本語言,它是由TCL語言實現的,主要用于人機交互式對話的自動化控制,可以用來完成ssh、ftp、telnet等命令行程序的自動化交互。Pexpect其實就是一個用Python語言實現的…

RocketMQ消息丟失場景及解決辦法,已拿offer入職

前言 當前我們都會說SpringBoot是Spring框架對“約定優先于配置理念的最佳實踐的產物,一個典型的SpringBoot應用本質上其實就是一個基于Spring框架的應用,而如果大家對Spring框架已經了如指掌,那么,在我們一步步揭開SpringBoot微…

java抓rtp包_Wireshark抓取RTP包,還原語音

最近在做基于SIP的VoIP通信研究,使用Wireshark軟件可以對網絡流量進行抓包。VoIP使用RTP協議對語音數據進行傳輸,語音載荷都封裝在RTP包里面。要對傳輸中的語音進行截獲和還原,需要通過Wireshark對RTP包進行分析和解碼。該過程如下&#xff1…

RocketMQ消費者是如何獲取消息的?轉瘋了!

前言 前兩天,我收到了螞蟻金服的offer,從朋友的內推開始面試到拿到最后offer經歷了4面技術、一面交叉面和一面HR面。經過了漫長的等待和幾次幾乎折磨的面試之后,終于拿到了offer。 第1章:Dubbo的簡史、后續的規劃和整體架構大圖 …

java if在內存中_java如何將對象暫存到內存中?

展開全部form表單提交文件,建議用62616964757a686964616fe59b9ee7ad9431333264623862smartupload上傳,暫存在web服務器目錄下,然后稍微一下下面的代碼,ftp上傳后,刪除暫存文件,okimport java.io.File;impor…

K8S+Docker理論與實踐深度集成

前言: 這篇文章主要介紹了26道Spring經典面試題總結(附帶答案)的相關資料,小編在網上看到的覺得挺不錯的,現在分享給大家,希望對你們有所幫助。 另外本人整理收藏了多家公司面試知識點整理 ,以及各種Java核心知識點免費分享給大…