美團java研發崗二面:java靜態方法存儲在哪個區

思維導圖

前言

在很多時候,我們都可以在各種框架應用中看到ZooKeeper的身影,比如Kafka中間件,Dubbo框架,Hadoop等等。為什么到處都看到ZooKeeper?

一、

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

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

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

那時候,架構并無如今這么復雜,一開始就是前面搞幾個 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

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

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

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

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

給大家分享下我的復習的面試資料

這些面試全部出自大廠面試真題和面試合集當中,小編已經為大家整理完畢(PDF版)

資料獲取方式:戳這里前往我的騰訊文檔免費下載

  • 第一部分:Java基礎-中級-高級

image

  • 第二部分:開源框架(SSM:Spring+SpringMVC+MyBatis)

image

  • 第三部分:性能調優(JVM+MySQL+Tomcat)

image

  • 第四部分:分布式(限流:ZK+Nginx;緩存:Redis+MongoDB+Memcached;通訊:MQ+kafka)

image

  • 第五部分:微服務(SpringBoot+SpringCloud+Dubbo)

image

  • 第六部分:其他:并發編程+設計模式+數據結構與算法+網絡

image

進階學習筆記pdf

都已整理好,需免費下載點擊這里即可

  • Java架構進階之架構筑基篇(Java基礎+并發編程+JVM+MySQL+Tomcat+網絡+數據結構與算法

image

  • Java架構進階之開源框架篇(設計模式+Spring+SpringMVC+MyBatis

image

image

image

  • Java架構進階之分布式架構篇 (限流(ZK/Nginx)+緩存(Redis/MongoDB/Memcached)+通訊(MQ/kafka)

image

image

image

  • Java架構進階之微服務架構篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)

image

image

647883)]

[外鏈圖片轉存中…(img-YgbLqlyf-1622454647884)]

  • Java架構進階之微服務架構篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)

[外鏈圖片轉存中…(img-zhclYh1U-1622454647885)]

[外鏈圖片轉存中…(img-P3ZBq2h0-1622454647886)]

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

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

相關文章

[學習之道] 修福不修慧,大象披瓔珞; 修慧不修福,羅漢托空缽 (學習寫程序,只靠補習上課嗎?)...

這是我的備份,原文請看 http://www.dotblogs.com.tw/mis2000lab/archive/2014/09/17/learning-and_do-it_20140917.aspx [學習之道] 修福不修慧,大象披瓔珞; 修慧不修福,羅漢托空缽 (學習寫程序,只靠補習上課嗎&#…

阿里P8親自教你!mysql列轉行

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

同步、異步、多線程

1、首先明確一點,對于單核CPU,任意一個時刻只有一個線程在運行。那么既然這樣,多線程還有什么意義呢? 舉例來說,現在只有一個人,要做好幾個任務。單線程就是,任務一個一個地做,必須做…

阿里P8親自教你!熬夜整理華為最新Java筆試題

前言 Mysql的鎖機制確實非常重要,所以在這里做一個全面的總結整理,便于以后的查閱,也分享給大家。 Mysql的鎖機制還是有點難理解的,所以這篇文章采用圖文結合的方式講解難點,幫助大家理解,講解的主要內容…

JSP基礎筆記

