自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官問我有沒有分布式系統(tǒng)開發(fā)經(jīng)驗(yàn),我一臉懵圈…

開發(fā) 架構(gòu)
你的系統(tǒng)一旦分布式了之后,通信、緩存、消息、事務(wù)、鎖、配置、日志、監(jiān)控、會話,等等各種原來單塊系統(tǒng)場景下很容易解決的問題,都會變得很復(fù)雜,需要引入大量外部的技術(shù)。

前言

現(xiàn)在有很多Java技術(shù)方向的同學(xué)在找工作的時(shí)候,肯定都會去招聘網(wǎng)站上找職位投遞簡歷。

但是在很多職位JD上往往會有這樣的一個(gè)要求:熟悉分布式系統(tǒng)理論、設(shè)計(jì)和開發(fā),具備復(fù)雜分布式系統(tǒng)構(gòu)建經(jīng)驗(yàn)。

之前不少同學(xué)后臺留言問過我:這個(gè)分布式系統(tǒng)的設(shè)計(jì)和開發(fā)經(jīng)驗(yàn),到底指的是什么?那么這篇文章就給大家來解釋一下這個(gè)問題。

一、從單塊系統(tǒng)說起

要說分布式系統(tǒng)是什么東西,那么就得先從單塊系統(tǒng)開始說起。

很多同學(xué)應(yīng)該都知道,如果你在一些中小型的傳統(tǒng)軟件公司里工作,那么很有可能現(xiàn)在在做的系統(tǒng)是如下這個(gè)樣子。

所有的代碼都在一個(gè)工程里,最多可能就是通過maven等構(gòu)件工具拆分了一下代碼工程模塊,不同的模塊可以放在不同的工程代碼里。

在部署的時(shí)候,可能就是直接在線上的幾臺機(jī)器里直接放到里面的tomcat下來運(yùn)行。

然后在web服務(wù)器前面可能會有一層負(fù)載均衡服務(wù)器,比如用nginx或者是其他的負(fù)載均衡設(shè)備。

很多流量很小的企業(yè)內(nèi)部系統(tǒng),比如OA、CRM、財(cái)務(wù)等系統(tǒng),甚至可能就直接在一臺機(jī)器的tomcat下部署一下。

然后直接配置一下域名解析,就可以讓這個(gè)系統(tǒng)的可能幾十個(gè),或者幾百個(gè)用戶通過訪問域名來使用這個(gè)軟件了。

至于說系統(tǒng)的依賴大概來說很可能只有一個(gè),那就是MySQL、Oracle等關(guān)系型數(shù)據(jù)庫,可能會在某臺機(jī)器上專門部署一個(gè)數(shù)據(jù)庫,讓應(yīng)用系統(tǒng)來使用。

大家看看下面的圖,體會一下這種單體架構(gòu)。


這種系統(tǒng)在很多中小型公司里現(xiàn)在還是比較多的,就是典型的單塊系統(tǒng),所有代碼在一個(gè)工程,部署在一個(gè)tomcat里即可,這里包含了系統(tǒng)所有的功能。

你哪怕就部署一臺機(jī)器,這個(gè)系統(tǒng)也可以運(yùn)行,只不過為了所謂的“高可用”,可能一般會部署兩臺機(jī)器,前面加一層負(fù)載均衡設(shè)備,這樣其中一個(gè)機(jī)器掛了,另外一個(gè)機(jī)器上還有一個(gè)系統(tǒng)可以用。

二、團(tuán)隊(duì)越來越大,業(yè)務(wù)越來越復(fù)雜

其實(shí)上面說的那種單塊系統(tǒng),如果是一個(gè)10人以內(nèi)的小團(tuán)隊(duì)大家一起維護(hù)和開發(fā)一個(gè)用戶數(shù)量不多,請求量不大的系統(tǒng),也是沒問題的,還挺方便的,對吧。

你搞一個(gè)代碼倉庫,然后就一份代碼,每個(gè)人都在自己本地寫代碼,最后把代碼合并一下,做做測試,然后就直接部署基于Tomcat來就可以了。

但是問題就在于說,如果你的團(tuán)隊(duì)超過了10個(gè)人,比如有20個(gè)人,甚至幾十個(gè)人,上百個(gè)人要一起協(xié)作開發(fā)這個(gè)系統(tǒng),然后里面的業(yè)務(wù)邏輯特別多,可能功能模塊多達(dá)幾百個(gè)。這個(gè)時(shí)候就麻煩了,你要是還用那種單塊系統(tǒng)的模式,那肯定是很痛苦的。

