淘寶用了這些技術

        首先今天是母親節,祝天下母親快樂。        

        目前軟件公司和互聯網公司仍然是以JAVA爲主要的開發語言,阿里巴巴、京東、百度、騰訊、美團、去哪兒、攜程等公司否是以Java爲主要的編程語言。即使是雲計算領域Java 還是aws,Google app,微軟azure雲。

        不難發現在招聘網站和TIOBE的數據能看到Java是目前最廣,需求最大的編程語言,

 

        如果你想要學習Java做開發,必須要了解的並掌握的體系,這樣比較針對學習。    

        這圖分爲兩個部分,左邊的是包括緩存分佈式、中間件、設計模式、數據結構和算法,右邊的是web javaee框架和數據庫,

        如果你以後做高級工程師和架構師,以上的內容是比必須要掌握的體系。

互聯網的公司對這方法的要求比較高,業務架構需要低成本,安全和規模化、高性能、高併發、高可用、高拓展。

java本身包括的知識點,例如結構化編程、面向對象、方法、變量、數據類型、運算符等語言的基本特性是必須要掌握的內容。

下面說下在互聯網中的位置。

 

        介紹下阿里巴巴從2003年到2012年時間這十年的技術發展,及時現在有過去了五年,我仍然會發現即使是現在,我們也能看到很多公司都有淘寶的影子,因爲淘寶的核心技術架構使用的就是java語言。

        淘寶初始階段,2003年4月馬雲在杭州成立了10個人的組織,一開始他們是以個人對個人的即C2C的的交易平臺,並且需要求雙方的信息保密,需要在最短時間弄這樣的網站,需要維護成本低,容易擴展,輕量簡單。當時符合條件的只有Linux +Apache+Mysql +php這樣的技術架構,優點:無需編譯、發佈快速、而且php功能非常強大,能從頁面一直渲染做到數據訪問完成所有的事情,最重要的是技術開源免費。

        直到今天仍然很多公司使用這樣數據存儲的體系,還有很多中小型項目基本都會採用這樣的存儲架構。這裏面使用到mysql,其中一個master主庫,和兩個slave從庫,並使用了讀寫分離的技術,主庫負責讀寫數據,從庫負責付讀數據,這麼做的好處:1.備份數據庫,slave從庫負責備份數據,這樣增加了安全性,2.讀、寫的效率得以提升,因爲寫比讀更加消耗資源,分開以後就互不干預。這樣的方法主要體現了存儲可靠性上,保證系統發生故障的情況下保證不會丟失所有的數據。說到這裏我們需要掌握和注意下數據庫的技術的重要性,無論是使用PHP還是java還是其他語言,數據庫都是必須要掌握的技術,因爲軟件的本質就是對數據的存儲和數據處理,而且我們還需要知道數據庫的優化,加鎖,存儲引擎等基本概念的應用場景。

        以上這是淘寶發行的第一版,在成立工作室到發佈上線僅僅用了一個月的時間。那時的背景無意中促進了淘寶的發展,就是2003年sars,人們都不敢出門去商店購物,很多人就通過在網上購物,當時一下子的大量訪問是淘寶出現了點小問題,當時使用的是第四版的mysql,在數據容量的數據安全有很多先天不足的地方,在2003年底淘寶引來第一次更新。

        上面是淘寶第二個版本的技術架構,這裏很明顯看到了Oracle代替了mysql,Oracle的特點是穩定,安全,容量大,性能高,並且Oracle還用鏈接池技術,解決高併發和高性能,連接池是我們需要掌握的一個技術,問題是PHP沒有辦法使用鏈接池,沒辦法直接用PHP來訪問Oracle的鏈接池,所以當時淘寶使用了個開源的技術叫sql relay來鏈接Oracle,sql relay有個問題就是經常造成服務的死鎖,解決的辦法只有重寫服務器,所以有隻能考慮升級下個版本了,在那時候的技術已經沒有突破口了,只能對網站脫胎換骨.

 

        因爲數據庫只能用Oracle,所以PHP就不能再使用了,所以只能更換開發語言,java在當時就已經是非常成熟的語言了,具有非常穩定的框架,世界最大規模的網站也普遍採用java開發,所以PHP只適合中小型網站的快速開發,如果是企業級大規模的系統一定要選擇java的技術架構。上面的淘寶2.0版本已經把語言換成了java,由原來支持PHP的Apache服務器替換成Java的jboss服務器,當時主流的MVC框架是struts,當時struts的弱點多人協作和高併發,所以淘寶使用了自己開發的mvc框架,控制層使用了當時sun公司大力推廣的EJB,持久層使用了mapping。爲了緩解數據庫壓力,換成了IBM的Oracle小型機,內存換成了emmc。

        商品查詢和店鋪查詢放在右下角搜索引擎中。

        隨着時間的推移,數據訪問量也在飛速增加,需要考慮如何對Oracle擴展,Oracle是個封閉的系統,想要擴展它最直接就是增副分表,Oracle的處理能力是有上限的,查詢訪問量上億,需要突破這樣的限制,最簡單方式就是多用幾個Oracle數據庫,這就是分庫分表,把數據庫中特別大的表通過行或者列拆開分成多個表,這就是分庫分表。

 

        從上面的架構圖中發現阿里已經對Oracle數據庫進行拆分,我們在學習過程中也需要掌握已有的業務對數據存儲的分庫分表,策略,原則,方法,分庫分表後如何對跨表進行數據查詢,也是在其中工作中需要解決的問題。

        在web層由EJB換成Spring,因爲之前淘寶改造2.0版本的時候是找sun公司的人過來改造,sun公司是主張使用自家的EJB,事實證明EJB是非常臃腫的,在開發角度來看學習成本也很高,所以後開還成Spring,這樣代碼也精簡了很多。

        如果學習Java的同學們,需要掌握企業級的框架Spring (mvc不流行)  web x是淘寶自己技術,所以掌握Spring MVC即可,持久層是mybatis ,另外還有安全的框架,還有一些日誌框架,測試框架。

        到此爲止淘寶爲了緩解數據庫的壓力,提高搜索效率,淘寶引入搜索引擎,分庫分表,2005年的時候淘寶商品數量有1663萬個日均pv八千多萬個,會員有一千三百萬個,數據庫的壓力仍然很大,那麼久加入了緩存。

