Java開發找工做最懵圈的問題:到底啥是分佈式系統開發經驗?

 

前言

如今有不少Java技術方向的同窗在找工做的時候,確定都會去招聘網站上找職位投遞簡歷。nginx

可是在不少職位JD上每每會有這樣的一個要求:熟悉分佈式系統理論、設計和開發,具有複雜分佈式系統構建經驗。web

以前很多同窗後臺留言問過我:這個分佈式系統的設計和開發經驗,到底指的是什麼?那麼這篇文章就給你們來解釋一下這個問題。spring

1.從單塊系統提及

要說分佈式系統是什麼東西,那麼就得先從單塊系統開始提及。sql

不少同窗應該都知道,若是你在一些中小型的傳統軟件公司裏工做,那麼頗有可能如今在作的系統是以下這個樣子。數據庫

全部的代碼都在一個工程裏,最多可能就是經過maven等構件工具拆分了一下代碼工程模塊,不一樣的模塊能夠放在不一樣的工程代碼裏。緩存

在部署的時候,可能就是直接在線上的幾臺機器裏直接放到裏面的tomcat下來運行。tomcat

而後在web服務器前面可能會有一層負載均衡服務器,好比用nginx或者是其餘的負載均衡設備。服務器

不少流量很小的企業內部系統,好比OA、CRM、財務等系統,甚至可能就直接在一臺機器的tomcat下部署一下。數據結構

而後直接配置一下域名解析,就可讓這個系統的可能幾十個,或者幾百個用戶經過訪問域名來使用這個軟件了。架構

至於說系統的依賴大概來講極可能只有一個,那就是MySQL、Oracle等關係型數據庫,可能會在某臺機器上專門部署一個數據庫,讓應用系統來使用。

你們看看下面的圖,體會一下這種單體架構。

這種系統在不少中小型公司裏如今仍是比較多的,就是典型的單塊系統,全部代碼在一個工程,部署在一個tomcat裏便可,這裏包含了系統全部的功能。

你哪怕就部署一臺機器,這個系統也能夠運行,只不過爲了所謂的「高可用」,可能通常會部署兩臺機器,前面加一層負載均衡設備,這樣其中一個機器掛了,另一個機器上還有一個系統能夠用。

2.團隊愈來愈大,業務愈來愈複雜

其實上面說的那種單塊系統,若是是一個10人之內的小團隊你們一塊兒維護和開發一個用戶數量很少,請求量不大的系統,也是沒問題的,還挺方便的,對吧。

你搞一個代碼倉庫,而後就一份代碼,每一個人都在本身本地寫代碼,最後把代碼合併一下,作作測試,而後就直接部署基於Tomcat來就能夠了。

可是問題就在於說,若是你的團隊超過了10我的,好比有20我的,甚至幾十我的,上百我的要一塊兒協做開發這個系統,而後裏面的業務邏輯特別多,可能功能模塊多達幾百個。這個時候就麻煩了,你要是還用那種單塊系統的模式,那確定是很痛苦的。

由於幾十我的維護一個單塊系統,你們在一個工程裏寫代碼,大量的衝突以及代碼合併都會讓人崩潰。

並且部署的時候會有各類衝突,好比某個功能模塊要上線了,可是他必須得把整個單塊系統全部的功能都回歸測試一遍纔敢上線。

由於你們的代碼都在一個工程裏,都是耦合在一塊兒的,你修改了代碼,必須所有測試一遍才能保證系統正常。

因此說這個時候,就必須想辦法把系統改形成分佈式系統了。

3.分佈式出現:龐大系統分而治之

這個時候就能夠嘗試把一個大的系統拆分爲不少小的系統,甚至不少小的服務,而後幾我的組成一個小組就專門維護其中一個小系統,或者每一個人維護一個小服務。

簡單來講,就是分而治之,這樣每一個人能夠專一維護本身的代碼。

而後不一樣的小系統本身開發、測試和上線,都不會跟別人耦合在一塊兒,能夠本身獨立進行,很是的方便,大大簡化了大規模系統的開發成本。

不一樣的子系統之間,就是經過接口互相來回調用,每一個子系統都有本身的數據庫,你們看下面的圖。


4.分佈式系統所帶來的技術問題

那麼你們這個時候能夠思考一下,若是你的公司是採用這種分佈式系統的方式來構建公司的一個大規模系統的,那麼這個時候會涉及到哪些技術問題?

