java分佈式(分佈式架構)

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯繫信箱:feixiaoxing @163.com】

 

    開頭的話,架構多半和業務關聯在一起,如果只是簡單的圖書管理系統、選課系統或者什麼簡單的財務系統,用不着分佈式。只有大型公司、高併發的業務才需要分佈式的幫助。當然,架構本身要和業務模型緊密配合才能發揮作用。

 

     很長一段時間,java都是最流行的編程語言。我想,一方面是由於java可以用來開發網站後端程序,另外一方面java可以用來開發android這樣的客戶端程序。當然,很多人會說,java天生具有網絡屬性,具有很好的分佈式基因。這應該是一種認知錯誤。所謂的分佈式都是基於tcp/ip網絡,它發展的原因是因爲穩定性、性能和業務擴展的需要,單臺服務器已經遠不能滿足業務的需要。這方面,其他語言也可以做到這一點,比如說python、go、erlang等等。只是,對於企業來說,一個不可忽略的現實是,市場上合格的java工程師很多,但是可以獨當一面的python、go、erlang工程師太少,這也使得一些企業即使在創立初期的時候用了其他編程語言,後期也會慢慢轉到java上面。不是技術不允許,實在是人才不允許。腳本語言太自由,坑太多,稍不小心就有可能埋雷,而java語言規範、第三方庫多,即使有錯誤,也會很快暴露出來,這也算java很好的一個優勢吧。

 

    說到網站後端開發,很多人都會選擇java + Spring + myBatis的開發模式。這無可厚非。只是隨着業務的快速發展,整體的網站架構也在快速迭代當中,不妨利用這段時間簡單梳理一下發展流程。

 

1、單臺服務器模式

    所謂的單臺服務器,就是http服務器軟件、靜態文件(主要是以圖片爲主,還有html、css、js文件)、mysql軟件安裝在一臺服務器上。很多大學裏面的課程作業都是這麼設計的。

 

2、多臺服務器模式

    當文件越來越多的時候,單臺服務器遠遠不能支撐業務的發展。這個時候會將http服務器軟件、文件服務器、數據庫軟件安裝在不同的服務器上面,彼此之間用tcp/ip進行連接,企業內部的寬帶要比外面買的寬帶速度高很多。

 

3、添加緩存服務器

    隨着業務的發展,用戶對數據的速度要求越來越高,要是每次訪問的時候都直接訪問數據庫,這個效率其實是很低的。在現實場景中,大家會發現讀數據的請求比改數據的請求要多的多,所以這個時候添加一些nosql緩存服務器,可以有效地提高用戶體驗。

 

4、反向代理服務器

    單臺http服務器的性能總是有限的,所以實際業務場景下一般會使用nginx作爲代理服務器。通過代理軟件,用戶的數據請求會被均衡分配到不同的http服務器上面。當然此時nginx就成了系統的瓶頸點,所以爲了保護nginx,一般也會安裝多臺nginx服務器,使用keepalive軟件來保證nginx宕機的時候自動進行切換。

 

5、CDN服務器

    大家如果安裝過不同電信運營商的寬帶就知道,一個電信運營商下的pc如果訪問另外一個電信運營商的服務器,速度是很慢的。所以一個比較務實的方法,就是講常用的文件、特別是靜態文件安裝在離用戶最近的那臺運營商服務器上面,這就是CDN服務器設計的初衷。

 

6、分佈式文件服務器

    如果網站後臺文件過多,那麼單臺服務器遠不能滿足用戶的要求,這個時候分佈式文件服務器應運而生。

 

7、分佈式數據庫服務器

    同樣的,當數據累積到一定程度的時候,單臺服務器其實遠遠不能滿足要求。而且,單臺服務器還比較危險,一旦服務器宕機之後,後果其實是不堪設想的。這個時候一般會有兩種方案,一種是分庫分表,即將數據庫分佈在不同的服務器上面,或者將同一張表的內容分佈在不同的服務器上面,插件可以幫助我們做到這一點,比如MySql Proxy;另外一種方法就是真正的分佈式數據,比如TiDB,這個時候用戶不需要關心數據是怎麼分配的,因爲底層軟件就可以將數據靈活的存儲在不同的服務器上面。每種方法都有自己的自己的優缺點,大家可以靈活應對。

 

8、微服務部署

    從前的代碼部署都是安裝在http服務器上面,但是一旦某一個小功能失敗,那麼有可能會導致整臺http服務器失敗。所以,針對這種情況,現在提出了一種微服務器的模式。它的基本思想類似於rpc,http服務器從nginx接收到用戶的請求之後,不是直接運行,而是通過rpc向微服務器提出請求,並且等待微服務的結果。微服務中的服務,其實就是一個一個小的業務。單個微服務未必是一臺服務器,也有可能是基於zookeeper的多臺服務器,因爲數據量或大或小,不一定。

 