/** #####這部分也是筆記,用于記錄JSP的相關內容* ###怎么用JSP###指令的寫法* <% 指令名字%>* *### page指令 * language > 表明jsp頁面中可以寫java代碼 * contentType > 其實即使說這個文件是什么類型&#xff0c;告訴瀏覽器我是什么內容類型&#xff0c;以及使…

阿里P8親自講解!javawhile循環語句用法

前言 作為一個已經畢業的計算機專業學長&#xff0c;其實幾年大學走來還是挺感慨萬千的。&#xff08;說明一下&#xff1a;一本&#xff0c;非958、211&#xff09; 老實說&#xff0c;上大學之前填志愿選專業的時候沒有任何打算&#xff0c;就覺得學海熬到頭了&#xff0c;向…

Cookie,Session基礎知識

//這部分主要是CookieSession的筆記部分/** //獲取來訪的客戶端類型String clientTyereq.getHeader("User-Agent");//如果是火狐瀏覽器&#xff0c;那么使用以下代碼if(clientTye.contains("Firefox")){fileNameDownLoadUtil.base64EncodeFileName(fileNam…

阿里P8親自講解!java中級開發工程師需要掌握的技能

前言 關于技術人如何成長的問題&#xff0c;一直以來都備受關注&#xff0c;因為程序員職業發展很快&#xff0c;即使是相同起點的人&#xff0c;經過幾年的工作或學習&#xff0c;會迅速拉開極大的差距&#xff0c;所以技術人保持學習&#xff0c;提升自己&#xff0c;才能夠…

隨筆--互聯網進化論

不聞不若聞之&#xff1b;有的人士的理論引起了轟動&#xff0c;吾等小網民也來學學&#xff0c;沒那么大腦袋&#xff0c;從不敢談解讀與批判。聞香而來&#xff0c;放屁而去。比如說互聯網進化論。看看實踐&#xff0c;互聯網的膨脹式發展是不會停的&#xff0c;在中國的互聯…

阿里P8親自講解!java分布式需要學什么技術

引言 最近項目上線的頻率頗高&#xff0c;連著幾天加班熬夜&#xff0c;身體有點吃不消精神也有些萎靡&#xff0c;無奈業務方催的緊&#xff0c;工期就在眼前只能硬著頭皮上了。腦子渾渾噩噩的時候&#xff0c;寫的就不能叫代碼&#xff0c;可以直接叫做Bug。我就熬夜寫了一個…

Javascript的this用法

出自&#xff1a;http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html this是Javascript語言的一個關鍵字。 它代表函數運行時&#xff0c;自動生成的一個內部對象&#xff0c;只能在函數內部使用。比如&#xff0c; function test(){ this.x 1; }…

[New Portal]Windows Azure Web Site (4) Web Site Gallery

《Windows Azure Platform 系列文章目錄》 前言&#xff1a;最近因為工作變動&#xff0c;更新博客的速度變慢了。筆者在這邊感到非常抱歉&#xff0c;以后盡量每周更新一篇Windows Azure的博客給大家。 好了&#xff0c;我們回到本章內容。 Windows Azure通過Web Role和Worker…

阿里P8親自講解!java聲明類的語法格式

前言 前兩天&#xff0c;我收到了螞蟻金服的offer&#xff0c;從朋友的內推開始面試到拿到最后offer經歷了4面技術、一面交叉面和一面HR面。經過了漫長的等待和幾次幾乎折磨的面試之后&#xff0c;終于拿到了offer。 分享第一份Java基礎-中級-高級面試集合 Java基礎&#xff…

java-transaction事件

/*########事務&數據庫連接池&DBUtils ######事務 > Transaction 其實指的一組操作&#xff0c;里面包含許多個單一的邏輯。只要有一個邏輯沒有執行成功&#xff0c;那么都算失敗。 所有的數據都回歸到最初的狀態(回滾) ####為什么要有事務?> 為了確保邏輯的成功…

阿里P8親自講解!java實例變量和類變量

前言 Spring如何解決的循環依賴&#xff0c;是近兩年流行起來的一道Java面試題。其實筆者本人對這類框架源碼題還是持一定的懷疑態度的。如果筆者作為面試官&#xff0c;可能會問一些諸如“如果注入的屬性為null&#xff0c;你會從哪幾個方向去排查”這些場景題。那么既然寫了…

java---連接池的學習

/** ####################################數據庫的連接池學習################################# * * * #####數據庫連接池 >1. 數據庫的連接對象創建工作&#xff0c;比較消耗性能。 >2.一開始現在內存中開辟一塊空間&#xff08;集合&#xff09; &#xff0c; 一開…

阿里P8親自講解!成功入職頭條月薪35K

前言 又到一年金九銀十之際。 Java作為目前用戶最多&#xff0c;使用范圍最廣的軟件開發技術之一。 Java的技術體系主要由支撐Java程序運行的虛擬機&#xff0c;提供各開發領域接口支持的Java,Java編程語言及許多第三方Jvav框架構成。 其中&#xff0c;以Java的虛擬器為今天的著…

java----連接池C3p0使用的補充

C3p0數據庫的連接方式是目前市場場最為廣泛的類型之一 本篇主要你演示C3p0使用文件配置和不使用文件配置的兩種操作方式 #######使用文件配置 import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException;import com.dbutil.zyz.ConnLink; …

阿里P8大佬親自教你!java程序設計第四版pdf

前言 最近有很多朋友去目前主流的大型互聯網公司面試&#xff08;阿里巴巴、京東、字節跳動、螞蟻金服、滴滴&#xff09;&#xff0c;面試回來之后會發給我一些面試題。有些朋友輕松過關&#xff0c;拿到offer&#xff0c;但是有一些是來詢問我答案的。 我特意整理了一下&am…

阿里P8大佬親自講解!朝陽java培訓

開頭 Spring框架自誕生以來一直備受開發者青睞&#xff0c;有人親切的稱之為&#xff1a;Spring 全家桶。Spring更是避免了重復造輪子的工作并跟隨著互聯網行業的發展做出不斷的更新&#xff0c;很多研發人員把spring看作心目中最好的Java項目&#xff0c;沒有之一。 **可以毫…