(1)分佈式服務框架 

你若是要讓不一樣的子系統或者服務之間互相通訊,首先必須有一套分佈式服務框架。

也就是各個服務能夠互相感知到對方在哪裏,能夠發送請求過去,能夠經過HTTP或者RPC的方式。

在這裏,最多見的技術就是dubbo以及spring cloud,固然大廠通常都是本身有服務框架

 

(2)分佈式事務 

一旦你的系統拆分爲了多個子系統以後,那麼一個貫穿全局的分佈式事務應該怎麼來實現?

這個你須要瞭解TCC、最終一致性、2PC等分佈式事務的實現方案和開源技術。

 

(3)分佈式鎖 

不一樣的系統之間若是須要在全局加鎖獲取某個資源的鎖定,此時應該怎麼來作?

畢竟你們不是在一個JVM裏了,不可能用synchronized來在多個子系統之間實現鎖吧,是否是?

 

(4)分佈式緩存 

若是你原來就是個單塊系統,那麼你實際上是能夠在單個JVM裏進行本地緩存就能夠了,好比搞一個HashMap來緩存一些數據。

可是如今你有不少個子系統,他們若是要共享一個緩存,你應該怎麼辦?是否是須要引入Redis等緩存系統?

 

(5)分佈式消息系統 

在單塊系統內,就一個JVM進程內部,你能夠用相似LinkedList之類的數據結構做爲一個本地內存裏的隊列。

可是多個子系統之間要進行消息隊列的傳遞呢?那是否是要引入相似RabbitMQ之類的分佈式消息中間件?

 

(6)分佈式搜索系統 

若是在單塊系統內,你能夠好比在本地就基於Lucene來開發一個全文檢索模塊,可是若是是分佈式系統下的不少子系統,你還能直接基於Lucene嗎?

明顯不行,你須要在系統裏引入一個外部的分佈式搜索系統,好比Elasticsearch。

 

(7)其餘不少的技術 

好比說分佈式配置中心、分佈式日誌中心、分佈式監控告警中心、分佈式會話,等等,都是分佈式系統場景下你須要使用和了解的一些技術。

由於沿用單塊系統時代的那些技術已經不行了,好比說你單塊系統的時候,直接在本地用一個properties文件存放本身的配置便可,日誌也寫到本地便可。

可是分佈式時代呢?

你那麼多的子系統,怎麼共享同一份配置?怎麼把各個系統的日誌聚合寫到一個地方來查看?

單塊系統的時候,你一個web應用直接基於Servlet API提供的Session會話功能便可,那麼分佈式時代呢,你有N多個子系統若是要共享會話該怎麼作?

5.一句話總結:什麼是分佈式系統設計和開發經驗?

其實分析完了以後,你們應該就大概知道了,招聘JD上寫這個分佈式系統的設計和開發經驗,其實他是一個很大的主題,裏面包含不少的內容。

你的系統一旦分佈式了以後,通訊、緩存、消息、事務、鎖、配置、日誌、監控、會話,等等各類原來單塊系統場景下很容易解決的問題,都會變得很複雜,須要引入大量外部的技術。

因此你有沒有參與過相似這樣的一個大的分佈式系統?你有沒有基於各類技術解決過度布式系統場景下的各類技術問題?這就是人家但願和要求的分佈式系統設計和開發的經驗。若是你們還沒接觸過,建議多去學習一下。

6.補充說明:中間件系統及大數據系統

最後給你們說明一點,通常這種招聘JD,若是是Java崗位要求分佈式相關的經驗,其實主要仍是上面說的那些東西,他面向的是分佈式的業務系統的構建。

可是其實分佈式系統自己是一個很是複雜的話題,由於剛纔說的只是一個分佈式業務系統要依賴哪些技術來進行構建。

可是其實好比Kafka、Rocket等中間件,自己他也是分佈式的,你要搞明白他們本身是如何實現分佈式的,又是一個很是複雜的話題。

此外,像hadoop、spark、hbase等大數據系統,自己也都是世界上最最複雜的分佈式系統,這又涉及到大數據領域的話題了,之後有機會能夠單獨聊聊。

歡迎工做一到五年的Java工程師朋友們加入個人我的粉絲羣Java填坑之路:789337293 羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!  

相關文章
相關標籤/搜索