IT運(yùn)維知識(shí):什么是分布式系統(tǒng)
2020-03-25 16:06 作者:艾銻無(wú)限 瀏覽量:
如何應(yīng)對(duì)我們?nèi)松械膯?wèn)題
談到人生中的問(wèn)題,這好像是一個(gè)大話題,不過(guò)我只是想和大家分享我對(duì)人生中的這些問(wèn)題的認(rèn)知及領(lǐng)悟,又或者說(shuō)在我人生中的這些問(wèn)題我是對(duì)如何應(yīng)對(duì)的,又有那些收獲,有句話說(shuō)“以史為鑒知興衰,以人為鏡明得失”。
小的時(shí)候,整天玩的不意樂(lè)乎,不知道人生中還有問(wèn)題,所以沒(méi)心沒(méi)肺的那段日子在記憶里好像連碎片都沒(méi)有,不知道是遺忘,還是沒(méi)有什么值得記起的事。進(jìn)入學(xué)校,好像自己慢慢接觸的人越來(lái)越多,做的事也越來(lái)越多,問(wèn)題好像被它們擠了出來(lái),而且好像越擠越多。現(xiàn)在我總結(jié)了幾點(diǎn),第一,我發(fā)現(xiàn)問(wèn)題會(huì)隨年齡的增大而增多。第二,問(wèn)題會(huì)隨你接觸的人或事越多而越多。第三,問(wèn)題會(huì)隨著你能力的越大而越多。當(dāng)我發(fā)現(xiàn)這些問(wèn)題的時(shí)候,我?guī)缀踅^望了,這可怎么辦,我這輩子都解決不完問(wèn)題,而且我差點(diǎn)得了成長(zhǎng)恐懼癥,都不敢學(xué)習(xí)了,這要是學(xué)多了,能力變強(qiáng)了,反而問(wèn)題更多了,這可怎么辦?
三十年后,我在一次回頭看小時(shí)候的這些想法,未免有些可笑,但確實(shí)還是應(yīng)證了小時(shí)候的總結(jié),在學(xué)校只有學(xué)校問(wèn)題,進(jìn)入社會(huì)后又有了社會(huì)問(wèn)題,找到了工作就發(fā)生了工作問(wèn)題,創(chuàng)辦企業(yè)又有了創(chuàng)業(yè)問(wèn)題,成了家庭又有了家庭問(wèn)題,交了朋友多了朋友問(wèn)題,我發(fā)現(xiàn)從長(zhǎng)大到現(xiàn)在問(wèn)題是越來(lái)越多,越來(lái)越復(fù)雜,越來(lái)越有學(xué)問(wèn)。
難道我們這輩子就離不開(kāi)問(wèn)題了嗎,對(duì),說(shuō)對(duì)了,這輩子我們都要和問(wèn)題在一起,我們因問(wèn)題而出生,我們因問(wèn)題而長(zhǎng)大,我們因問(wèn)題而學(xué)習(xí),我們更因問(wèn)題而富足,最終我們也會(huì)因問(wèn)題而走向死亡。當(dāng)我發(fā)現(xiàn)其實(shí)問(wèn)題是我們一生最忠實(shí)的伙伴,它會(huì)真實(shí)的讓我們看到自己,看清自己,看透自己。更會(huì)與我們時(shí)時(shí)相伴,不離不棄。但大部分人還沒(méi)有看透問(wèn)題,理解問(wèn)題的時(shí)候,他們會(huì)報(bào)怨問(wèn)題的發(fā)生,他們會(huì)想辦法躲避問(wèn)題,他們以為自己可以逃避問(wèn)題,但最終會(huì)被更多的問(wèn)題所困繞。而那些往往把問(wèn)題當(dāng)朋友,真心與其相處,并努力去了解問(wèn)題,最終穿越問(wèn)題的朋友卻最終因問(wèn)題成長(zhǎng),收獲。
在這里我有三個(gè)法則分享給大家,希望它們能更好的讓你應(yīng)對(duì)生命中的問(wèn)題:
第一法則:萬(wàn)事萬(wàn)物,陰陽(yáng)兩面. 當(dāng)我們看到一個(gè)問(wèn)題時(shí),也就意味著同時(shí)是生命中的一個(gè)啟示,我們把焦點(diǎn)放在問(wèn)題上,就會(huì)越陷越深,問(wèn)題就真成了問(wèn)題,如果把焦點(diǎn)放在啟示上,就會(huì)問(wèn)自己學(xué)到什么,從而會(huì)透過(guò)問(wèn)題打開(kāi)一個(gè)全新的開(kāi)始,也許會(huì)成為我們一個(gè)起點(diǎn)或巧點(diǎn),讓我們因問(wèn)題而有所改變,因問(wèn)題有所成長(zhǎng),因問(wèn)題更得更好.
第二法則:循環(huán)往復(fù),一切因果. 如果中立來(lái)看,問(wèn)題只是事件呈現(xiàn)出來(lái)的信息,破解信息背后的譯碼,我們就能讀懂因果循環(huán)的規(guī)律,掌握規(guī)律就掌握了萬(wàn)事萬(wàn)物運(yùn)行的根本,所以透過(guò)問(wèn)題看本質(zhì),是不是感謝問(wèn)題的出現(xiàn).
第三法則:超越世相,萬(wàn)法歸一.其實(shí)這個(gè)世間的相皆為幻相,就像我們看到的全息影像視頻一樣,人生的所有問(wèn)題都是時(shí)間的問(wèn)題,時(shí)間可以讓一切問(wèn)題都不是問(wèn)題,當(dāng)我們不在糾結(jié),不在把能量放在這些幻相上時(shí),所有的問(wèn)題都會(huì)自生自滅.回歸本初,用心放在當(dāng)下,去體驗(yàn)和享受這個(gè)世界給我們帶來(lái)的一切吧.
IT運(yùn)維知識(shí):什么是分布式系統(tǒng)
現(xiàn)在有很多Java技術(shù)方向的同學(xué)在找工作的時(shí)候會(huì)有這樣的一個(gè)要求:熟悉分布式系統(tǒng)理論、設(shè)計(jì)和開(kāi)發(fā),具備復(fù)雜分布式系統(tǒng)構(gòu)建經(jīng)驗(yàn)。之前不少同學(xué)后臺(tái)留言問(wèn)過(guò)我:這個(gè)分布式系統(tǒng)的設(shè)計(jì)和開(kāi)發(fā)經(jīng)驗(yàn),到底指的是什么?那么這篇文章就給大家來(lái)解釋一下這個(gè)問(wèn)題。
1.從單系統(tǒng)說(shuō)起
要說(shuō)分布式系統(tǒng)是什么東西,那么就得先從單塊系統(tǒng)開(kāi)始說(shuō)起。很多同學(xué)應(yīng)該都知道,如果你在一些中小型的傳統(tǒng)軟件公司里工作,那么很有可能現(xiàn)在在做的系統(tǒng)是如下這個(gè)樣子。所有的代碼都在一個(gè)工程里,最多可能就是通過(guò)maven等構(gòu)件工具拆分了一下代碼工程模塊,不同的模塊可以放在不同的工程代碼里。在部署的時(shí)候,可能就是直接在線上的幾臺(tái)機(jī)器里直接放到里面的tomcat下來(lái)運(yùn)行。然后在web服務(wù)器前面可能會(huì)有一層負(fù)載均衡服務(wù)器,比如用nginx或者是其他的負(fù)載均衡設(shè)備。很多流量很小的企業(yè)內(nèi)部系統(tǒng),比如OA、CRM、財(cái)務(wù)等系統(tǒng),甚至可能就直接在一臺(tái)機(jī)器的tomcat下部署一下。然后直接配置一下域名解析,就可以讓這個(gè)系統(tǒng)的可能幾十個(gè),或者幾百個(gè)用戶通過(guò)訪問(wèn)域名來(lái)使用這個(gè)軟件了。至于說(shuō)系統(tǒng)的依賴大概來(lái)說(shuō)很可能只有一個(gè),那就是MySQL、Oracle等關(guān)系型數(shù)據(jù)庫(kù),可能會(huì)在某臺(tái)機(jī)器上專門部署一個(gè)數(shù)據(jù)庫(kù),讓應(yīng)用系統(tǒng)來(lái)使用。這種系統(tǒng)在很多中小型公司里現(xiàn)在還是比較多的,就是典型的單塊系統(tǒng),所有代碼在一個(gè)工程,部署在一個(gè)tomcat里即可,這里包含了系統(tǒng)所有的功能。你哪怕就部署一臺(tái)機(jī)器,這個(gè)系統(tǒng)也可以運(yùn)行,只不過(guò)為了所謂的“高可用”,可能一般會(huì)部署兩臺(tái)機(jī)器,前面加一層負(fù)載均衡設(shè)備,這樣其中一個(gè)機(jī)器掛了,另外一個(gè)機(jī)器上還有一個(gè)系統(tǒng)可以用。
2.團(tuán)隊(duì)越來(lái)越大,業(yè)務(wù)越來(lái)越復(fù)雜
其實(shí)上面說(shuō)的那種單系統(tǒng),如果是一個(gè)10人以內(nèi)的小團(tuán)隊(duì)大家一起維護(hù)和開(kāi)發(fā)一個(gè)用戶數(shù)量不多,請(qǐng)求量不大的系統(tǒng),也是沒(méi)問(wèn)題的,還挺方便的,對(duì)吧。你搞一個(gè)代碼倉(cāng)庫(kù),然后就一份代碼,每個(gè)人都在自己本地寫代碼,最后把代碼合并一下,做做測(cè)試,然后就直接部署基于Tomcat來(lái)就可以了。但是問(wèn)題就在于說(shuō),如果你的團(tuán)隊(duì)超過(guò)了10個(gè)人,比如有20個(gè)人,甚至幾十個(gè)人,上百個(gè)人要一起協(xié)作開(kāi)發(fā)這個(gè)系統(tǒng),然后里面的業(yè)務(wù)邏輯特別多,可能功能模塊多達(dá)幾百個(gè)。這個(gè)時(shí)候就麻煩了,你要是還用那種單塊系統(tǒng)的模式,那肯定是很痛苦的。因?yàn)閹资畟€(gè)人維護(hù)一個(gè)單系統(tǒng),大家在一個(gè)工程里寫代碼,大量的沖突以及代碼合并都會(huì)讓人崩潰。而且部署的時(shí)候會(huì)有各種沖突,比如某個(gè)功能模塊要上線了,但是他必須得把整個(gè)單塊系統(tǒng)所有的功能都回歸測(cè)試一遍才敢上線。因?yàn)榇蠹业拇a都在一個(gè)工程里,都是耦合在一起的,你修改了代碼,必須全部測(cè)試一遍才能保證系統(tǒng)正常。所以說(shuō)這個(gè)時(shí)候就必須想辦法把系統(tǒng)改造成分布式系統(tǒng)了。
3.分布式出現(xiàn):龐大系統(tǒng)分而治之
這個(gè)時(shí)候就可以嘗試把一個(gè)大的系統(tǒng)拆分為很多小的系統(tǒng),甚至很多小的服務(wù),然后幾個(gè)人組成一個(gè)小組就專門維護(hù)其中一個(gè)小系統(tǒng),或者每個(gè)人維護(hù)一個(gè)小服務(wù)。簡(jiǎn)單來(lái)說(shuō),就是分而治之,這樣每個(gè)人可以專注維護(hù)自己的代碼。
然后不同的小系統(tǒng)自己開(kāi)發(fā)、測(cè)試和上線,都不會(huì)跟別人耦合在一起,可以自己獨(dú)立進(jìn)行,非常的方便,大大簡(jiǎn)化了大規(guī)模系統(tǒng)的開(kāi)發(fā)成本。不同的子系統(tǒng)之間,就是通過(guò)接口互相來(lái)回調(diào)用,每個(gè)子系統(tǒng)都有自己的數(shù)據(jù)庫(kù)
4.分布式系統(tǒng)所帶來(lái)的技術(shù)問(wèn)題
那么大家這個(gè)時(shí)候可以思考一下,如果你的公司是采用這種分布式系統(tǒng)的方式來(lái)構(gòu)建公司的一個(gè)大規(guī)模系統(tǒng)的,那么這個(gè)時(shí)候會(huì)涉及到哪些技術(shù)問(wèn)題?
(1)分布式服務(wù)框架
你如果要讓不同的子系統(tǒng)或者服務(wù)之間互相通信,首先必須有一套分布式服務(wù)框架。
也就是各個(gè)服務(wù)可以互相感知到對(duì)方在哪里,可以發(fā)送請(qǐng)求過(guò)去,可以通過(guò)HTTP或者RPC的方式。
在這里,最常見(jiàn)的技術(shù)就是dubbo以及spring cloud,當(dāng)然大廠一般都是自己有服務(wù)框架
(2)分布式事務(wù)
一旦你的系統(tǒng)拆分為了多個(gè)子系統(tǒng)之后,那么一個(gè)貫穿全局的分布式事務(wù)應(yīng)該怎么來(lái)實(shí)現(xiàn)?
這個(gè)你需要了解TCC、最終一致性、2PC等分布式事務(wù)的實(shí)現(xiàn)方案和開(kāi)源技術(shù)。
(3)分布式鎖
不同的系統(tǒng)之間如果需要在全局加鎖獲取某個(gè)資源的鎖定,此時(shí)應(yīng)該怎么來(lái)做?
畢竟大家不是在一個(gè)JVM里了,不可能用synchronized來(lái)在多個(gè)子系統(tǒng)之間實(shí)現(xiàn)鎖吧,是不是?
(4)分布式緩存
如果你原來(lái)就是個(gè)單塊系統(tǒng),那么你其實(shí)是可以在單個(gè)JVM里進(jìn)行本地緩存就可以了,比如搞一個(gè)HashMap來(lái)緩存一些數(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來(lái)開(kāi)發(fā)一個(gè)全文檢索模塊,但是如果是分布式系統(tǒng)下的很多子系統(tǒng),你還能直接基于Lucene嗎?
明顯不行,你需要在系統(tǒng)里引入一個(gè)外部的分布式搜索系統(tǒng),比如Elasticsearch。
(7)其他很多的技術(shù)
比如說(shuō)分布式配置中心、分布式日志中心、分布式監(jiān)控告警中心、分布式會(huì)話,等等,都是分布式系統(tǒng)場(chǎng)景下你需要使用和了解的一些技術(shù)。因?yàn)檠赜脝螇K系統(tǒng)時(shí)代的那些技術(shù)已經(jīng)不行了,比如說(shuō)你單塊系統(tǒng)的時(shí)候,直接在本地用一個(gè)properties文件存放自己的配置即可,日志也寫到本地即可。但
是分布式時(shí)代呢?你那么多的子系統(tǒng),怎么共享同一份配置?怎么把各個(gè)系統(tǒng)的日志聚合寫到一個(gè)地方來(lái)查看?單系統(tǒng)的時(shí)候,你一個(gè)web應(yīng)用直接基于Servlet API提供的Session會(huì)話功能即可,那么分布式時(shí)代呢,你有N多個(gè)子系統(tǒng)如果要共享會(huì)話該怎么做?
5.一句話總結(jié):什么是分布式系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)經(jīng)驗(yàn)?
其實(shí)分析完了之后,大家應(yīng)該就大概知道了,招聘上寫這個(gè)分布式系統(tǒng)的設(shè)計(jì)和開(kāi)發(fā)經(jīng)驗(yàn),其實(shí)他是一個(gè)很大的主題,里面包含很多的內(nèi)容。你的系統(tǒng)一旦分布式了之后,通信、緩存、消息、事務(wù)、鎖、配置、日志、監(jiān)控、會(huì)話,等等各種原來(lái)單塊系統(tǒng)場(chǎng)景下很容易解決的問(wèn)題,都會(huì)變得很復(fù)雜,
需要引入大量外部的技術(shù)。所以你有沒(méi)有參與過(guò)類似這樣的一個(gè)大的分布式系統(tǒng)?你有沒(méi)有基于各種技術(shù)解決過(guò)分布式系統(tǒng)場(chǎng)景下的各種技術(shù)問(wèn)題?這就是人家希望和要求的分布式系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)的經(jīng)驗(yàn)。如果大家還沒(méi)接觸過(guò),建議多去學(xué)習(xí)一下。
6.補(bǔ)充說(shuō)明:中間件系統(tǒng)及大數(shù)據(jù)系統(tǒng)
最后給大家說(shuō)明一點(diǎn),一般這種招聘如果是Java崗位要求分布式相關(guān)的經(jīng)驗(yàn),其實(shí)主要還是上面說(shuō)的那些東西,他面向的是分布式的業(yè)務(wù)系統(tǒng)的構(gòu)建。但是其實(shí)分布式系統(tǒng)本身是一個(gè)非常復(fù)雜的話題,因?yàn)閯偛耪f(shuō)的只是一個(gè)分布式業(yè)務(wù)系統(tǒng)要依賴哪些技術(shù)來(lái)進(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ī)會(huì)可以再談。