因?yàn)閹资畟€(gè)人維護(hù)一個(gè)單塊系統(tǒng),大家在一個(gè)工程里寫代碼,大量的沖突以及代碼合并都會讓人崩潰。

而且部署的時(shí)候會有各種沖突,比如某個(gè)功能模塊要上線了,但是他必須得把整個(gè)單塊系統(tǒng)所有的功能都回歸測試一遍才敢上線。

因?yàn)榇蠹业拇a都在一個(gè)工程里,都是耦合在一起的,你修改了代碼,必須全部測試一遍才能保證系統(tǒng)正常。

所以說這個(gè)時(shí)候,就必須想辦法把系統(tǒng)改造成分布式系統(tǒng)了。

三、分布式出現(xiàn):龐大系統(tǒng)分而治之

這個(gè)時(shí)候就可以嘗試把一個(gè)大的系統(tǒng)拆分為很多小的系統(tǒng),甚至很多小的服務(wù),然后幾個(gè)人組成一個(gè)小組就專門維護(hù)其中一個(gè)小系統(tǒng),或者每個(gè)人維護(hù)一個(gè)小服務(wù)。

簡單來說,就是分而治之,這樣每個(gè)人可以專注維護(hù)自己的代碼。

然后不同的小系統(tǒng)自己開發(fā)、測試和上線,都不會跟別人耦合在一起,可以自己獨(dú)立進(jìn)行,非常的方便,大大簡化了大規(guī)模系統(tǒng)的開發(fā)成本。

不同的子系統(tǒng)之間,就是通過接口互相來回調(diào)用,每個(gè)子系統(tǒng)都有自己的數(shù)據(jù)庫,大家看下面的圖。

四、分布式系統(tǒng)所帶來的技術(shù)問題

那么大家這個(gè)時(shí)候可以思考一下,如果你的公司是采用這種分布式系統(tǒng)的方式來構(gòu)建公司的一個(gè)大規(guī)模系統(tǒng)的,那么這個(gè)時(shí)候會涉及到哪些技術(shù)問題?

  • (1)分布式服務(wù)框架

你如果要讓不同的子系統(tǒng)或者服務(wù)之間互相通信,首先必須有一套分布式服務(wù)框架。

也就是各個(gè)服務(wù)可以互相感知到對方在哪里,可以發(fā)送請求過去,可以通過HTTP或者RPC的方式。

在這里,最常見的技術(shù)就是dubbo以及spring cloud,當(dāng)然大廠一般都是自己有服務(wù)框架

  • (2)分布式事務(wù)

一旦你的系統(tǒng)拆分為了多個(gè)子系統(tǒng)之后,那么一個(gè)貫穿全局的分布式事務(wù)應(yīng)該怎么來實(shí)現(xiàn)?

這個(gè)你需要了解TCC、最終一致性、2PC等分布式事務(wù)的實(shí)現(xiàn)方案和開源技術(shù)。

  • (3)分布式鎖

不同的系統(tǒng)之間如果需要在全局加鎖獲取某個(gè)資源的鎖定,此時(shí)應(yīng)該怎么來做?

畢竟大家不是在一個(gè)JVM里了,不可能用synchronized來在多個(gè)子系統(tǒng)之間實(shí)現(xiàn)鎖吧,是不是?

  • (4)分布式緩存

如果你原來就是個(gè)單塊系統(tǒng),那么你其實(shí)是可以在單個(gè)JVM里進(jìn)行本地緩存就可以了,比如搞一個(gè)HashMap來緩存一些數(shù)據(jù)。

但是現(xiàn)在你有很多個(gè)子系統(tǒng),他們?nèi)绻蚕硪粋€(gè)緩存,你應(yīng)該怎么辦?是不是需要引入Redis等緩存系統(tǒng)?

  • (5)分布式消息系統(tǒng)

在單塊系統(tǒng)內(nèi),就一個(gè)JVM進(jìn)程內(nèi)部,你可以用類似LinkedList之類的數(shù)據(jù)結(jié)構(gòu)作為一個(gè)本地內(nèi)存里的隊(duì)列。

但是多個(gè)子系統(tǒng)之間要進(jìn)行消息隊(duì)列的傳遞呢?那是不是要引入類似RabbitMQ之類的分布式消息中間件?

  • (6)分布式搜索系統(tǒng)

如果在單塊系統(tǒng)內(nèi),你可以比如在本地就基于Lucene來開發(fā)一個(gè)全文檢索模塊,但是如果是分布式系統(tǒng)下的很多子系統(tǒng),你還能直接基于Lucene嗎?

明顯不行,你需要在系統(tǒng)里引入一個(gè)外部的分布式搜索系統(tǒng),比如Elasticsearch。

  • (7)其他很多的技術(shù)