9、消息服務器

    不同的服務器之間是需要進行數據溝通的。爲了性能,很多時候,服務器之間的通信都是異步的,所以消息服務器就充當了緩衝和信息處理的功能。消息服務一般是週期處理、或者滿足一定業務條件就會觸發處理。微服務之間的通信,就需要消息服務器的幫助。

 

10、監控服務器

    服務器運行過程中會出現各種各樣的情況。服務器cpu多少、ram還剩多少、存儲怎麼樣、寬帶用了多少、當前跑了哪些業務,這些信息都需要有一個監控服務器來完成。

 

11、運維服務器

    當產品開發好,這個時候一般會在小範圍內進行部署,也就是小範圍的發佈。等到沒有大的問題之後,就會進行大範圍的推送,這是一種常用的方法。運維的同學不僅需要上線產品、還需要下線產品、灰度發佈,還需要24h檢測服務器的運行。在業務擴展的時候,需要及時部署、添加新的服務器。當出現問題時,他們需要將當前服務器上的業務transfer到其他機器上面,用戶一般是不會感受到這種變化的。

 

12、爬行、搜索服務器

    像一些短視頻公司,除了自己生產內容之外,另外一個很重要的工作就是對全網進行爬行工作。等到內容獲取之後,就會用數據庫固化下來,這個時候就需要搜索服務器的幫助了。關於搜索這方面,現在有一些開源的軟件可以供使用,比如solr。

 

13、推薦服務器

    除了用戶自己想搜索的內容外,系統一般也會推薦一些相關的內容。很多同學都會使用頭條或者抖音,那麼裏面推薦服務器就要承擔很重要的一部分工作。推薦服務器可以做得很簡單、也可以做得很複雜,這個時候就看它是不是公司的主營業務了。當然不光是頭條這些公司很在意推薦,像一些電子商務網站也是很在意推薦服務,因爲它會增加公司的銷售額,在很大程度上提升企業的效益。

 

14、待機服務器

    服務器也不是一直都能穩定工作的,這個時候準備一些待機服務器還是很有必要的。

 

    上面談了這麼多,大家會發現,現在企業級的網站後端其實已經很複雜了。業務量的激增、用戶的需求,導致整個軟件的架構一直在改變。好的軟件架構不光可以滿足當前的業務需要,而且爲未來的擴展打下基礎。至於jvm、jdk、mysql、mysql proxy、tomcat、Spring、TiDB、nginx、Keepalive、zookeeper、solr、fastDFS、docker、hadoop、vmware等軟件,這些都是爲架構服務的,等到真正用的時候學習一些就可以了。當然,使用的時候,可以用java、也可以不用java,這個可以根據自己的情況靈活安排。

 

    另外,關於jvm & jdk可以多說一些,它就是一門編程語言而已,不要神化也不要貶低。和其他很多編程語言一樣,比如lua,它也有lua & luac,其中lua負責運行虛擬機、垃圾回收等動作,而luac負責整個編程語言的編譯。處理好java & javac,如果能多看看jdk源碼,用javap調試一下反彙編代碼,這樣就更好了,對個人發展也大有裨益。

 

    用java學習分佈式,一方面是這方面項目使用的最多、經驗最爲豐富,另外一方面也是因爲java語言本身使用的最爲廣泛、工具最多。大家可以根據自己的情況,一步一步去學習就可以了。從軟件架構來說,java和分佈式這個主題,可以給大家帶來很多積極和有益的思考。

 

    說到架構,或者軟件框架,這個和os沒有關係,和編譯器、編程語言沒有多大關係。只是有的時候,爲了部署方便,選用一個平臺、一個語言而已。分佈式架構裏面有成功、失敗、超時三個情況,而超時就是最大的問題。所以,如何處理這個超時問題纔是重中之重。當然,很多朋友都聽過cap理論,也就是高可用性、性能、一致性,一般只能三者取其二。現實的情況是高可用性 > 性能 > 一致性,一個簡單的例子就是很多時候我們在前臺提交了數據,需要很久後臺能才刷新出來。

 

    當然,分佈式調試也是一個問題。如果程序運行過程中遇到網絡失敗的問題。這個裏面有可能是客戶端的問題,也可能是調度服務器的問題,Web服務器的問題,消息服務器的問題,微服務的問題,緩存的問題,數據庫的問題,分佈式固然能滿足效率和流量、存儲的需求,但是也會帶來其他需要解決的問題。

 

    此外,大家要知道,高併發、高性能也需要客戶端的配合。至少你不能讓所有的客戶端都連載在一個ip、一個port上,這個不合適吧?當然,客戶端優化也是很重要的一個工作。

 

參考文獻:

    1、分佈式系統的事務處理,https://coolshell.cn/articles/10910.html

    2、學習分佈式系統需要怎樣的知識?,https://www.zhihu.com/question/23645117

 

PS:

    分佈式除了必要的論文和中間件之外,zookeeper & keepalive是最值得學習的兩個開源軟件。

 

 

發佈了558 篇原創文章 · 獲贊 3631 · 訪問量 475萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章