我們一起聊聊分散式與網路原理
我們一起聊聊分散式與網路原理
並發是怎麼出現的
眾所周知,中國人口很多,人口資源相當豐富,十億人口。現如今的網路/行動網路發展的也很龐大,就因為人多,在大家都在使用一個app的時候,就會造成擁擠的現象,就跟超市一樣,人多必然會擁擠,東西少,你需要搶購,你慢了一拍,就買不到,你遇過早上大爺大媽搶著買雞蛋的場景吧?而且結帳速度也會比平常慢,甚至還會出現限購的現象。這其實和網路環境中的高並發道理是一樣的。
相反,有些國家的人口基數本來就少,幾千萬吧,和我們沒法比,他們那邊的擁堵現象會好一些,但是畢竟人少。人多資源多,相應的,我們這的大數據發展很快,人多了,用戶畫像分析啊,用戶行為分析啊,就更好做。人家國家就只有幾千萬,活躍用戶可能百來萬,大數據玩不溜。
人多人少有啥差別?消費啊,一個國家人口那麼多,那麼資源開發就更多,如果有一定的手段,你可以撬動他們來消費,我一個電商平台,做好運營/營銷/推廣,吸引用戶多了,市場份額上來了,消費就上來了。如果你一個電商在一個人口少的國家去推廣,市場就那麼點大,消費水平上不來呀,人多人少沒法比啊對吧~ 老鐵。所以,大家會很容易會聯想到什麼?
- 明星結婚,微博癱瘓了
- 春運,12306 掛了,或搶不到票
- 等等這些都是人多所出現的必然現象。
此外,我們還有一個叫做粉絲經濟,現如今,人人都是自媒體,只要你的流量大,粉絲多,你就能賺錢,就比如李佳琪啊羅胖呀,對吧。直播買東西就是推廣產品的一中手段,如此一來,就能撬動大家的購買慾望,向電商平台輸送流量。
這個時候,直播間的用戶會有一部分進入電商平台購物。那麼流量比例大概多少呢?一般來說都是28或37原則,20%的用戶會進來,甚至會少一些,假設有1000萬用戶,那麼這個時候湧入的流量就是200萬,那你平台能吃得消不?並發支撐夠不夠?有沒有負載平衡,高並發處理行不行,有沒有做高可用,這些都要考慮,而且也都和網路相關。所以要支援用戶量,要想公司賺大錢,技術要和業務貼合,整體系統的並發與高可用以及穩定性,都要保證。如果因為某一個短板效應出現問題,那麼用戶的流失會很慘重,對平台與企業造成的影響是巨大的,除非是12306,用戶必須使用,否則,用戶流量會分發的其他不同的管道與電商平台。
所以,由科技來拉動市場,來穩定使用者的。並發場景無所不在,那麼這整個過程其實也是貼分散式系統的架構發展出來的。比如如下:
單體-->分散式-->群集高可用-->高並發-->微服務-->容器化。
分散式架構演變
負載平衡
輪訓,加權輪訓,ip_hash(一致性雜湊),url_hash,最小連接數
負載平衡分為7層負載與4層負載
OSI網路模型原理
以上這些其實本質上都是基於網絡,有了網絡才能交互,網絡通信和我們的生活息息相關。那麼說到網路通信,咱們就得來聊一聊七層模型了,這個其實也是網路基礎,很多小夥伴們在接觸nginx以及集群啊啥的有點混亂,這其實本身就是比較偏網路的,這邊我們就來一起聊一下。
人和人之間面對面對話溝通透過講話,打電話透過電話走電話線,那麼如果這兩個人在電腦(或手機)螢幕的兩邊溝通,那麼就是使用者A和電腦交互,然後電腦和使用者B交互,達到溝通的目的。其實不論是人機交互還是電腦之間(機機)交互,那麼都會有一個溝通的過程。
通訊就會牽扯到電腦網絡,和網路相關。我記得在我大學那會這個就是必考知識點。這裡就會牽扯到OSI七層網路模型。
圖片
什麼是OSI,可以把它當做是一種規範,計算機之間的通信,數據交互,要符合OSI標準才能夠把數據從一端發到另外一端,從而讓另外一個用戶看到,如此以來達到交互。而且分層了,那麼每一層的目的就更加明確了,做什麼事由自己那一層決定,就跟MVC一樣,各司其職,解耦。並且對於每一層的開發人員來講,更加專注了,不同的開發人員維護不同層次的東西,不會耦合在一起。所以,分層解耦無所不在,在開發的過程中還要多考慮。咱們先來簡單看一下:
圖片
- 應用層(7層):如上圖,兩個使用者透過qq或微信溝通,他們依賴電腦或智慧型手機。那麼應用軟體就是第一層,也就是應用層這一層裡的,這一層會規定http協議,數據格式等,供調用,只要是一些軟體應用程序,他們都是基於應用層的,也就是和人最直接溝通的媒介,也就是軟體,qq/微信/瀏覽器/idea/eclipse這些都是。
- 表示層(6層):協定啊,字串的表示,加密
- 會話層(5層):session建立與保持,建立和管理應用程式之間的通信
- 傳輸控制層(4層):如何建立連接,如何資料傳輸,資料處理傳輸OK或失敗
- 網路層(3層):資料路由,如何找到哪個節點去處理的,資料如何通信,怎麼發的
- 資料鏈結層(2層):通訊之間的協定是啥,怎麼發出去
- 實體層(1層):實體傳輸設備,如wifi,2g/3g/4g,網路線等看得見摸得著的。
七層模型(協定)歸類合併
七層模型其實就是一些協議的定義和劃分,每一層所執行的功能不同,對應的協議也不同,而且我們可以把他們再進行合併,如下圖,分成4層或5層或7層其實都行。
圖片
每一層的只能都是不同的,如下:
- 實體層:實體傳輸設備,如wifi,2g/3g/4g,網路線等看得見摸得著的。當你和朋友微信聊天的時候,你用電腦插入線,你朋友用手機連接wifi,這些都是屬於物理層的。打電話也一樣,需要有電話線。
- 那麼電腦之間的傳輸是透過物理層,傳輸的時候以什麼形式傳輸呢?都是一些二進位數據,1010001001這樣的。
- 資料鏈結層:當電腦接收到1010001這些二進位的時候,這玩意本身很長,需要去進行解析的,所以他們其實是可以透過8位元一組來進行劃分,每組都是8位元的話那麼就可以進行資料運算和處理。那麼每組8位(或16位/64位),這活誰幹呢?它是由連結層來劃分的,物理層乾不了,職能不夠。
- 鏈路層處理的規範協議為以太網協議,他是一個標準,也是規範,因為早期的時候很多公司都是對二進制數據進行不同的分組,能用,但是太亂了,為了更加規範,採用了乙太網路協定Ethernet。
- 電腦通訊會發出資料包,資料包包含head和data兩個部分。
- head包含發送者,接受者以及資料類型(來源mac位址,目標mac位址)
- data包含資料包的具體內容數據
- 和rest請求很像吧?: - )
- 資料發送的時候是head和data一起發的,有一定的長度限制,具體忘了。如果太長了,會進行分片發送,也就是切割,啥是分片,自己百度,之前講過很多了。
- 那麼這個資料包其實和你平常打電話是一樣的道理,呼叫者是資料發送者,被叫者是資料接受者,談話內容就是data資料包,對吧。
- 附帶一提,計算機裡的地址,和每個人的手機號碼是一樣的,叫做mac地址,和你的網卡相關。
- 關於mac位址:之前提到了乙太網路協定Ethernet,這玩意也規定了要在互聯網上通信,必須得有一個mac位址,而mac位址存在於網卡,所以有了網卡才能上網,每一個網卡對應一個mac地址(知識點啊,這個我們在架構師課程裡的Keepalived以及LVS裡說過,虛擬IP透過虛擬機器裡的網卡才能虛擬化出新的VIP),和你的手機卡也一樣,你要打電話,得買一個手機卡,每一個手機卡里有唯一的一個手機號碼,透過手機號碼才能進行呼叫和被叫,ok吧。
- 所以,這一層的連結層,他就是主要來定義資料的格式化傳輸的,一端傳出去,另一端接受進來分組解析。
- 網路層:這一層其實定義了IP協議,他有一個網關的概念,說到網卡大家會想到什麼?nginx?zuul?gateway?那麼他們是不是都會處於某個計算機節點上?他們都會有一個ip,那麼其實當電腦資料發出去的時候,會經過網關,接受的時候,也會經過網關,相當於他是一個中介,通俗點講,你打電話的時候,要透過運營商吧,從電話呼出去,到接收通過,中間的過程由運營商來幫你處理,這個時候的運營商你可以認為是一個網關(也是起到了數據路由的作用),他是存在於某一個地址的,也就是IP位址,那麼每個區域都有不同的運營商,不同的運營商管著不同的歸屬地,那麼你可以把區域(歸屬地)理解為局域網,而手機就是每一個mac地址,同一個區域的區域網路的ip都是一樣的,而手機號碼對應的mac位址則不一樣,對吧。看一下下面的圖來理解一下(加餐)
圖片
圖片
4. 傳輸層:建立連接埠與連接埠之間的通訊。什麼意思呢,就是說呢,我們可以透過ip與mac位址找到對應的目標電腦節點,那麼假設我們現在透過微信或qq聊天,這個時候資料傳輸到對方的電腦了,那麼對方的qq或微信如何來接受你的數據呢?或是如何把資料交給微信qq來展示給使用者?這個時候就有端口的概念了,每個應用程式都會有一個端口,一個應用程式要多開,那麼端口號肯定不一樣,原理同tomcat。每個端口都會和網卡產生關聯,我們在進行計算機交互的時候都會攜帶端口,比如8080,如此一來,那麼對應的對方的應用程序才會接受到數據並且展示。ok吧。
- 例如還是以打電話為例,很多時候光打電話沒用,對方沒人接聽,你需要再最後加上分機號,那麼8080就比方說是分機號,可以打給人事,8088可以打給老闆小蜜,那麼端口就是這個意思。
- 傳輸層的協定為TCP何UDP,LVS屬於傳輸層,他是4層負載平衡。
5. 應用層:應用層+表示層+會話層可以共同定義為應用層。使用者所使用的所有的應用程式都是基於應用程式層,就例如qq,微信,瀏覽器,idea,eclipse都是,這是電腦與人最直觀的互動。每個應用程式都可以有自己的不同的資料格式,資料組成形式,那麼應用層就是規定了應用程式的資料格式。例如qq/微信/郵箱/瀏覽器,這些應用程式的資料傳輸的時候,協定都是不同的,資料格式也都是不同的,協定的不同在表示層進行規範。會話層是建立在傳輸層之上的,和我們所說的session道理一致,用於維護兩點之間的通信的,也就是建立和管理應用程式之間的通信,如果我電腦重啟了,再次開啟軟體需要重新建立連接,也就是重新建立會話,OK吧。