我們一起聊聊分布式與網絡原理
并發是怎么出現的
眾所周知,中國人口很多,人口資源相當豐富,十幾億人口。現如今的互聯網/移動互聯網發展的也很龐大,就因為人多,在大家都在使用一個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吧。