比如說分布式配置中心、分布式日志中心、分布式監(jiān)控告警中心、分布式會話,等等,都是分布式系統(tǒng)場景下你需要使用和了解的一些技術(shù)。

因?yàn)檠赜脝螇K系統(tǒng)時(shí)代的那些技術(shù)已經(jīng)不行了,比如說你單塊系統(tǒng)的時(shí)候,直接在本地用一個(gè)properties文件存放自己的配置即可,日志也寫到本地即可。

但是分布式時(shí)代呢?

你那么多的子系統(tǒng),怎么共享同一份配置?怎么把各個(gè)系統(tǒng)的日志聚合寫到一個(gè)地方來查看?

單塊系統(tǒng)的時(shí)候,你一個(gè)web應(yīng)用直接基于Servlet API提供的Session會話功能即可,那么分布式時(shí)代呢,你有N多個(gè)子系統(tǒng)如果要共享會話該怎么做?

五、一句話總結(jié):什么是分布式系統(tǒng)設(shè)計(jì)和開發(fā)經(jīng)驗(yàn)?

其實(shí)分析完了之后,大家應(yīng)該就大概知道了,招聘JD上寫這個(gè)分布式系統(tǒng)的設(shè)計(jì)和開發(fā)經(jīng)驗(yàn),其實(shí)他是一個(gè)很大的主題,里面包含很多的內(nèi)容。

你的系統(tǒng)一旦分布式了之后,通信、緩存、消息、事務(wù)、鎖、配置、日志、監(jiān)控、會話,等等各種原來單塊系統(tǒng)場景下很容易解決的問題,都會變得很復(fù)雜,需要引入大量外部的技術(shù)。

所以你有沒有參與過類似這樣的一個(gè)大的分布式系統(tǒng)?你有沒有基于各種技術(shù)解決過分布式系統(tǒng)場景下的各種技術(shù)問題?這就是人家希望和要求的分布式系統(tǒng)設(shè)計(jì)和開發(fā)的經(jīng)驗(yàn)。如果大家還沒接觸過,建議多去學(xué)習(xí)一下。

六、補(bǔ)充說明:中間件系統(tǒng)及大數(shù)據(jù)系統(tǒng)

最后給大家說明一點(diǎn),一般這種招聘JD,如果是Java崗位要求分布式相關(guān)的經(jīng)驗(yàn),其實(shí)主要還是上面說的那些東西,他面向的是分布式的業(yè)務(wù)系統(tǒng)的構(gòu)建。

但是其實(shí)分布式系統(tǒng)本身是一個(gè)非常復(fù)雜的話題,因?yàn)閯偛耪f的只是一個(gè)分布式業(yè)務(wù)系統(tǒng)要依賴哪些技術(shù)來進(jìn)行構(gòu)建。

但是其實(shí)比如Kafka、Rocket等中間件,本身他也是分布式的,你要搞明白他們自己是如何實(shí)現(xiàn)分布式的,又是一個(gè)非常復(fù)雜的話題。

此外,像hadoop、spark、hbase等大數(shù)據(jù)系統(tǒng),本身也都是世界上最最復(fù)雜的分布式系統(tǒng),這又涉及到大數(shù)據(jù)領(lǐng)域的話題了,以后有機(jī)會可以單獨(dú)聊聊。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2021-11-12 06:39:51

Tomcat連接器面試

2022-04-10 18:10:24

CURD鏈表

2021-06-03 08:55:54

分布式事務(wù)ACID

2023-01-03 18:06:42

高并發(fā)架構(gòu)

2020-11-09 08:51:24

6G衛(wèi)星

2021-12-02 08:19:06

MVCC面試數(shù)據(jù)庫

2020-09-14 12:46:25

過濾器攔截器Filter

2022-10-17 00:04:30

索引SQL訂單

2022-11-25 17:29:27

分布式事務(wù)

2020-05-20 17:35:40

JavaString面試官

2024-09-24 16:30:46

分布式鎖Redis數(shù)據(jù)中間件

2022-08-11 18:27:50

面試Redis分布式鎖

2024-08-07 08:15:47

2024-06-26 11:55:44

2015-06-01 10:31:43

微軟開源rDSN

2021-12-06 08:30:49

SpringSpring Bean面試題

2020-12-11 09:20:01

數(shù)據(jù)庫架構(gòu)緩存

2020-06-22 08:50:27

Spring AOP代理

2024-10-07 08:52:59

分布式系統(tǒng)分布式 IDID

2019-08-28 14:25:00

線程安全容器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號