緩存是圖中左下角cache的內容,因爲一些數據是被頻繁範圍,但有不需要頻繁修改的,每次訪問都需要去數據庫中直接查詢,這樣會大大增加數據庫的讀取壓力,那麼就可以哪些不經常修改的數據放入緩存,每次訪問直接從緩存讀取,這樣避免訪問數據庫從而減少數據庫的壓力。

        CDN是內容分發網絡,因爲天貓雙11的訪問量完全可以拖垮一箇中小城市網絡的帶寬,顯爾這些訪問量不可以集中一起,所以就是用CDN了,圖中的是使用CDN前後的網絡配置對比圖,使用CDN前是所有請求發送到中央節點,使用CDN後用戶請求會被髮送最快的CDN服務,淘寶在全國建立數百個CDN節點,這樣全國各地的用戶就可以通過這些節點訪問,減少對中央節點的訪問和提高用戶的訪問速度,那麼前面的1.0是個比較穩定的版本了,使用了兩年多的時間,隨着業務的發展,淘寶網上的圖片會以往年三倍的速度增長,2010年淘寶網後端系統就保存着286億個圖片文件,在淘寶網圖片訪問量會佔到百分之九十以上,這給淘寶網帶來巨大的挑戰,在2007年之前淘寶網一直使用的是Nginx,即使是最高端的產品也無法滿足淘寶的要求,淘寶網應當是已經是業內最強的了,它遇到的問題史前重來沒人遇到過,意味着淘寶網必須要自己去解決問題,走向技術創新的道路,所以今天看見很多公司解決方案都基於阿里,後來淘寶基於Google file system 自己開發了T F S圖片存儲系統解決了圖片存儲問題。

 

        上圖是TFS的結構圖Storage使用了TFS服務器集羣,Application是使用兩百多臺服務器用於縮略圖的運算。圖片前端服務器是一級緩存和二級緩存,最前面還有全局負載均衡的設置解決高併發下熱點下訪問圖片的問題,這樣訪問到TFS的數量就會大大優化,這次升級涉及到緩存技術和負載均衡技術。

        爲了增強緩存存儲,淘寶再開發了開源的分佈式的緩存系統,是key  value的緩存系統

        上圖是淘寶開發TFS和分佈式緩存之後的系統框架,左下角是分佈式存儲系統,

        以上分佈式緩存是淘寶獨有的,我們一般使用的分佈式緩存有Memcached(較早的項目使用)和Redis(主流)。

 

 

        上面這個淘寶3.0的架構圖了,與之前的對比,發現之前的系統很多功能耦合再一起的,加入某功能出現問題,其他地方也會出現問題,隨着新業務越來越多,所以出現了這樣的一個架構,淘寶的代碼量出現了爆炸式的增長,新招聘的人員根本看不懂之前的代碼,只能摸索性趣修改,代碼越來越臃腫,系統耦合性越來越高,開發效率越來越低,系統出錯的概率也逐步增長,經常是改了這裏的A模塊的代碼B模塊有出問題了,有段時間淘寶上線了淘寶旅行和淘寶彩票,這兩個模塊都和主站的業務不一樣,淘寶旅行是按照航班信息展示信息,淘寶彩票是按照雙色球、數字等展示信息,如果把這兩個模塊加入主站,就會有很多無關的代碼,而且代碼都耦合再一起,會爲主站引入很多新的bug,如果是新建兩個模塊就會重複會員與評價等功能都需要重新寫一遍,當時有這門一句搞笑的話,編譯一段代碼,運行一下,如果通過,一下子半個小時過去了,如果不通過,一下子半天過去了。  再這是應該解決的問題是系統之間的耦合性,維護,一直增加的訪問流量和數據的存儲等一系列的問題,所以淘寶需要再次迎來脫胎換骨的改造,分佈式電子商務信息系統,這就是上圖這架構產生的背景。等於在一家高速飛行的飛機換發動機。

        在淘寶新的業務中,把每個業務都放在獨立的模塊中,獨立開發,獨立編譯,獨立部署,獨立運行,就是不同的店鋪,分佈在不同的服務器中,作爲獨立的服務,逐漸形成穩定的服務中心,前端的多變應用能迅速解決需求。這就是分佈式服務架構,

        在分佈式服務架構中,他們之間的關係圖如下圖,關係變得非常複雜,服務和服務之間的調用像個複雜的蜘蛛網,資源的評估和資源的浪費的問題逐漸顯現出來,此時需要增加一個調度中心管理集羣的容量,提高集羣的利用率。

 

        在下面的中長圖中加入了服務中間件,當時淘寶是自主要發的高性能服務框架HFS,這是真正的SOA面向服務的架構,下游的系統中會向服務中間件註冊分佈式緩存,數據管理。上游的系統會向服務中間件調用服務。

        那麼目前淘寶也有這麼一個開源的dubbo,也是扮演着服務中間件的功能,很多互聯網企業在面向服務中都會用到這個開源的中間件。

        分佈式系統當中還需要解決一個問題,及時系統之間的消息傳輸問題,例如買下一件商品夠,在交易系統中付款完了之後,通知商品管理系統和旺旺系統發送,通知物流系統上門收件,用戶的一個請求會引起數十個系統發起通知,這些消息都是發送給不同的業務系統的,而這些通知應該互不影響,即使一個通知發送失敗不應該影響其他通知的發送,所以需要將這些通知做異步處理,因此消息中間件誕生了。

 

        上門的圖片是加入消息中間件的系統架構圖,ActiveMQ和 RabbitMq (是阿里開源的消息中間件)以及Kafka,我們可以選擇一個主流的消息中間件學習。淘寶有了服務中間件和消息中間件之後每個模塊都可以獨立運行了,但是數據庫的壓力仍然在增加,2007年淘寶網日均PV就達到2.5億個,商品數超過一億個,全網成交額就達到四百多億元,註冊會員五千多萬,之前提到的Oracle+IBM小型機+EMMC存儲這樣的組合非常昂貴,一套下來就是千萬級別,數據存儲的成本是難以控制的,因此在不影響正常業務發展的前提下,淘寶的解決方案是一部分纔有MySQL 另一部分纔有Oracle,那麼目前淘寶團隊研發了Oceanbase數據庫,這是一個海量存儲,高性能,分佈式的數據庫系統,它實現數千億條記錄,數百TB數據更新,高性能跨表讀事物、跨表查詢等一系列功能,另外爲了優化用戶體驗,用到了一下用戶行爲追蹤等技術,當我們訪問一個html頁面的時候,瀏覽器首先會向服務器請求這個頁面,頁面加載後就會加載頁面用到的css樣式文件,還有js動態腳本文件,圖片文件等其他文件。但是在瀏覽器在同一個域名下,併發加載的資源是有限的,每個瀏覽器對這種限制都不一樣,一般最多控制在六個以內,也就是打開淘寶首頁,最多能加載6個資源文件,淘寶首頁的還有腳本資源基友幾百個之多,併發鏈接數那麼小,肯定要加載很久才能完成,所以前端人員會將這些腳本文件分到多個域名下,這樣就能變相繞過瀏覽器的限制了。

        所以以上涉及到內容分發CDN的知識了,所以還是需要掌握一些web前端的基礎知識,包括簡單的HTML,css,js,http和htps協議,這裏說下Java本身的高級特性 面向對象,異常,泛型,內部類,反射,IO/NIO,集合,多線程,併發類容器,數據結構,算法,設計模式,JVM。互聯網解決的問題就是高併發,高可用,高擴展架構,  NIO和IO提高磁盤讀寫性能,多線程設計到高併發編程提高應用程序的執行效率。

        總結以上的內容可分爲5大部分 1.牢固的Java基礎。2.Java進階,高併發編程,Java虛擬機。3.Java應用開發的擴展,數據庫編程,主流開源框架,分佈式開發。4.Java安全方面的內容,安全問題和處理方法,5.Java性能方面的內容,需要掌握一些工具。

 

 

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/pangzhaowen/article/details/80299631

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章